pax_global_header00006660000000000000000000000064115547260400014516gustar00rootroot0000000000000052 comment=be32654eef685993f269f70a5dfe97dd3ca2c925 guile-1.8-1.8.8+1.orig/000077500000000000000000000000001155472604000142405ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/.gitignore000066400000000000000000000016301155472604000162300ustar00rootroot00000000000000*.o *.info *.info-[0-9]* version.texi Makefile Makefile.in .deps .libs autom4te.cache config.sub config.guess config.status config.log config.h guile-readline-config.h *.doc *.x *.lo *.la aclocal.m4 libtool ltmain.sh configure depcomp elisp-comp missing mdate-sh install-sh texinfo.tex *~ ,* BUGS Makefile Makefile.in aclocal.m4 autom4te.cache benchmark-guile check-guile check-guile.log compile confdefs.h config.build-subdirs config.cache config.guess config.h config.h.in config.log config.status config.sub configure conftest conftest.c depcomp elisp-comp guile-*.tar.gz guile-tools install-sh libtool ltconfig ltmain.sh mdate-sh missing mkinstalldirs pre-inst-guile pre-inst-guile-env stamp-h1 guile-procedures.txt guile-config/guile-config guile-readline/guile-readline-config.h guile-readline/guile-readline-config.h.in TAGS guile-1.8.pc libguile/stack-limit-calibration.scm cscope.out cscope.files *.log INSTALL guile-1.8-1.8.8+1.orig/ABOUT-NLS000066400000000000000000002333401155472604000154740ustar00rootroot000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of October 2006. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ GNUnet | [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bison-runtime | | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | [] | gliv | [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | () () [] | gnucash-glossary | [] () | gnuedu | | gnulib | [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () | gramadoir | [] [] | grep | [] [] [] [] [] [] | gretl | | gsasl | | gss | | gst-plugins | [] [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] [] | iso_3166_2 | | iso_4217 | [] | iso_639 | [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | | keytouch-editor | | keytouch-keyboa... | | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] [] | mysecretdiary | [] [] | nano | [] [] [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | | pilot-qof | [] | psmisc | [] | pwdutils | | python | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | silky | | skencil | [] () | sketch | [] () | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] | texinfo | [] [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] | xchat | [] [] [] [] [] [] | xkeyboard-config | | xpad | [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ GNUnet | | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnucash-glossary | [] [] | gnuedu | [] | gnulib | [] [] [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | () () [] () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] [] | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] | libidn | [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] [] | lynx | [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | | silky | [] | skencil | [] [] | sketch | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] [] [] | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52 ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no +-------------------------------------------------+ GNUnet | | a2ps | () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | | cpplib | [] | cryptonit | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] | findutils | [] | flex | [] [] | fslint | [] [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | | gnucash | () () | gnucash-glossary | [] | gnuedu | | gnulib | [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | | gpsdrive | () () () | gramadoir | () | grep | [] [] [] [] | gretl | | gsasl | [] | gss | | gst-plugins | [] | gst-plugins-base | | gst-plugins-good | [] | gstreamer | [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | | hello | [] [] [] [] [] [] | id-utils | [] | impost | | indent | [] [] | iso_3166 | [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] | jpilot | () () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | | libidn | [] [] | lifelines | [] | lilypond | | lingoteach | [] | lynx | [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] | shishi | | silky | [] | skencil | | sketch | | solfege | | soundtracker | | sp | () | stardict | [] [] | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +-------------------------------------------------+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1 nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +------------------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () | gnucash | () [] | gnucash-glossary | [] [] [] | gnuedu | | gnulib | [] [] [] [] [] | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] | gretl | [] | gsasl | [] [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gst-plugins-base | [] | gst-plugins-good | [] [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | [] | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | [] | psmisc | [] [] | pwdutils | [] [] | python | | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | stardict | [] [] [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] | xpad | [] [] [] | +------------------------------------------------------+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ GNUnet | [] | 2 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 15 bash | [] | 11 batchelor | [] [] | 9 bfd | | 1 bibshelf | [] | 7 binutils | [] [] [] | 9 bison | [] [] [] | 19 bison-runtime | [] [] [] | 15 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 6 console-tools | [] [] | 5 coreutils | [] [] | 16 cpio | [] [] [] | 9 cpplib | [] [] [] [] | 11 cryptonit | | 5 darkstat | [] () () | 15 dialog | [] [] [] [] [] | 30 diffutils | [] [] [] [] | 28 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 error | [] [] [] [] | 18 fetchmail | [] [] | 12 fileutils | [] [] [] | 18 findutils | [] [] [] | 17 flex | [] [] | 15 fslint | [] | 9 gas | [] | 3 gawk | [] [] | 15 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] [] | 6 gettext-examples | [] [] [] [] [] [] | 27 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] [] | 12 gip | [] [] | 12 gliv | [] [] | 8 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 15 gnubiff | [] | 1 gnucash | () | 2 gnucash-glossary | [] [] | 9 gnuedu | [] | 2 gnulib | [] [] [] [] [] | 28 gnunet-gtk | | 1 gnutls | | 2 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] | 3 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] | 14 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] | 20 gpe-filemanager | [] | 6 gpe-go | [] [] | 15 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] | 20 gpe-taskmanager | [] [] [] | 20 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] | 7 gphoto2 | [] [] [] [] | 20 gprof | [] [] | 11 gpsdrive | | 4 gramadoir | [] | 7 grep | [] [] [] [] | 34 gretl | | 4 gsasl | [] [] | 8 gss | [] | 5 gst-plugins | [] [] [] | 15 gst-plugins-base | [] [] [] | 9 gst-plugins-good | [] [] [] [] [] | 20 gstreamer | [] [] [] | 17 gtick | [] | 3 gtkam | [] | 13 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 26 gutenprint | | 3 hello | [] [] [] [] [] | 37 id-utils | [] [] | 14 impost | [] | 4 indent | [] [] [] [] | 25 iso_3166 | [] [] [] [] | 16 iso_3166_2 | | 2 iso_4217 | [] [] | 14 iso_639 | [] | 14 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] | 12 keytouch | [] | 4 keytouch-editor | | 2 keytouch-keyboa... | [] | 3 latrine | [] [] | 8 ld | [] [] [] [] | 8 leafpad | [] [] [] [] | 23 libc | [] [] [] | 23 libexif | [] | 4 libextractor | [] | 5 libgpewidget | [] [] [] | 19 libgpg-error | [] | 4 libgphoto2 | [] | 8 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] | 7 libidn | [] [] | 10 lifelines | | 4 lilypond | | 2 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailutils | [] | 8 make | [] [] [] | 20 man-db | [] | 6 minicom | [] | 14 mysecretdiary | [] [] | 12 nano | [] [] | 17 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 10 parted | [] [] [] | 10 pilot-qof | [] | 3 psmisc | [] | 10 pwdutils | [] | 3 python | | 0 qof | [] | 4 radius | [] | 6 recode | [] [] [] | 25 rpm | [] [] [] [] | 14 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] | 22 sh-utils | [] | 15 shared-mime-info | [] [] [] [] | 24 sharutils | [] [] [] | 23 shishi | | 1 silky | [] | 4 skencil | [] | 7 sketch | | 6 solfege | | 2 soundtracker | [] [] | 9 sp | [] | 3 stardict | [] [] [] [] | 11 system-tools-ba... | [] [] [] [] [] [] [] | 37 tar | [] [] [] [] | 20 texinfo | [] [] [] | 15 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 10 tuxpaint | [] [] [] | 16 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 vorbis-tools | [] [] | 11 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] [] | 19 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] [] | 11 xpad | [] [] [] | 14 +---------------------------------------------------+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If October 2006 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. guile-1.8-1.8.8+1.orig/ANNOUNCE000066400000000000000000000036001155472604000153700ustar00rootroot00000000000000We are pleased to announce the release of Guile 1.8.0. It can be found here: ftp://ftp.gnu.org/gnu/guile/guile-1.8.0.tar.gz Its SHA1 checksum is 22462680feeda1e5400195c01dee666162503d66 guile-1.8.0.tar.gz We already know about some issues with 1.8.0, please check the mailing lists: http://www.gnu.org/software/guile/mail/mail.html The NEWS file is quite long. Here are the most interesting entries: Changes since 1.6: * Guile is now licensed with the GNU Lesser General Public License. * The manual is now licensed with the GNU Free Documentation License. * We now use GNU MP for bignums. * We now have exact rationals, such as 1/3. * We now use native POSIX threads for real concurrent threads. * There is a new way to initalize Guile that allows one to use Guile from threads that have not been created by Guile. * Mutexes and condition variables are now always fair. A recursive mutex must be requested explicitly. * The low-level thread API has been removed. * There is now support for copy-on-write substrings and mutation-sharing substrings. * A new family of functions for converting between C values and Scheme values has been added that is future-proof and thread-safe. * The INUM macros like SCM_MAKINUM have been deprecated. * The macros SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_LENGTH, SCM_SYMBOL_CHARS, and SCM_SYMBOL_LENGTH have been deprecated. * There is a new way to deal with non-local exits and re-entries in C code, which is nicer than scm_internal_dynamic_wind. * There are new malloc-like functions that work better than scm_must_malloc, etc. * There is a new way to access all kinds of vectors and arrays from C that is efficient and thread-safe. * The concept of dynamic roots has been factored into continuation barriers and dynamic states. See NEWS and the manual for more details. guile-1.8-1.8.8+1.orig/AUTHORS000066400000000000000000000315761155472604000153240ustar00rootroot00000000000000To find out what should go in this file, see "Information For Maintainers of GNU Software" (maintain.texi), the section called "Recording Changes". Aubrey Jaffer: is the author of SCM, the Scheme interpreter upon which Guile is based. Guile started from SCM version 4e1 in November -94 and is still largely composed of the original SCM code. George Carrette: wrote files present in Siod version 2.3, released in December of 1989. Siod was the starting point for SCM. The major innovations taken from Siod are the evaluator's use of the C-stack and being able to garbage collect off the C-stack Radey Shouman: In the subdirectory libguile, wrote: gsubr.c ramap.c unif.c gsubr.h ramap.h unif.h Gary Houston: In the subdirectory libguile, wrote: rw.c In the subdirectory ice-9, wrote: expect.scm networking.scm popen.scm posix.scm rw.scm In the subdirectory doc, changes to: data-rep.texi expect.texi guile-tut.texi posix.texi r5rs.texi scheme-io.texi Many other changes throughout. Jim Blandy: Many changes throughout. In the subdirectory libguile, wrote: script.c (partially) In the subdirectory doc, wrote: data-rep.texi env.texi mbapi.texi mltext.texi hacks.el In the subdirectory doc/example-smob, wrote: image-type.c image-type.h myguile.c Tom Lord: Many changes throughout. In the subdirectory ice-9, wrote: Makefile.in configure.in lineio.scm poe.scm boot-9.scm hcons.scm mapping.scm Anthony Green: wrote the following files in libguile: coop-defs.h coop-threads.h fsu-pthreads.h mit-pthreads.h threads.h coop-threads.c coop.c mit-pthreads.c threads.c and ice-9/threads.scm. Mikael Djurfeldt: In the subdirectory ice-9, wrote: documentation.scm emacs.scm stack-catch.scm null.scm r5rs.scm safe-r5rs.scm safe.scm receive.scm occam-channel.scm syncase.scm In the subdirectory ice-9, changes to: boot-9.scm psyntax.ss slib.scm threads.scm In the subdirectory oop, wrote: goops.scm In the subdirectory oop/goops, wrote: compile.scm dispatch.scm internal.scm old-define-method.scm save.scm stklos.scm util.scm In the subdirectory oop/goops, rewrote files from STKlos: active-slot.scm composite-slot.scm describe.scm In the subdirectory libguile, wrote: backtrace.c debug.c options.c root.c srcprop.c stacks.c backtrace.h debug.h options.h root.h srcprop.h stacks.h iselect.c gdbint.c objects.c objprop.c stackchk.c modules.c iselect.h gdbint.h objects.h objprop.h stackchk.h modules.h random.c futures.c evalext.c goops.c hooks.c macros.c random.h futures.h evalext.h goops.h hooks.h macros.h gdb_interface.h In the subdirectory libguile, rewrote: coop-threads.c coop.c mit-pthreads.c threads.c print.c coop-threads.h fsu-pthreads.h mit-pthreads.h threads.h print.h In the subdirectory srfi, wrote: srfi.c srfi.h In the subdirectory doc, wrote: goops-tutorial.texi hierarchy.eps hierarchy.txt mop.txt oldfmt.c In the subdirectory doc, changes to: data-rep.texi gh.texi goops.texi Many other changes throughout. Mark Galassi: Designed and implemented the high-level libguile API (the @code{gh_} interface), based largely on the defunct @code{gscm_} interface. In the subdirectory libguile, wrote: gh.h gh_funcs.c gh_list.c gh_test_repl.c gh_data.c gh_init.c gh_predicates.c gh_eval.c gh_io.c gh_test_c.c In the subdirectory doc, wrote: appendices.texi gh.texi guile-tut.texi Marius Vollmer: Many changes throughout. In the subdirectory libguile, wrote: fluids.c fluids.h extensions.h deprecation.h deprecation.c extensions.c In the subdirectory libguile, rewrote: dynl.c dynl-dl.c dynl-shl.c dynl.h dynl-dld.c In the subdirectory doc, changes to: data-rep.texi intro.texi posix.texi scheme-modules.texi In the subdirectory ice-9, wrote and-let-star-compat.scm R. Kent Dybvig: In the subdirectory ice-9, wrote: psyntax.ss Roland Orre: In the subdirectory libguile, wrote: sort.c sort.h In the subdirectory ice-9, wrote: session.scm Michael Livshin: Some changes throughout. Implemented support for double-word heap cells and converted some smobs to use them. In the subdirectory libguile, wrote: guardians.c guardians.h filter-doc-snarfage.c guile-snarf-docs.in guile-snarf-docs-texi.in In the subdirectory libguile, changed extensively: gc.c gc.h In the subdirectory ice-9, wrote: streams.scm and-let*.scm In the subdirectory scripts, wrote: snarf-check-and-output-texi Tim Pierce: In the subdirectory libguile, wrote: regex-posix.c regex-posix.h In the subdirectory doc, changes to: appendices.texi posix.texi Rob Browning: wrote initial srfi/srfi-2.scm. wrote initial srfi/srfi-6.scm. wrote initial srfi/srfi-8.scm. wrote initial srfi/srfi-11.scm. ported srfi/srfi-19.scm to Guile. and many other changes throughout. Martin Grabmueller: In the subdirectory libguile, changes to: backtrace.c eval.c strorder.c script.c strop.c strop.h struct.c macros.c numbers.c posix.h posix.c symbols.c gh_data.c strports.h strports.c validate.h read.c and many docstrings changes throughout. In the subdirectory srfi, wrote: srfi-1.scm srfi-9.scm srfi-10.scm srfi-13.scm srfi-14.scm srfi-13.c srfi-14.c srfi-13.h srfi-14.h srfi-16.scm srfi-4.c srfi-4.h srfi-4.scm In the subdirectory scripts, wrote: doc-snarf In the subdirectory doc, wrote: script-getopt.texi srfi-modules.texi repl-modules.texi misc-modules.texi In the subdirectory doc, changes to: guile.texi intro.texi posix.texi scheme-binding.texi scheme-control.texi scheme-data.texi scheme-evaluation.texi scheme-indices.texi scheme-io.texi scheme-memory.texi scheme-modules.texi scheme-options.texi scheme-procedures.texi scheme-scheduling.texi scheme-utility.texi In the subdirectory example, wrote scripts modules safe box box-module box-dynamic In the subdirectory test-suite/tests, wrote: srfi-4.test srfi-9.test srfi-10.test srfi-13.test Will Fitzgerald: wrote initial srfi/srfi-19.scm. Jost Boekemeier: In the subdirectory libguile, wrote: environments.c, environments.h Dirk Herrmann: In the subdirectory doc, changes to: data-rep.texi, scm.texi In the subdirectory libguile, rewrote: environments.c, environments.h In the subdirectory libguile, changes to: error.c, gc.c, gc.h, numbers.c, strings.c, symbols.c In the subdirectory test-suite, rewrote: lib.scm In the subdirectory test-suite/tests, wrote: bit-operations.test, common-list.test, environments.test, eval.test, gc.test, list.test, numbers.test, symbols.test, syntax.test Many other changes throughout. Greg Badros: In the subdirectory doc, changes to: data-rep.texi Many changes throughout. Neil Jerram: In the subdirectory ice-9, wrote: buffered-input.scm In the subdirectory doc, wrote: deprecated.texi goops.texi scheme-ideas.texi scheme-reading.texi In the subdirectory doc, changes to: appendices.texi data-rep.texi expect.texi extend.texi gh.texi guile-tut.texi guile.texi indices.texi intro.texi posix.texi preface.texi r5rs.texi scheme-binding.texi scheme-modules.texi scheme-control.texi scheme-data.texi scheme-debug.texi scheme-evaluation.texi scheme-ideas.texi scheme-indices.texi scheme-intro.texi scheme-io.texi scheme-memory.texi scheme-options.texi scheme-procedures.texi scheme-scheduling.texi scheme-translation.texi scheme-utility.texi scm.texi scripts.texi script-getopt.texi In the subdirectory doc/maint, wrote: docstring.el Thien-Thi Nguyen: In the top-level directory, wrote: check-guile.in guile-tools.in In the subdirectory ice-9, changes to: boot-9.scm documentation.scm emacs.scm ls.scm session.scm string-fun.scm threads.scm getopt-long.scm In the subdirectory scripts, wrote: Makefile.am PROGRAM display-commentary generate-autoload punify read-scheme-source use2dot In the subdirectory scripts, changes to: doc-snarf In the subdirectory libguile, changes to: guile-doc-snarf.in regex-posix.c In the subdirectory doc, changes to: intro.texi preface.texi scheme-modules.texi scheme-procedures.texi scheme-scheduling.texi In the subdirectory test-suite, changes to: guile-test lib.scm In the subdirectory test-suite/tests, wrote: exceptions.test getopt-long.test In the subdirectory test-suite/tests, changes to: eval.test Robert Merkel: In the subdirectory doc, co-wrote: guile.1 Marc Feeley: In the subdirectory doc, wrote: pretty-print.scm Matthias Koeppe: In the subdirectory test-suite/tests, wrote: format.test, srfi-19.test, optargs.test In the subdirectory test-suite/tests, changes to: ports.test The file libguile/gc_os_dep.c is from the Boehm-Weiser conservative collector. A lot of people have contributed to it, but probably not all to the code in gc_os_dep.c: The SPARC specific code was contributed by Mark Weiser (weiser@parc.xerox.com). The Encore Multimax modifications were supplied by Kevin Kenny (kenny@m.cs.uiuc.edu). The adaptation to the RT is largely due to Vernon Lee (scorpion@rice.edu), on machines made available by IBM. Much of the HP specific code and a number of good suggestions for improving the generic code are due to Walter Underwood (wunder@hp-ses.sde.hp.com). Robert Brazile (brazile@diamond.bbn.com) originally supplied the ULTRIX code. Al Dosser (dosser@src.dec.com) and Regis Cridlig (Regis.Cridlig@cl.cam.ac.uk) subsequently provided updates and information on variation between ULTRIX systems. Parag Patel (parag@netcom.com) supplied the A/UX code. Jesper Peterson(jep@mtiame.mtia.oz.au), Michel Schinz, and Martin Tauchmann (martintauchmann@bigfoot.com) supplied the Amiga port. Thomas Funke (thf@zelator.in-berlin.de(?)) and Brian D.Carlstrom (bdc@clark.lcs.mit.edu) supplied the NeXT ports. Douglas Steel (doug@wg.icl.co.uk) provided ICL DRS6000 code. Bill Janssen (janssen@parc.xerox.com) supplied the SunOS dynamic loader specific code. Manuel Serrano (serrano@cornas.inria.fr) supplied linux and Sony News specific code. Al Dosser provided Alpha/OSF/1 code. He and Dave Detlefs(detlefs@src.dec.com) also provided several generic bug fixes. Alistair G. Crooks(agc@uts.amdahl.com) supplied the NetBSD and 386BSD ports. Jeffrey Hsu (hsu@soda.berkeley.edu) provided the FreeBSD port. Brent Benson (brent@jade.ssd.csd.harris.com) ported the collector to a Motorola 88K processor running CX/UX (Harris NightHawk). Ari Huttunen (Ari.Huttunen@hut.fi) generalized the OS/2 port to nonIBM development environments (a nontrivial task). Patrick Beard (beard@cs.ucdavis.edu) provided the initial MacOS port. David Chase, then at Olivetti Research, suggested several improvements. Scott Schwartz (schwartz@groucho.cse.psu.edu) supplied some of the code to save and print call stacks for leak detection on a SPARC. Jesse Hull and John Ellis supplied the C++ interface code. Zhong Shao performed much of the experimentation that led to the current typed allocation facility. (His dynamic type inference code hasn't made it into the released version of the collector, yet.) (Blame for misinstallation of these modifications goes to the first author, however.) Keisuke Nishida: [added by ttn; kei, please review] In the top-level directory, changes to: libguile.h In the subdirectory ice-9, wrote: channel.scm history.scm time.scm match.scm In the subdirectory ice-9, changes to: boot-9.scm receive.scm safe-r5rs.scm common-list.scm In the subdirectory emacs, wrote: guile.el guile-scheme.el guile-emacs.scm In the subdirectory libguile, changes to: goops.c vectors.h vectors.c eval.c hashtab.h hashtab.c environments.c smob.h smob.c keywords.c list.c strports.c tag.c Makefile.am guile-snarf.awk.in Many other changes throughout. Stefan Jahn: In the subdirectory libguile, changes to: continuations.h continuations.c gc.c John W. Eaton, based on code from AT&T Bell Laboratories and Bellcore: The complex number division method in libguile/numbers.c. Gregory Marton: In the subdirectory test-suite/tests, changes to: hash.test guile-1.8-1.8.8+1.orig/COPYING.LESSER000066400000000000000000000635001155472604000162730ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! guile-1.8-1.8.8+1.orig/ChangeLog000066400000000000000000000010261155472604000160110ustar00rootroot00000000000000-*- text -*- Starting from September 1st, 2008, the Guile project no longer stores change logs in `ChangeLog' files. Instead, changes are detailed in the version control system's logs. They can be seen by downloading a copy of the Git repository: $ git clone git://git.sv.gnu.org/guile.git $ git whatchanged Alternatively, they can be seen on the web, using the Gitweb interface at: http://git.sv.gnu.org/gitweb/?p=guile.git Change logs up to September 1st, 2008, are still available in the files named `ChangeLog-2008'. guile-1.8-1.8.8+1.orig/ChangeLog-2008000066400000000000000000003213401155472604000164040ustar00rootroot000000000000002008-08-20 Ludovic Courtès * configure.in: Use `AC_USE_SYSTEM_EXTENSIONS' instead of the obsolete `AC_AIX', `AC_ISC_POSIX' and `AC_MINIX'. As a side effect, this will define `_POSIX_PTHREAD_SEMANTICS' on Solaris, which provides a standard-conforming version of `readdir_r ()' for instance; it also allows the use of Autoconf 2.62. 2008-08-14 Ludovic Courtès * configure.in: Remove incorrect and pointless `AC_CONFIG_MACRO_DIR' invocation. Reported as Gentoo bug #220339. 2008-08-07 Neil Jerram * configure.in (SCM_I_GSC_STACK_GROWS_UP): Remove use of AC_CACHE_CHECK, which was inadvertently causing SCM_I_GSC_STACK_GROWS_UP _always_ to be 0. 2008-07-17 Neil Jerram * configure.in: Update stack direction test to be like that in Autoconf _AC_LIBOBJ_ALLOCA and Gnulib; specifically in involving a function calling itself. 2008-07-16 Ludovic Courtès * configure.in: Look for `struct dirent64' and `readdir64_r ()', not available on HP-UX 11.11. 2008-07-06 Ludovic Courtès * configure.in: Update to Autoconf 2.61. 2008-06-28 Ludovic Courtès * configure.in: Use Automake with `-Wall -Wno-override'. 2008-05-07 Ludovic Courtès Guile 1.8.5 released. * GUILE-VERSION (LIBGUILE_INTERFACE_CURRENT): Increment due to the addition of an inlined version of `scm getc ()' and friends. (LIBGUILE_INTERFACE_AGE): Increment. (LIBGUILE_INTERFACE_REVISION): Zeroed. (LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION): Increment. 2008-05-04 Ludovic Courtès Add `pkg-config' support. Suggested by Aaron VanDevender, Greg Troxel, and others. * configure.in: Substitute `sitedir', produce `guile-1.8.pc'. * Makefile.am (EXTRA_DIST): Add `guile-1.8.pc.in'. (pkgconfigdir, pkgconfig_DATA): New. 2008-04-26 Ludovic Courtès * configure.in (BUILD_PTHREAD_SUPPORT): New Automake conditional. 2008-04-26 Ludovic Courtès * Makefile.am (EXTRA_DIST): Remove `ANON-CVS' and `SNAPSHOTS'. 2008-03-12 Neil Jerram * configure.in (AC_CONFIG_FILES): Add emacs/Makefile and ice-9/debugging/Makefile. * Makefile.am (SUBDIRS): Add emacs. 2008-02-23 Neil Jerram * FAQ: New file. * Makefile.am (EXTRA_DIST): Add FAQ 2008-02-22 Ludovic Courtès * configure.in: Check whether `strncasecmp' is declared. 2008-02-16 Ludovic Courtès Guile 1.8.4 released. * GUILE-VERSION (LIBGUILE_INTERFACE_REVISION): Increment. (GUILE_MICRO_VERSION): Increment. * configure.in (GUILE_CFLAGS): Include `$CPPFLAGS' since they may include required `-I' flags (e.g., `-I/path/to/gmp'), so that "guile-config compile" reports all the needed flags. 2008-02-15 Neil Jerram * autogen.sh: Copy versions of config.guess and config.sub from Guile CVS to build-aux and guile-readline. 2008-02-14 Neil Jerram * HACKING: Note need for libtool >= 1.5.26. * config.rpath, build-aux/config.rpath: Updated to latest upstream version. * config.guess, config.sub: 2008-01-07 versions added to Guile CVS, to ensure that Guile developers are using new enough versions (in particular for AIX 6.1 support). 2008-02-11 Neil Jerram * configure.in (--without-64-calls): Use AC_MSG_CHECKING and AC_MSG_RESULT instead of just echo. (GUILE_I): New programs to try using _Complex_I or 1.0fi for the imaginary unit. 2008-02-06 Neil Jerram * configure.in: Default to --without-64-calls for powerpc-ibm-aix*. Thanks to Rainer Tammer for reporting that the 64 calls are a problem on that OS. 2008-02-06 Ludovic Courtès * NEWS: Mention Sun Studio compilation fix. 2008-02-05 Neil Jerram * configure.in (--without-64-calls): New option. 2008-01-30 Neil Jerram * pre-inst-guile.in (dyld_prefix), pre-inst-guile-env.in (dyld_prefix): Construct and export dyld_prefix in a similar way to ltdl_prefix, to allow pre-install dynamic linking to work on MacOS. Thanks to Roger Mc Murtrie for reporting this problem. 2008-01-22 Neil Jerram * README: Should say version 1.8.3, not 1.8.2. * LICENSE: Change COPYING.LIB to COPYING.LESSER. * COPYING.LESSER: Renamed, previously COPYING.LIB. * COPYING: Removed. * libguile.h: Update copyright statement to LGPL. 2007-12-04 Ludovic Courtès * NEWS: Mention `accept' and `scm_c_{read,write}' bug fixes. 2007-12-03 Ludovic Courtès * NEWS: Add SRFI-69. 2007-10-17 Ludovic Courtès * NEWS: Mention reader bug-fix. 2007-10-16 Ludovic Courtès Guile 1.8.3 released. * GUILE-VERSION (GUILE_MICRO_VERSION): Incremented. (LIBGUILE_INTERFACE_REVISION): Incremented. 2007-10-10 Ludovic Courtès * configure.in (SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT): New substituted variable. Use `-Werror' when using GCC and checking for `PTHREAD_ONCE_INIT'. Add check for braces around `PTHREAD_MUTEX_INITIALIZER'. * NEWS: Mention build fix for IRIX. 2007-10-02 Ludovic Courtès * NEWS: Mention `(ice-9 slib)' fix and threading fix. 2007-09-03 Ludovic Courtès * NEWS: Mention alignment-related bug fixes. 2007-09-03 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add clog and cexp. 2007-09-02 Ludovic Courtès * NEWS: Mention memory leak fix in `make-socket-address'. 2007-09-01 Ludovic Courtès * NEWS: Mention duplicate binding warnings to stderr. 2007-08-23 Ludovic Courtès * NEWS: Mention Solaris bug fixes. 2007-08-11 Ludovic Courtès * NEWS: Mention SRFI-35 and the new reader. * configure.in: Check for and `strncasecmp ()'. 2007-08-08 Ludovic Courtès * NEWS: Mention changes to `record-accessor' and `record-modifier'. 2007-08-03 Ludovic Courtès * configure.in: Use `build-aux' as `AC_CONFIG_AUX_DIR', and `m4' as `AC_CONFIG_MACRO_DIR'. Use Automake's `gnu' and `check-news' options. 2007-07-25 Ludovic Courtès * NEWS: Mention bug fix for "(set! 'x #f)". 2007-07-18 Ludovic Courtès * NEWS: Mention SRFI-37. 2007-07-15 Ludovic Courtès Guile 1.8.2 released. * NEWS: Mention HP-UX/IA64 build fixes. * THANKS: Added people who reported bugs or sent patches since 1.8.1. Converted to UTF-8. * README: Updated version number. * Makefile.am (EXTRA_DIST): Removed `BUGS' (was outdated). * ANON-CVS, HACKING, SNAPSHOTS: New, from the `workbook' directory of the CVS repository. * autogen.sh: Removed dependency on the `workbook' CVS directory. * GUILE-VERSION (GUILE_MICRO_VERSION): Set to 2. (LIBGUILE_INTERFACE_CURRENT): Incremented due to new symbols. (LIBGUILE_INTERFACE_REVISION): Set to 0. (LIBGUILE_INTERFACE_AGE): Incremented. (LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION): Incremented due to bug fixes. 2007-07-11 Ludovic Courtès * NEWS: Mention GOOPS `method-more-specific?' bug fix. 2007-07-09 Ludovic Courtès * NEWS: Mention SRFI-19 `date->julian-day' bug fix. 2007-06-26 Ludovic Courtès * NEWS: Mention fixed memory leaks. 2007-06-13 Ludovic Courtès * NEWS: Mention top-level define incompatible change. 2007-06-12 Ludovic Courtès * NEWS: Mention `inet-ntop' bug fix. 2007-05-09 Ludovic Courtès * NEWS: Mention SRFI-19 `time-process' bug fix. 2007-02-20 Neil Jerram * config.rpath (Module): New (from gettext package). * INSTALL: New upstream version. * ABOUT-NLS: New upstream version. 2007-01-28 Neil Jerram IA64 HP-UX patch from Hrvoje NikÅ¡ić. (Thanks!) * configure.in: New check for uca lib (needed for IA64 on HP-UX). 2007-01-23 Kevin Ryde * configure.in (isinf, isnan): Use a volatile global to stop gcc optimizing out the test. In particular this fixes solaris where there isn't an isinf or isnan (though gcc still optimizes as if there is). Reported by Hugh Sasse. (AC_C_VOLATILE): New. 2007-01-22 Kevin Ryde * configure.in (AC_INIT): Don't use "echo -n", it's not portable and in particular fails on solaris (resulting in literal "-n"s going into the output, making the resulting configure unusable). Reported by Hugh Sasse. 2006-12-27 Kevin Ryde * configure.in (pthread_get_stackaddr_np, pthread_sigmask): New tests. 2006-12-24 Han-Wen Nienhuys * autogen.sh (mscripts): only execute render-bugs if it exists. 2006-12-23 Kevin Ryde * configure.in (-lm): No need to suppress libm on mingw, it's not needed because it's empty, but including it does no harm. (-lm): Look for "cos" instead of "main", since cos and friends are the purpose of looking for libm. (winsock etc): Test $host = *-*-mingw* rather than $MINGW32, autoconf regards the latter as obsolete. (AC_MINGW32): Remove test, $MINGW32 now unused. (uint32_t): Look at HAVE_NETDB_H rather than hard-coding __MINGW32__ in the test program. 2006-12-15 Kevin Ryde * configure.in (process.h, pipe, _pipe): New checks. 2006-12-14 Kevin Ryde * configure.in (struct timespec, pthread.h): Look for struct timespec in as well as , it's in pthread.h on mingw. Reported by Nils Durner. 2006-12-03 Kevin Ryde * Makefile.am (AUTOMAKE_OPTIONS): Bump to automake 1.10 required, so that config.rpath from gettext will go into the dist (and give an error if not). * configure.in (AM_PROG_CC_C_O): New macro, needed by automake 1.10 for per-target cflags in libguile/Makefile.am. 2006-11-08 Ludovic Courtès * configure.in: Pass `bug-guile@gnu.org' as a third argument to `AC_INIT'. 2006-10-06 Rob Browning Guile 1.8.1 released. * GUILE-VERSION (GUILE_MICRO_VERSION): Increment for release. (LIBGUILE_INTERFACE_REVISION): Increment for release. (LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION): Increment for release. (LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION): Increment for release. (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION): Increment for release. (LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION): Increment for release. * Makefile.am (EXTRA_DIST): Add LICENSE. 2006-09-28 Kevin Ryde * configure.in (chsize, ftruncate, truncate): New tests, for mingw. 2006-09-27 Kevin Ryde * configure.in (clog10): New test, not in mingw. 2006-09-23 Kevin Ryde * configure.in (complex.h, complex double, csqrt): New tests. 2006-09-20 Ludovic Courtès * configure.in: Check for `isblank ()'. * NEWS: Mentioned the interaction between `setlocale' and SRFI-14 standard char sets. 2006-08-22 Kevin Ryde * configure.in: Test if need braces around PTHREAD_ONCE_INIT, set AC_OUTPUT of SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT. 2006-07-25 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add pthread_getattr_np. 2006-07-24 Kevin Ryde * configure.in (AC_CHECK_DECLS): Add sethostname for Solaris 10. (AC_CHECK_FUNCS): Remove dirfd, it's a macro. Reported by Claes Wallin. 2006-06-25 Kevin Ryde * configure.in (AC_CHECK_MEMBERS): Test struct tm.tm_gmtoff. 2006-06-13 Ludovic Courtès * NEWS: Mentioned the new behavior of `equal?' for structures. 2006-06-06 Neil Jerram * acinclude.m4 (ACX_PTHREAD): Update to latest definition from autoconf macro archive, to fix pthread linking problem on Solaris 10, reported by Charles Gagnon. 2006-05-28 Kevin Ryde * configure.in (isnan): Remove "#ifdef __MINGW32__, #define isnan _isnan". Mingw provides isnan as a macro (in math.h), the test already detects it just fine with no special case. 2006-05-26 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add ioctl. (pthread_attr_getstack): Restrict test to pthreads case, to avoid AC_TRY_RUN when cross-compiling --without-threads. 2006-05-20 Kevin Ryde * configure.in (S_ISLNK): Remove test, leave it to #ifdef in the .c files. 2006-05-16 Kevin Ryde * configure.in (struct stat st_blocks): Change AC_STRUCT_ST_BLOCKS to a plain AC_CHECK_MEMBERS, we don't want AC_LIBOBJ(fileblocks) which the former gives. Remove the commented-out code that was to have munged fileblocks out of LIBOBJS. This fixes mingw, where the lack of st_blocks and absense of the fileblocks.c replacement caused build failure. Reported by "The Senator". (struct stat st_rdev, st_blksize): Combine into a single AC_CHECK_MEMBERS. 2006-04-18 Rob Browning * configure.in: Add AC_CONFIG_AUX_DIR([.]) as suggested in the autotools documentation. 2006-04-16 Kevin Ryde * configure.in (stat64, off_t): New tests. 2006-03-31 Kevin Ryde * configure.in (socklen_t): Enhance test for this type, coping with need for on MacOS X. Reported by Michael Tuexen and Jay Cotton. 2006-03-26 Marius Vollmer * configure.in: Added check that defines PTHREAD_ATTR_GETSTACK_WORKS when pthread_attr_getstack works for the main thread. 2006-02-26 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add dirfd. 2006-02-20 Marius Vollmer Released 1.8.0. * GUILE-VERSION: Set version. 2006-02-06 Marius Vollmer Branched for 1.8 series. * GUILE-VERSION: Bumped version numbers. * configure.in: Removed --enable-arrays option. 2005-12-14 Neil Jerram * NEWS: Remove entry claiming that breakpoints have been added, because breakpoints are now implemented outside the core distro. Add entries on obsolescence of the 'cheap option and on tweaking support in evaluator trap calls. Finally, correct outline level of item about make-keyword-from-dash-symbol. 2005-07-09 Neil Jerram * configure.in (AC_CONFIG_FILES): Removed emacs/Makefile and ice-9/debugger/breakpoints/Makefile. * Makefile.am (SUBDIRS): Removed emacs. 2005-06-05 Marius Vollmer From Jan Nieuwenhuizen . Thanks! * configure.in: Add tests for socklen_t and ip_mreq. 2005-03-13 Kevin Ryde * configure.in, GUILE-VERSION (LIBGUILE_SRFI_SRFI_60): New defines. 2005-03-09 Marius Vollmer Guile 1.7.2 has been released. * GUILE-VERSION (GUILE_MICRO_VERSION): Incremented to "2". 2005-03-08 Marius Vollmer libltdl is no longer distributed. We expect it to be installed already. * configure.in: Do not call AC_LIBLTDL_INSTALLABLE. Use AC_CHECK_LIB instead. Do not subst LTDLINCL and LIBLTDL. Do not add "-DLIBLTDL_DLL_IMPORT" on MINGW32. * Makefile.am (SUBDIRS): Removed libltdl. * README: Talk about required external packages. * autogen.sh: Do not call libtoolize. 2005-03-02 Marius Vollmer * configure.in: Do not check for fast or recursive mutexes. Check for pthread_attr_getstack. (SCM_I_GSC_USE_COOP_THREADS): Dot not subst. (pthread_mutexattr_settype): Do not check for it. 2005-02-28 Marius Vollmer * autogen.sh: Add '--verbose' option to autoreconf invocation. Thanks to Bruno Haible. 2005-01-02 Marius Vollmer * configure.in (SCM_I_GSC_HAVE_ARRAYS): Removed '--disable-arrays' option. 2004-11-28 Kevin Ryde * configure.in (AC_SUBST): Correction, LTDLINC should be LTDLINCL, the latter is what libtool defines. 2004-10-27 Marius Vollmer * libguile.h: Include "libguile/srfi-4.h". 2004-10-25 Marius Vollmer * autogen.sh: Added explicit invocation of libtoolize before autoreconf so that libltdl/ is updated as well. 2004-10-22 Marius Vollmer Removed usage of libguile-ltdl. * configure.in: Call AC_LIBLTDL_INSTALLABLE instead of AC_LIB_LTDL. (AC_CONFIG_SUBDIRS): Added libltdl. (DLPREOPEN, LTDLINC, LIBLTDL): Moved AC_SUBST near other libtool stuff. Also subst LTDLINC instead of INCLTDL. (AC_CONFIG_FILES): Removed libguile-ltdl/Makefile and libguile-ltdl/upstream/Makefile. * Makefile.am (SUBDIRS): Replaced libguile-ltdl with libltdl. 2004-09-28 Marius Vollmer * ABOUT-NLS: New, from gettext 0.14.1. * configure.in: Do use AM_GNU_GETTEXT, since gettextize is not run with autoconf 2.59. 2004-09-25 Marius Vollmer * configure.in: Do not use AM_GNU_GETTEXT for now, it causes gettextize to run during autogen.sh, which we do not want. Explicitely check for libintl, gettext, bindtextdomain, and textdomain instead. 2004-09-24 Marius Vollmer * libguile.h: Include outside of extern "C" block. (Note that numbers.h still includes gmp.h to make it self-contained.) * configure.in: Do not include PTHREAD_CFLAGS in CFLAGS, CFLAGS is for the user and is often overwritten temporarily. (GUILE_CFLAGS): New, include PTHREAD_CFLAGS here. (GUILE_LIBS): Remove THREAD_LIBS_INSTALLED, which is unused now. 2004-09-22 Marius Vollmer * configure.in: Add AM_GNU_GETTEXT invocation. From Bruno Haible. 2004-09-21 Marius Vollmer * acinclude.m4 (ACX_PTHREAD): New. * configure.in: Use it instead of simply looking for -lpthread. Thanks to Andreas Vögele! 2004-09-08 Marius Vollmer * configure.in: Fail when alloca can not be found natively. 2004-09-03 Stefan Jahn * configure.in (isinf): Let configure find the isinf() function on MinGW32 systems. 2004-08-27 Kevin Ryde * configure.in (AC_CHECK_MEMBERS): Add struct sockaddr.sin_len and struct sockaddr_in6.sin6_len. Reported by Michael Tuexen. 2004-08-27 Marius Vollmer Guile 1.7.1 as been released. 2004-08-26 Marius Vollmer * GUILE-VERSION: Bumped all versions for the 1.7.1 release. Added LIBGUILE_*_MAJOR variables for inclusion in the names of shared libraries such as "libguile-srfi-srfi-1-v-MAJOR.la". Removed LIBQTHREADS_*. * configure.in: Updated for the new set of variables defined in GUILE-VERSION. 2004-08-25 Marius Vollmer * libguile.h: Include srfi-13.h and srfi-14.h, do not include strop.h. 2004-08-02 Marius Vollmer * README: Document the new --disable-discouraged option. * configure.in (SCM_I_GSC_ENABLE_DISCOURAGED): New, for the new --enable-discouraged option. * libguile.h: Include libguile/discouraged.h. 2004-07-29 Marius Vollmer * configure.in: Bugfix: logic in detecting ptrdiff_t was inverted; assume ptrdiff_t is available when its size is non-zero, not when it is zero. Do no longer define SCM_I_GSC_*_LIMITS macros. Check for sizes of size_t and intmax_t. 2004-07-09 Marius Vollmer * configure.in: Bugfix: set SCM_I_GSC_T_UINTMAX, not SCM_I_GSC_T_INTMAX in two places. Thanks to Andreas Vögele! 2004-07-07 Marius Vollmer * configure.in: When checking for suitable types for scm_t_int8, etc, try int8_t first, so that we pick them up when they are defined. Also, substitute limit macros like INT8_MIN into the configure header for all these types. 2004-07-05 Kevin Ryde * configure.in (isinf, isnan): Detect macro versions as well as functions, since C99 specifies them as macros and that's all HP-UX has. Reported by Andreas Voegele. 2004-06-28 Marius Vollmer * configure.in: Removed code for --enable-htmldoc; support for HTML is now included in automake. 2004-06-16 Rob Browning * pre-inst-guile.in: modify to handle move of readline.scm to ice-9 subdir of guile-readline. * pre-inst-guile-env.in: modify to handle move of readline.scm to ice-9 subdir of guile-readline. * configure.in: move package and version args to AC_INIT as is now recommended. This also requires m4_esyscmd to read GUILE-VERSION given the way AC_INIT handles its args. 2004-04-22 Kevin Ryde * configure.in (AC_CHECK_HEADERS): Add fenv.h. (AC_CHECK_FUNCS): Add fesetround. 2004-04-18 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add readdir_r. 2004-03-23 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add sysconf. (AC_CHECK_HEADERS): Add netdb.h and sys/param.h. 2004-03-21 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add gmtime_r. 2004-03-14 Kevin Ryde * configure.in (strptime): Use #define _GNU_SOURCE to get the prototype from glibc, use AC_CHECK_DECLS rather than AC_EGREP_HEADER. 2004-02-29 Kevin Ryde * configure.in: Use AC_COPYRIGHT and AH_TOP to get copyright notice into generated configure and config.h.in. * configure.in (AC_CHECK_FUNCS): Add DINFINITY and DQNAN. 2004-02-21 Kevin Ryde * configure.in (crypt): Test with AC_SEARCH_LIBS, for the benefit of HP-UX. Define HAVE_CRYPT rather than HAVE_LIBCRYPT. Reported by Andreas Voegele. 2004-02-18 Kevin Ryde * configure.in (AC_CHECK_HEADERS): Add crt_externs.h. (AC_CHECK_FUNCS): Add _NSGetEnviron. 2004-02-15 Mikael Djurfeldt * configure.in: Use AC_PROG_LIBTOOL instead of AM_PROG_LIBTOOL. 2004-01-25 Neil Jerram * configure.in (GUILE_FUNC_DECLARED), acinclude.m4 (GUILE_STRUCT_UTIMBUF, GUILE_NAMED_CHECK_FUNC): Correctly quote macros being defined. 2003-12-26 Marius Vollmer * configure.in: Find a suitable type for the new scm_t_intmax and scm_t_uintmax. 2003-11-17 Rob Browning * configure.in: rewrite ALLOCA related code as multiple lines so it doesn't break with current autoconf substitutions. 2003-11-15 Kevin Ryde * configure.in (--with-guile-for-build): Remove this option, it's not normal style for --with. (GUILE_FOR_BUILD): Use AC_ARG_VAR. * README (Cross building Guile): Describe GUILE_FOR_BUILD rather than --with-guile-for-build. 2003-11-11 Neil Jerram * .cvsignore: Add elisp-comp. 2003-10-30 Neil Jerram * configure.in (AC_CONFIG_FILES): Add `emacs/Makefile'. (AM_PATH_LISPDIR): Added. * Makefile.am (SUBDIRS): Add `emacs'. 2003-07-27 Marius Vollmer * configure.in: Look for sched_yield in -lrt; this is needed for Solaris. Thanks to Matthias Koeppe! (setgroups): Check for it. * configure.in (__libc_stack_end): Actually use the value in __libc_stack_end for something so that the access doesn't get optimized away. Thanks to Matthias Koeppe! 2003-07-08 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add sincos. 2003-06-21 Kevin Ryde * configure.in (AC_CHECK_FUNCS): Add asinh, acosh, atanh and trunc. 2003-06-19 Marius Vollmer * configure.in: use "-Werror" only with GCC. Thanks to Matthias Koeppe! 2003-06-19 Kevin Ryde * README (Guile Documentation): Update to manuals now available, remove notes about the reference manual being in progress. 2003-06-14 Stefan Jahn * configure.in: Checking for __int64 as possible candidate for the SCM_I_GSC_T_INT64 define. 2003-05-30 Stefan Jahn * configure.in: Checking for unsetenv(). 2003-05-29 Stefan Jahn * configure.in: Removed -lm check and added a cached check for __libc_stack_end to get it building for mingw32 hosts. 2003-05-19 Kevin Ryde * README (Cross building Guile): Remove --with-cc-for-build in favour of CC_FOR_BUILD. 2003-05-16 Kevin Ryde * configure.in (--with-cc-for-build): Remove this option, CC_FOR_BUILD variable is more or less standard, and is adequate for the task. 2003-05-12 Kevin Ryde * configure.in (CC_FOR_BUILD): Use AC_ARG_VAR. * configure.in (SCM_SINGLES): Use AC_CHECK_SIZEOF(float), to eliminate guess-yes when cross compiling. * configure.in (SCM_I_GSC_STACK_GROWS_UP): Fix missing comma in AC_TRY_RUN. 2003-04-20 Dirk Herrmann * libguile.h: Removed uses of DEBUG_EXTENSIONS to fix compile errors with --disable-deprecated. 2003-04-07 Rob Browning * pre-inst-guile-env.in: new script -- can be used to run commands in an envt set up using the development libs, Guile, etc. * configure.in: handle pre-inst-guile-env and add test-suite/standalone/Makefile. 2003-04-06 Marius Vollmer * configure.in: Check for mpz_import, which is required but only available in GMP 4.1. 2003-04-05 Marius Vollmer * Changed license terms to the plain LGPL thru-out. 2003-04-04 Rob Browning * configure.in: add GMP test (require GMP). 2003-03-26 Marius Vollmer * libguile.h: Include "libguile/deprecated.h". 2003-03-25 Rob Browning * configure.in: big overhaul to shift us to have separate private, config.h, and public, scmconfig.h, configuration headers. Added a fair amount of code to track down new required types: scm_t_uint8, scm_t_uint16, scm_t_uint32, scm_t_int8, scm_t_int16, scm_t_int32, and to detect optional types scm_t_uint64, scm_t_in64, long long, unsigned long long, scm_t_ptrdiff, intptr_t, and uintptr_t. (SCM_I_GSC_T_PTRDIFF): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_NEEDS_INTTYPES_H): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_NEEDS_STDINT_H): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_UINT8): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_UINT16): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_UINT32): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_UINT64): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_INT8): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_INT16): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_INT32): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_T_INT64): gen-scmconfig.h.in AC_SUBST var. (USE_PTHREAD_THREADS): removed - handled by gen-scmconfig.c. (USE_NULL_THREADS): removed - handled by gen-scmconfig.c. (USE_COOP_THREADS): removed - handled by gen-scmconfig.c. (SCM_I_GSC_USE_PTHREAD_THREADS): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_USE_NULL_THREADS): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_USE_COOP_THREADS): gen-scmconfig.h.in AC_SUBST var. (STACK_GROWS_UP): removed - handled by gen-scmconfig.c. (SCM_I_GSC_STACK_GROWS_UP): gen-scmconfig.h.in AC_SUBST var. (GUILE_DEBUG_FREELIST): removed - handled by gen-scmconfig.c. (SCM_I_GSC_GUILE_DEBUG_FREELIST): gen-scmconfig.h.in AC_SUBST var. (GUILE_DEBUG): removed - handled by gen-scmconfig.c. (SCM_I_GSC_GUILE_DEBUG): gen-scmconfig.h.in AC_SUBST var. (SCM_ENABLE_DEPRECATED): removed - handled by gen-scmconfig.c. (SCM_I_GSC_ENABLE_DEPRECATED): gen-scmconfig.h.in AC_SUBST var. (HAVE_ARRAYS): removed - handled by gen-scmconfig.c. (SCM_I_GSC_HAVE_ARRAYS): gen-scmconfig.h.in AC_SUBST var. (SCM_ENABLE_ELISP): removed - handled by gen-scmconfig.c. (SCM_I_GSC_ENABLE_ELISP): gen-scmconfig.h.in AC_SUBST var. (SCM_I_GSC_C_INLINE): gen-scmconfig.h.in AC_SUBST var. (DEBUG_EXTENSIONS): removed - handled by gen-scmconfig.c. (READER_EXTENSIONS): removed - handled by gen-scmconfig.c. (USE_THREADS): removed - handled by gen-scmconfig.c. (GUILE_ISELECT): removed - handled by gen-scmconfig.c. (DYNAMIC_LINKING): removed - handled by gen-scmconfig.c. * README: merge information from INSTALL and remove at least some of the stale bits. * LICENSE: new file -- we should change this to the LGPL soon and add COPYING.LIB to the distribution. * autogen.sh: call autoreconf with --force. This may fix the "order" problem below without having to have two calls. * INSTALL: use the automake installed INSTALL file. The Guile specific instructions are now in README. 2003-03-21 Marius Vollmer * autogen.sh: Invoke autoreconf twice since the required files do not seem to be generated in the right order. XXX - investigate further. 2003-03-19 Marius Vollmer * guile-tools.in (guileversion): Use $GUILE_EFFECTIVE_VERSION instead of $GUILE_VERSION. Thanks to Kevin Ryde! 2003-02-27 Rob Browning * configure.in (AC_CONFIG_SRCDIR): use GUILE-VERSION. (AM_CONFIG_HEADER): change to config.h * Makefile.am (EXTRA_DIST): remove $(ACLOCAL). (ACLOCAL_AMFLAGS): replaces ACLOCAL. * autogen.sh: switch to autoreconf -- see how it goes. remove call to guile-aclocal.sh -- we now do the same thing with an automake setting. * guile-aclocal.sh: deleted in favor of ACLOCAL_AMFLAGS in Makefile.am. 2003-02-26 Rob Browning * configure.in: change our config header from libguile/scmconfig.h to be the traditional ./config.h. libguile/scmconfig.h is now built from that during the build process. More changes coming... 2003-01-23 Mikael Djurfeldt * libguile.h: #include "futures.h" 2002-12-16 Mikael Djurfeldt * configure.in: Test if pthread.h declares pthread_mutexattr_settype (). 2002-12-15 Mikael Djurfeldt * configure.in (SCM_MUTEX_FAST, SCM_MUTEX_RECURSIVE): Test for ways to get fast and recursive mutexes. 2002-12-10 Mikael Djurfeldt * configure.in (_THREAD_SAFE): Define when pthreads are enabled in order to get thread safe versions of glibc functions. 2002-12-09 Mikael Djurfeldt * configure.in: Temporarily replaced "copt" threads option with new option "pthreads". (USE_PTHREAD_THREADS): Define if pthreads configured. 2002-12-08 Rob Browning * configure.in (GUILE_EFFECTIVE_VERSION): AC_SUBST it. (AC_CONFIG_FILES): separate out the files that need to be chmodded at the end of config.status. Our "default" approach using AC_CONFIG_COMMANDS quit working (and would have needed to be changed to AC_CONFIG_COMMANDS(,,CMDS) rather than our previous AC_CONFIG_COMMANDS(default,CMDS), but I the new approach, using per-file AC_CONFIG_FILES calls appears to be more "correct" in the current autoconf docs. * GUILE-VERSION (GUILE_EFFECTIVE_VERSION): new variable. 2002-12-02 Marius Vollmer * Makefile.am (SUBDIRS): Removed qt. * configure.in: Do not configure QTHREADS. Do not define USE_COOP_THREADS. Changed logic for thread package selection so that the default is "coop-pthread" when -lpthread is found, "null" otherwise. 2002-12-01 Mikael Djurfeldt * GUILE-VERSION: Added versioning info for srfi 1. * configure.in (LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT, LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION, LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE, LIBGUILE_SRFI_SRFI_1_INTERFACE): New AC_SUBST. 2002-11-10 Marius Vollmer * configure.in (USE_THREADS, GUILE_ISELECT): Define always. We define them with AC_DEFINE and not in some header file so that they are visible exactly in the same way as they used to be. 2002-11-03 Marius Vollmer * configure.in: Do not add "threads.o" to the libobjs, it is now always compiled. (USE_THREADS, GUILE_ISELECT): Do not define. 2002-10-27 Marius Vollmer * configure.in: Handle thread package "coop-pthread" with alias "copt" and define USE_COPT_THREADS when it is selected. Always define GUILE_ISELECT. 2002-10-26 Neil Jerram * configure.in (AC_CONFIG_FILES): Add ice-9/debugger/Makefile and ice-9/debugger/breakpoints/Makefile. 2002-10-21 Marius Vollmer * configure.in: Changed logic in thread support configuration such that --with-threads=no is equivalent to --with-threads=null. On platforms that are not supported by QuickThreads, we also use the null-threads. Thus, USE_THREADS is always defined now. 2002-10-16 Marius Vollmer * configure.in: Shuffled around and extended the thread configuration code to allow the "null" thread package to be selected. Define USE_NULL_THREADS in that case. 2002-10-13 Gary Houston * autogen.sh (ac_version): try automake 1.7 too. 2002-10-05 Marius Vollmer * autogen.sh: Make sure that $autoheader is always set. When we would use the plain "autoconf", $autoheader would end up empty and libguile/scmconfig.h.in would not be updated. 2002-10-04 Rob Browning * libltdl: moved to libguile-ltdl. * Makefile.am (SUBDIRS): remove libltdl. * autogen.sh: remove support for libltdl sub-configure. (ac_version): widen support check to any 2.5? autoconf version. 2.54 is out now. * configure.in: turn on -Werror by default. We're now clean. I'd like to stay that way. If we want, we can turn it off by default when we make the stable release, but I caught a lot of bugs this way. Accomodate libguile-ltdl -- therea are some ltdl things that are commented out now INCLTDL and LIBLTDL. I think we may not need them anymore, but I'll leave them until we're sure. We also killed off the libltdl dir and related options including the AC_CONFIG_SUBDIRS. I also added some explicit tests for some headers and functions that weren't listed but were in scmconfig.h.in. though this may have been unnecessary. 2002-10-04 Marius Vollmer * configure.in: Use AC_LIBLTDL_CONVENIENCE instead of AC_LIBLTDL_INSTALLABLE. 2002-10-03 Marius Vollmer * autogen.sh: Do not instruct libtoolize to copy libltdl into our sources. Do not patch it. We have our own version now that is only being used as a convenience library. 2002-08-24 Marius Vollmer * configure.in: Check for __libc_stack_end. 2002-08-05 Han-Wen Nienhuys * configure.in: add snprintf 2002-08-04 Han-Wen * NEWS: add entries for GC and vector WB. 2002-07-22 Han-Wen * autogen.sh (mscripts): find and check version number of automake. Complain if 1.6 is not found. 2002-07-20 Han-Wen * autogen.sh (mscripts): find and check version number of autoconf. Complain if 2.53 is not found. 2002-07-20 Dirk Herrmann * benchmark-guile.in: Copied from check-guile.in and adapted for use with benchmarks. * Makefile.am: Recurse into the benchmark-suite subdir. * configure.in: Added benchmarking files. 2002-07-12 Gary Houston * configure.in: check dynamic linking before modules. Add dynl.c if dynamic linking is available, i.e., unless --with-modules=no was given to configure. 2002-07-09 Marius Vollmer * autogen.sh: Patch libltdl/ltdl.c to avoid a nasty bug in libtool-1.4.2. 2002-07-07 Marius Vollmer * autogen.sh: Do not copy INSTALL from workbook since it is not uniform across branches. * INSTALL: Re-added to repository. Crosscompiling and Cygwin fixes from Jan Nieuwenhuizen. Thanks! * autogen.sh: Only fix libltdl/configure.in if it exists. Current libtool CVS does not need this fix. * configure.in (AC_LIBTOOL_WIN32_DLL): Add for shared Cygwin build. Add --with-cc-for-build option to re-enable cross building. Add --with-guile-for-build option to re-enable cross building. 2002-06-30 Gary Houston * autogen.sh: Changed the path to the scripts directory. In libltdl, run aclocal before autoconf and automake: this eliminated various warnings after upgrading to newer automake. 2002-05-22 Marius Vollmer From John W. Eaton * configure.in (AC_CHECK_FUNCS): Check for copysign. 2002-05-10 Marius Vollmer * libguile.h: Added inclusion of "extensions.h". 2002-05-06 Marius Vollmer * configure.in: Include before when checking vor IPv6. This is for NetBSD 1.5. Thanks to Greg Troxel! From John W. Eaton. * configure.in (AC_CHECK_HEADERS): Check for floatingpoint.h ieeefp.h, and nan.h. (AC_CHECK_FUNCS): Check for finite, isinf, and isnan. 2002-05-01 Thien-Thi Nguyen * autogen.sh: Add call to $mscripts/render-bugs to create BUGS file. * BUGS: bye bye 2002-04-27 Thien-Thi Nguyen * Makefile.am (EXTRA_DIST): Remove qthreads.m4. 2002-04-26 Marius Vollmer * guile-aclocal.sh: Replaced with a simple invocation of "aclocal -I guile-config". This works as of automake 1.5. * qthreads.m4: Moved to guile-config/. 2002-04-18 Marius Vollmer * autogen.sh: Call automake twice for guile-core so that two copies of mdate-sh get a chance of being installed (one in doc/ref/ and one in doc/tutorial/). 2002-04-16 Marius Vollmer * Makefile.am (AUTOMAKE_OPTIONS): New, to request version 1.5. (EXTRA_DIST): Don't distribute acconfig.h, which is gone. (dist-hook): Removed. (DISTCLEANFILES): Added check-guile.log. (EXTRA_DIST): Don't distribute TODO. * configure.in: Bump required autoconf version to 2.53. Move uses of AC_LIBOBJ after AC_PROG_CC. AC_LIBOBJ needs OBJEXT which is set by AC_PROG_CC. 2002-04-10 Rob Browning * configure.in: updates for new autoconf -- add definitions to AC_DEFINE calls, and convert occurences of LIBOBJS to AC_LIBOBJ calls. * acinclude.m4: add definitions to AC_DEFINE calls for new autoconf. * acconfig.h: removed -- newer autoconf doesn't like it, and now we don't need it. * .cvsignore: add autom4te.cache and pre-inst-guile. 2002-04-03 Thien-Thi Nguyen * RELEASE: bye bye 2002-03-31 Thien-Thi Nguyen * Makefile.am: Update copyright. (dist-hook): Add, including related am/maintainers-dirs, surrounded by "if MAINTAINER_MODE". * TODO: bye bye * autogen.sh: Add usage comment. Add workbook specification. Add dist-files symlinking. * ANON-CVS, HACKING, INSTALL, SNAPSHOTS: bye bye 2002-03-06 Thien-Thi Nguyen * guile-tools.in: Handle "--source" option. 2002-03-04 Thien-Thi Nguyen * configure.in (top_srcdir_absolute): New AC_SUBST var. * pre-inst-guile.in, check-guile.in (top_srcdir): Use `top_srcdir_absolute' AC_SUBST var. * pre-inst-guile.in (top_srcdir): Fix ref bug: Force absolute. 2002-02-27 Thien-Thi Nguyen * pre-inst-guile.in: Typofix; nfc. 2002-02-27 Stefan Jahn * Makefile.am (SUBDIRS): Added the `am' directory. 2002-02-26 Thien-Thi Nguyen * pre-inst-guile.in: New file. * pre-inst-guile, pre-inst-guile.am: bye bye * configure.in (top_builddir_absolute): New AC_SUBST var. (AC_CONFIG_FILES): Add am/Makefile, pre-inst-guile. (AC_CONFIG_COMMANDS): Also chmod +x pre-inst-guile. * check-guile.in (top_builddir): Use AC_SUBST var `top_builddir_absolute'. (guile): Look for pre-inst-guile in $top_builddir. * Makefile.am (EXTRA_DIST): Remove pre-inst-guile, pre-inst-guile.am. 2002-02-24 Rob Browning * GUILE-VERSION: move all but guile-readline library versioning information here. guile-readline is still standalone. Bump CURRENT interfaces to 15 to allow some headroom for 1.6 release at Thi-Thien's request. * configure.in: AC_SUBST the centralized shared lib versioning variables from ./GUILE-VERSION. (LIBQTHREADS_INTERFACE_CURRENT): new AC_SUBST. (LIBQTHREADS_INTERFACE_REVISION): new AC_SUBST. (LIBQTHREADS_INTERFACE_AGE): new AC_SUBST. (LIBQTHREADS_INTERFACE): new AC_SUBST. (LIBGUILE_INTERFACE_CURRENT): new AC_SUBST. (LIBGUILE_INTERFACE_REVISION): new AC_SUBST. (LIBGUILE_INTERFACE_AGE): new AC_SUBST. (LIBGUILE_INTERFACE): new AC_SUBST. (LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT): new AC_SUBST. (LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION): new AC_SUBST. (LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE): new AC_SUBST. (LIBGUILE_SRFI_SRFI_4_INTERFACE): new AC_SUBST. (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT): new AC_SUBST. (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION): new AC_SUBST. (LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE): new AC_SUBST. (LIBGUILE_SRFI_SRFI_13_14_INTERFACE): new AC_SUBST. * autogen.sh: make absolutely sure we can't have stale files from old versions lying around the libltdl dir since libtoolize doesn't. Also hack libltdl's configure.in to require autoconf 2.5 so the main tree and libltdl can't get out of sync again. * RELEASE: update release building instructions. 2002-02-21 Neil Jerram * acinclude.m4 (GUILE_HEADER_LIBC_WITH_UNISTD): Use [] rather than "" for multiword string. Thanks to Christopher Cramer for pointing this out. 2002-02-11 Marius Vollmer * acconfig.h (GUILE_DEBUG_MALLOC): Refer to scm_gc_malloc, etc, instead of to scm_must_malloc. 2002-02-07 Marius Vollmer * Makefile.am (EXTRA_DIST): Added pre-inst-guile and pre-inst-guile.am. 2002-02-05 Thien-Thi Nguyen * pre-inst-guile.am, pre-inst-guile: New files. * check-guile.in (srcdir): Delete var. (top_builddir, top_srcdir, guile_opts): New vars. Use "set -e". No longer set LTDL_LIBRARY_PATH. Use ${top_srcdir}/pre-inst-guile instead of libguile/guile. * configure.in (libguile/guile-snarf-docs-texi): Remove from `AC_CONFIG_FILES' and `AC_CONFIG_COMMANDS'. * check-guile.in (top_builddir): Fix bug: Use cwd. (TEST_SUITE_DIR): Fix bug: Use `top_srcdir'. (GUILE_LOAD_PATH): No longer include $top_srcdir. * pre-inst-guile: Fix bug: Use ":" in `case' pattern to prevent prefix aliasing. 2002-01-31 Stefan Jahn * configure.in: Add -DLIBLTDL_DLL_IMPORT to INCLTDL when using `libltdl.dll'. 2002-01-28 Stefan Jahn * configure.in (guile_cv_have_uint32_t): Look also in `stdint.h' for uint32_t. 2002-01-13 Neil Jerram * Makefile.am (SUBDIRS): Added lang. * configure.in (AC_CONFIG_FILES): Added Makefiles in lang, lang/elisp, lang/elisp/internals and lang/elisp/primitives. 2002-01-11 Neil Jerram * acconfig.h (SCM_ENABLE_ELISP): New conditional. * configure.in (SCM_ENABLE_ELISP): Define this conditional (or not) according to absence (or presence) of `--disable-elisp' in the configure args. 2001-12-31 Dirk Herrmann * TODO: Added two items. 2001-12-26 Marius Vollmer * configure.in (HAVE_MAKEINFO): Check for the makeinfo program and set this conditional accordingly. 2001-12-01 Thien-Thi Nguyen * README: Fix virulent typo. 2001-11-25 Marius Vollmer * acconfig.h (HAVE_INLINE): Added template. * configure.in (HAVE_INLINE): Define it when the compiler supports inline functions. * libguile.h: Include "libguile/inline.h". 2001-11-22 Gary Houston * HACKING: Modified the Hacking It Yourself section. Removed the version numbers from the tools. HACKING, README, ANON-CVS: updates. 2001-11-21 Gary Houston * HACKING: Removed reference to no longer practiced * in ChangeLog convention. 2001-11-19 Thien-Thi Nguyen * BUGS (11): Set "fixed: no-need". * TODO (write emacs/patch.el): New item, self-assigned. 2001-11-19 Rob Browning * configure.in: switch to AC_LIBLTDL_INSTALLABLE so we'll use the system libltdl when it's available. Aside from the normal reasons to prefer installed shared libs, this means other apps that link with libguile and also use libltdl will be more likely to work right. 2001-11-17 Dirk Herrmann * BUGS (4): Set "fixed: 2001-11-17 (1.7.x)". 2001-11-15 Thien-Thi Nguyen * guile-tools.in: Handle command "list" specially: list scripts dir. (help): Make more informative. 2001-11-12 Marius Vollmer * autogen.sh: Recurse into libltdl directory and invoke autoconf there. 2001-11-11 Thien-Thi Nguyen * HACKING: Restrict documentation change log waiver to only apply to ChangeLog files. 2001-11-12 Marius Vollmer * configure.in: Check for sizes of short, size_t, uintptr_t, and ptrdiff_t. Checking for a size also checks automatically for the existence of the type, so we don't check for the existence of uintptr_t, ptrdiff_t and long long ourselves. 2001-11-10 Thien-Thi Nguyen * BUGS (11): New. 2001-11-07 Stefan Jahn * configure.in: Include `win32-socket.o' in the list of object files if networking is enabled on Win32. 2001-11-06 Thien-Thi Nguyen * TODO (sync srfi-modules.texi): New, done. * BUGS (9, 10): New. 2001-11-04 Stefan Jahn * NEWS: Corrected remarks about SCM_API. * configure.in: Defining USE_DLL_IMPORT definition to indicate usage of DLL import macros in `libguile/__scm.h'. (LIBOBJS): Removed `fileblocks.o' from the list of object files. Somehow Jim Blandy's patch from 1997 did not survive. 2001-11-02 Marius Vollmer Support for native Win32. Thanks to Stefan Jahn! * check-guile.in: Replaced `ln -s' by `@LN_S@' to supports build systems which do not have symbolic links. * configure.in: Define AC_LIBTOOL_WIN32_DLL to build clean dlls on Win32 platforms. Checking for `ws2_32.dll', `winsock2.h', add `win32-uname.o' and `win32-dirent.o' and define extra compiler flags necessary to build clean dlls. Check for `regcomp()' inside `-lregex'. 2001-10-26 Thien-Thi Nguyen * BUGS (7, 8): New. 2001-10-25 Thien-Thi Nguyen * BUGS: Expand on file format description. (1): Update "fixed" field. (2, 3, 4, 5, 6): New. 2001-10-14 Gary Houston * configure.in: include sys/types.h when testing uint32_t. thanks to Bill Schottstaedt. 2001-10-14 Marius Vollmer * configure.in: Do not use an absolute path for when checking for return type of usleep. Thanks to Michael Carmack. 2001-09-30 Thien-Thi Nguyen * BUGS: New file. * Makefile.am (EXTRA_DIST): Add BUGS file. 2001-09-25 Thien-Thi Nguyen * TODO: Add bugfix item to "Eventually". 2001-09-20 Rob Browning * configure.in (AC_CONFIG_FILES): add libguile/version.h. 2001-09-11 Rob Browning * RELEASE: Deleted Ian Grant and Julian Satchell's addresses from the testing list since they're no longer functional. 2001-09-04 Thien-Thi Nguyen * TODO: Use outline mode instead of text. Reword protocol explanation. Add "make error-signalling functions more consistent" to Eventually. Move some C-related GOOPS tasks to 1.8.0, take ownership. 2001-08-31 Thien-Thi Nguyen * HACKING (Sample GDB Initialization File): New section. * TODO (1.8.0): Add "move .gdbinit" entry. 2001-08-31 Dirk Herrmann * TODO: Added some points, and eliminated all done items. * acconfig.h, configure.in (SCM_DEBUG_DEPRECATED, SCM_ENABLE_DEPRECATED): Renamed SCM_DEBUG_DEPRECATED to SCM_ENABLE_DEPRECATED with the logic reversed. 2001-08-31 Dirk Herrmann * libguile.h: Removed bogus comment, rearranged includes, removed deprecated definitions. (LIBGUILEH, SCM_LIBGUILE_H): Renamed H to SCM__H. 2001-08-30 Thien-Thi Nguyen * HACKING: Mention libtool ./configure-regeneration requirement. 2001-08-27 Marius Vollmer * check-guile.in: Do not include ".libs" in LTDL_LIBRARY_PATH, libltdl provides it itself. 2001-08-24 Neil Jerram * configure.in (AC_CONFIG_FILES): Add per-manual doc directory Makefiles. 2001-08-15 Rob Browning * configure.in (LIBGUILE_INTERFACE_CURRENT): use libtool versioning scheme. (LIBGUILE_INTERFACE_REVISION): use libtool versioning scheme. (LIBGUILE_INTERFACE_AGE): use libtool versioning scheme. (LIBGUILE_INTERFACE): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_CURRENT): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_REVISION): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_AGE): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE): use libtool versioning scheme. * GUILE-VERSION (GUILE_MINOR_VERSION): bump for new unstable. (GUILE_MICRO_VERSION): reset for new unstable. (LIBGUILE_INTERFACE_CURRENT): use libtool versioning scheme. (LIBGUILE_INTERFACE_REVISION): use libtool versioning scheme. (LIBGUILE_INTERFACE_AGE): use libtool versioning scheme. (LIBGUILE_INTERFACE): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_CURRENT): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_REVISION): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE_AGE): use libtool versioning scheme. (LIBGUILEQTHREADS_INTERFACE): use libtool versioning scheme. 2001-08-07 Marius Vollmer * Makefile.am (EXTRA_DIST, SUBDIRS): Move test-suite from EXTRA_DIST to SUBDIRS. * configure.in: Added "test-suite/Makefile". 2001-08-01 Marius Vollmer * configure.in: Added `--disable-linuxthreads' option and do not define GUILE_PTHREAD_COMPAT nor link with -lpthread when it is given. Thanks to Cris Cramer! 2001-07-23 Marius Vollmer * Makefile.am (SUBDIRS): Build libguile before ice-9. 2001-07-22 Marius Vollmer * configure.in: Check for "inttypes.h". 2001-07-19 Rob Browning * configure.in: add checks for setitimer and getitimer. Add --enable-error-on-warning. 2001-07-18 Martin Grabmueller * INSTALL, Makefile.am, configure.in: Updated copyright notice. 2001-07-15 Thien-Thi Nguyen * HACKING: Remove onerous authorship-info deletion clause. 2001-07-13 Keisuke Nishida * autogen.sh: Call libtoolize with --force. 2001-07-10 Thien-Thi Nguyen * INSTALL: Point to HACKING for tool versions. 2001-07-08 Rob Browning * TODO: updated to include relevant itemized post-1.6-RELEASE tasks that are distributable so we can check them off as they are done, and delete 1.6.0 tasks. * RELEASE: add a note that the RELEASE instructions are out of date now that we're using branches. * AUTHORS: add "many files throughout" for myself. 2001-06-28 Thien-Thi Nguyen * README: Also mention guile-tools. * README: Mention libguile-srfi-*, oop/*, scripts/* and srfi/*. 2001-06-27 Thien-Thi Nguyen * RELEASE: Move todo items to file TODO. * TODO: Initial revision * Makefile.am (EXTRA_DIST): Add TODO. * HACKING: Refer to TODO and SNAPSHOTS. No longer refer to devel/tasks.text. * SNAPSHOTS: Fix reference bug; recommended tool versions are in HACKING. * TODO: Add completion and ownership protocol to header comments. * RELEASE: Add TODO-processing to spiffing checklist. * HACKING: Update deprecation procedure to refer to TODO. 2001-06-27 Michael Livshin * autogen.sh: don't run flex here. * HACKING: clarify that newer versions of flex should be just fine. 2001-06-26 Martin Grabmueller * HACKING, ANON-CVS: Removed mentioning of guile-doc CVS module. * configure.in: Added some header and function checks. 2001-06-25 Neil Jerram * autogen.sh: Quoting fix for `--enable-maintainer-mode'. 2001-06-25 Marius Vollmer * autogen.sh: Added message about what to do next. Tell them to use `--enable-maintainer-mode'. 2001-06-25 Michael Livshin * HACKING: mention flex. * autogen.sh: generate libguile/c-tokenize.c. 2001-06-20 Martin Grabmueller * libguile.h: Removed inclusion of libguile/tag.h. 2001-06-16 Marius Vollmer * libguile.h (scm_cond_t, scm_key_t, scm_mutex_t): Only define these when using threads. 2001-06-14 Marius Vollmer * libguile.h: Added deprecated section with the olde type names. * configure.in: Check for header . Check for uintptr_t type. Use AC_CHECK_TYPES for this. Do not caus ptrdiff_t to be `#defined'. * acconfig.h (ptrdiff_t): Removed. 2001-06-05 Martin Grabmueller * configure.in: Generate examples/box-dynamic-module/Makefile. 2001-06-03 Marius Vollmer * configure.in (AC_CONFIG_FILES, AC_CONFIG_COMMANDS): Add guile-snarf. 2001-06-02 Rob Browning * configure.in: changes for autoconf 2.50. (AC_PREREQ): require at least autoconf 2.50. (AC_INIT): no longer takes an arg. (AC_CONFIG_SRCDIR): takes arg AC_INIT used to take. (AC_STRUCT_ST_RDEV): changed -> AC_CHECK_MEMBERS. (AC_STRUCT_ST_BLKSIZE): deprecated -> AC_CHECK_MEMBERS. (AC_STRUCT_ST_BLOCKS): use it rather than our version. (AC_CONFIG_FILES): now generated files go here, not in AC_OUTPUT. (AC_CONFIG_COMMANDS): now actions go here, not in AC_OUTPUT. (AC_OUTPUT): no longer takes args. * acinclude.m4: AC_LANG not a variable now -- use __cplusplus unconditionally . 2001-06-02 Marius Vollmer * configure.in: Check for mkstemp via AC_REPLACE_FUNCS. Thanks to I. N. Golubev! 2001-06-01 Martin Grabmueller * configure.in: Generate examples/box-dynamic/Makefile. 2001-05-31 Martin Grabmueller * Makefile.am (EXTRA_DIST): New subdirectory `examples'. * configure.in: Added all Makefiles in the `examples' directory to AC_OUTPUT. 2001-05-31 Michael Livshin * configure.in: generate guile-snarf-docs & guile-snarf-docs-texi. don't generate guile-snarf.awk. * Makefile.am (EXTRA_DIST): add test-suite. 2001-05-28 Michael Livshin * check-guile.in: fix to be runnable when srcdir!=builddir. 2001-05-26 Michael Livshin revert the controversial part of the 2001-05-23 changes 2001-05-23 Michael Livshin * configure.in: configury for SCM_[U]BITS_T, some more sizeofs. also, make sure that the integral type choosen to represent an SCM has exactly the same size as a void pointer. * acconfig.h: add undefs for SCM_BITS_T, SCM_UBITS_T, SCM_SIZEOF_BITS_T, ptrdiff_t. 2001-05-16 Rob Browning * configure.in: add AC_SUBST for GUILE_MICRO_VERSION. * GUILE-VERSION (GUILE_VERSION): now MAJOR.MINOR.MICRO (GUILE_MICRO_VERSION): new variable, records final revision. i.e. the 5 in 1.6.5. MINOR_VERSION is now just the middle number, i.e. the 6. 2001-05-16 Dirk Herrmann * acconfig.h, configure.in: Renamed GUILE_WARN_DEPRECATED_DEFAULT to SCM_WARN_DEPRECATED_DEFAULT. 2001-05-15 Marius Vollmer * acinclude.m4: Removed copy of "libtool.m4". 2001-05-14 Dirk Herrmann * configure.in (SCM_DEBUG_DEPRECATED): Always defined. 2001-05-13 Thien-Thi Nguyen * AUTHORS (Martin Grabmueller, Thien-Thi Nguyen): Update. * HACKING: Update copyright. Add blurb pointing to devel/tasks.text. 2001-05-11 Thien-Thi Nguyen * check-guile.in: For SRFI testing, set and export env var `LTDL_LIBRARY_PATH'. 2001-05-07 Neil Jerram * AUTHORS: Add docs-related authorship details. 2001-05-05 Marius Vollmer * configure.in (--enable-deprecated): Recognize "shutup" option argument and turn it into the default warning level "no". 2001-05-05 Gary Houston * acconfig.h: add HAVE_IPV6. * configure.in: check whether we can compile with IPv6 support. 2001-05-04 Thien-Thi Nguyen * guile-tools.in: New file. * configure.in (AC_OUTPUT): Add guile-tools, and make executable. * Makefile.am (bin_SCRIPTS): New var. 2001-05-04 Gary Houston * configure.in: check whether uint32_t is defined when netdb.h is included. acconfig.h: added HAVE_UINT32_T. 2001-05-02 Marius Vollmer * configure.in: Added handling of `--enable-deprecated'. * acconfig.h (SCM_DEBUG_DEPRECATED, GUILE_WARN_DEPRECATED_DEFAULT): Added. 2001-04-29 Thien-Thi Nguyen * Makefile.am (SUBDIRS): Add "scripts". * configure.in (AC_OUTPUT): Add scripts/Makefile. 2001-04-29 Gary Houston * libguile.h: include rw.h. 2001-04-27 Rob Browning * GUILE-VERSION (GUILE_MINOR_VERSION): change to 5.0, switching to the new odd/even ustable/stable version numbering scheme. (LIBGUILEQTHREADS_MAJOR_VERSION): change to 10 to match Debian and libguile. In the future, libguile and libguileqthreads may not stay in sync. This still doesn't appear to affect libguileqthreads, but we'll fix that next. 2001-04-25 Martin Grabmueller * configure.in: Don't treat srfi directory specially, just create the Makefile there (thanks to Neil Jerram for the patch). 2001-04-23 Martin Grabmueller * Makefile.am (SUBDIRS): Added `srfi'. * configure.in: Added subdirectory `srfi' to build process. * libguile.h: Added inclusion of `values.h'. 2001-04-22 Gary Houston * configure.in: check for inet_pton and inet_ntop. 2001-04-20 Gary Houston * acconfig.h: include HAVE_SIN6_SCOPE_ID. * configure.in: check for sin6_scope_id in sockaddr_in6. 2001-04-19 Mikael Djurfeldt * RELEASE: Added deprecated macro SCM_ARRAY_CONTIGUOUS 2001-04-17 Gary Houston * configure.in: run the autoconf BIGENDIAN check. 2001-04-12 Niibe Yutaka * GUILE-VERSION (LIBGUILEQTHREADS_MAJOR_VERSION, LIBGUILEQTHREADS_MINOR_VERSION, LIBGUILEQTHREADS_REVISION_VERSION, LIBGUILEQTHREADS_VERSION): Added libguileqthreads version info. * configure.in: Likewise. 2001-04-11 Keisuke Nishida * configure.in (AC_CHECK_FUNCS): Don't check bzero. (GUILE_FUNC_DECLARED): Removed checking of bzero. Thanks to NIIBE Yutaka. 2001-04-10 Mikael Djurfeldt * Undeprecated scm_init_oop_goopscore_module. 2001-03-25 Thien-Thi Nguyen * check-guile.in: Fix sh standard conformance bug: Replace "test -e" with "test -f". Thanks to Alexander Klimov. 2001-03-19 Gary Houston * check-guile.in: rename $parent to $srcdir. if it's equal to "." set it to `pwd`. * check-guile.in: 16 documentation tests were failing if "make check" was run before Guile had been installed with the current --prefix. made various changes to the script so that it runs without a cd to the test-suite directory. For the -i option, don't point GUILE_LOAD_PATH to the current directory, but let it use it's own scheme library. 2001-03-18 Gary Houston * check-guile.in: use @srcdir@ instead of @test_suite_dir@. use the current directory (build dir) not srcdir to find guile executable. otherwise "make check" doesn't work with a separate build directory. create the test log in $build_dir/check-guile.log instead of in srcdir/test-suite directory. * configure.in: don't define or substitute test_suite_dir. 2001-03-17 Gary Houston * configure.in: don't append threads.doc to EXTRA_DOT_DOC_FILES, since EXTRA_DOT_DOC_FILES is redefined later. define EXTRA_DOT_X_FILES and hand it to AC_SUBST. 2001-03-09 Martin Grabmueller * configure.in: Added header checks for crypt.h, sys/resource.h and sys/file.h, function checks for chroot, flock, getlogin, cuserid, getpriority, setpriority, getpass, sethostname, gethostname, and for crypt() in libcrypt. 2001-03-09 Neil Jerram * configure.in (htmldoc): Merge handling of `--enable-htmldoc' option from guile-doc/configure.in. 2001-03-06 Dirk Herrmann * libguile.h: Removed #include "libguile/dump.h". 2001-02-02 Keisuke Nishida * libguile.h: Added #include "libguile/dump.h". 2001-01-29 Mikael Djurfeldt * libguile.h: Added #include "libguile/rdelim.h". 2001-01-26 Dirk Herrmann The following patch was sent by Thien-Thi Nguyen. * check-guile.in: New file. * Makefile.am: Add TESTS rule. * configure.in: Add support for "make check". 2000-11-21 Dirk Herrmann * acconfig.h: Removed bogus #ifndef. Thanks to Lars J. Aas. 2000-10-25 Mikael Djurfeldt * GUILE-VERSION (LIBGUILE_MAJOR_VERSION): Incremented major version number to 10 due to the merge of GOOPS. * oop: New directory. 2000-09-20 Keisuke Nishida * libguile.h: #include "libguile/properties.h". 2000-09-17 Gary Houston * configure.in, acconfig.h: remove the GCSE test: it doesn't seem to be reliable on all platforms. 2000-08-18 Gary Houston * acconfig.h: added BROKEN_GCSE. * configure.in: check for a gcc GCSE optimisation bug. 2000-07-31 Gary Houston * acconfig.h: added HAVE_H_ERRNO * configure.in: removed some dnl'd & obsolete cygwin stuff. added a test for h_errno. 2000-06-21 Mikael Djurfeldt * Guile 1.4 released. 2000-06-20 Mikael Djurfeldt * GUILE-VERSION: Changed to work also when included by a Makefile (e.g. debian/rules). (Thanks to Karl M. Hegbloom.) (LIBGUILE_MAJOR_VERSION): Bumped to 9. (GUILE_MINOR_VERSION): Bumped to 4. 2000-06-12 Mikael Djurfeldt * libguile.h: Removed #include "libguile/kw.h". * Makefile.am (ACLOCAL): Define as ./guile-aclocal.sh. (The rule will cd to $(top_srcdir).) * configure.in (EXTRA_DOT_DOC_FILES): Create from LIBOBJS and substitute it into libguile/Makefile. * HACKING: Updated recommended libtool version to be 1.3.5. * RELEASE: Say that we should update HACKING to reflect the versions of the tools we're using rather than README. 2000-06-02 Mikael Djurfeldt * NOTES: Removed. * TODO: Moved to devel/. 2000-06-01 Craig Brozefsky * GUILE-VERSION: added defnitions for LIBGUILE_MAJOR_VERSION, LIBGUILE_MINOR_VERSION, LIBGUILE_REVISION_VERSION so that we now define libguile.so version in a well-lit place. * configure.in: added AC_SUBST lines for the new LIBGUILE version variables. 2000-06-01 Michael Livshin * autogen.sh: call ./guile-aclocal.sh instead of aclocal. * guile-aclocal.sh: new file, works around aclocal problems. 2000-05-30 Dirk Herrmann * acconfig.h (USE_FSU_PTHREADS, USE_MIT_PTHREADS, USE_PCTHREADS_PTHREADS): Removed. 2000-05-01 Gary Houston * Makefile.am: add include_HEADERS. libguile.h: moved from libguile directory. maybe libguile.h should be installed in $prefix/include/libguile/libguile.h instead? 2000-04-21 Mikael Djurfeldt * qthreads.m4: Removed THREADS_CPPFLAGS. * acinclude.m4: Removed qthreads macros. They are provided in qthreads.m4, so these were redundant. * acconfig.h (GUILE_DEBUG_MALLOC): New. * configure.in: New --enable-debug-malloc configuration option. 2000-03-29 Mikael Djurfeldt * acconfig.h (GUILE_PTHREAD_COMPAT): New config variable. * configure.in: Enable workaround for COOP-linuxthreads compatibility on Linux systems. 2000-03-19 Mikael Djurfeldt * devel: New directory. Intended to carry documentation related to Guile development (as opposed to the doc directory which contains documentation related to the use of the current Guile). This directory (devel) is not included in the Guile distribution, but is accessible via anonymous CVS. 2000-03-13 Mikael Djurfeldt * configure.in: Don't add iselect.o to LIBOBJS. 2000-03-13 Mikael Djurfeldt * configure.in: Added end-tag for local variables. (Thanks to Thien-Thi Nguyen.) 2000-03-12 Gary Houston * README (Guile Documentation, About This Distribution): updated. 2000-03-12 Mikael Djurfeldt * configure.in (ac_cv_struct_timespec): Added test for struct timespec. * acconfig.h (HAVE_STRUCT_TIMESPEC): Added. 2000-01-25 Marius Vollmer * autogen.sh: Call libtoolize. Pass --add-missing option to automake. Do not decent into libltdl directory. The libltdl directory is now populated by libtoolize and does not need any further autogeneration. 2000-01-23 Gary Houston * configure.in: check for fchown. Tue Jan 18 12:55:15 2000 Mikael Djurfeldt * acinclude.m4 (AC_LIBLTDL_CONVENIENCE): Add $(top_srcdir)/libltdl instead of $(top_builddir)/libltdl to includepath. 2000-01-18 Mikael Djurfeldt * emacs: New subdirectory for elisp tools. 2000-01-15 Marius Vollmer * README, HACKING: Moved "Hacking it yourself" section from README to HACKING. Updated recommended libtool version to be 1.3.4. 2000-01-14 Gary Houston * configure.in: needs to have --disable-networking, not --disable-net. 2000-01-12 Mikael Djurfeldt * libltdl/acconfig.h: New file: Needed by autogen.sh. Tue Jan 11 13:42:35 2000 Greg J. Badros * autogen.sh: Added messages as we run autogen in subdirectories. * configure.in: Output libugile/guile-func-name-check script, and chmod +x it. 2000-01-11 Marius Vollmer * libltdl/autogen.sh: New file. * autogen.sh: Invoke libltdl/autogen.sh. 2000-01-09 Marius Vollmer Finally applied the libltdl patch from Thomas Tanner, with slight modifications. All code copied from the libtool package is from libtool-1.3.4. * configure.in: Make "--with-modules=yes" the default. Do not clear INCLTDL, LIBLTDL prior to processing "--with-modules". 1999-07-25 Thomas Tanner * Makefile.am: add libltdl to SUBDIRS, automake automatically includes ltconfig, ltmain.sh and acconfig.h in EXTRA_DIST * acinclude.m4: remove GUILE_DLSYM_USCORE, add libtool.m4 (no need to install libtool any more) * configure.in: replace --enable-dynamic-linking with --with-modules, required modules can be specified using --with-modules="/path/to/mod.la" and will be linked statically on platforms that don't support dynamic loading, configure libltdl, configure libtool for dlopening * libltdl: added using libtoolize -c --ltdl 2000-01-09 Gary Houston * configure.in: check whether localtime caches TZ. copied from Emacs 20.5. * acconfig.h: add LOCALTIME_CACHE. Tue Dec 14 09:12:22 1999 Greg J. Badros * configure.in: Make it be guile-snarf.awk, since we'll be switching names for guile-doc-snarf. (I wouldn't have changed this, but I was getting ready to commit this way when the below change was committed). 1999-12-14 Mikael Djurfeldt * configure.in: Create guile-doc-snarf.awk. 1999-12-12 Greg J. Badros * configure.in: Create guile-doc-snarf, chmod +x that script after AC_OUTPUTted. 1999-12-10 Greg J. Badros * NEWS: More complete description for --enable-debug-freelist. 1999-12-09 Gary Houston * configure.in (CFLAGS): don't add -Wpointer-arith, since it causes numerous spurious warnings with recent gcc and/or glibc versions. 1999-11-19 Gary Houston * acconfig.h: add HAVE_ARRAYS. * configure.in: add --disable-arrays option, probably temporary. 1999-11-17 Gary Houston * configure.in: check for hstrerror. 1999-10-05 Jim Blandy * autogen.sh: Don't call autoreconf at all; it's not reliable. Instead, call the various tools explicitly. Invoke guile-readline's autogen.sh script. Straighten up the situation regarding guile.m4 and qthreads.m4. We can't have .m4 files which are installed where aclocal can see them, but also used by guile's own configure.in, because aclocal will read both copies, complain about duplicate macro definitions, and refuse to generate aclocal.m4 at all. This happens if you invoke it as `aclocal -I .', as autoreconf does. This is probably a flaw in the autotools, but Guile doesn't need that flaw fixed immediately. guile.m4 is intended for use by people linking against guile, so it needs to be installed. But Guile itself doesn't use it. So move guile.m4 into guile-config. That makes sense, since guile.m4's GUILE_FLAGS macro is just an easy way to call guile-config. qthreads.m4 is indented to help configure a qthreads tree. It's only useful to a package which actually includes a qthreads tree, and it's intimately related to that tree, so it's not useful to install this. So don't install it. * guile.m4: Moved to guile-config. * Makefile.am (aclocaldir, aclocal_DATA): Delete. (EXTRA_DIST): Move qthreads.m4 here. Don't store generated files in the repository any more. Instead, require people to run autogen.sh on trees from snapshots and CVS. * Makefile.in, aclocal.m4, configure: Deleted. * autogen.sh: New file. * ANON-CVS, SNAPSHOTS: Updated instructions. 1999-10-02 Jim Blandy * acconfig.h (HAVE_POSIX, HAVE_NETWORKING): Add comments. 1999-09-27 Greg J. Badros * configure.in: Added --enable-debug-freelist option. * acconfig.h: Added GUILE_DEBUG_FREELIST. 1999-09-23 Gary Houston * acconfig.h: add HAVE_POSIX, HAVE_NETWORKING. remove FD_SETTER, FILE_CNT_FIELD, FILE_CNT_GPTR, FILE_CNT_READPTR. * configure.in: new options --disable-posix, --disable-net and --disable-regex export HAVE_POSIX and HAVE_NETWORKING definitions. don't add regex-posix.o to LIBOBJS if regex disabled. LIBOBJS: add filesys.c, posix.c, net_db.c, socket.c, conditionally. 1999-09-25 Jim Blandy * Guile 1.3.4 released. 1999-09-22 Jim Blandy * configure.in: Call AM_PROG_CC_STDC before AM_PROG_LIBTOOL, so libtool knows how to get ANSI C behavior from the compiler. * configure: Regenerated. 1999-09-20 Gary Houston * configure.in: check availability of siginterrupt. 1999-09-18 Gary Houston * configure.in: use AC_SYS_RESTARTABLE_SYSCALLS instead of testing for SA_RESTART. 1999-09-12 Mikael Djurfeldt * configure.in: Removed ice-9/version.scm from AC_OUTPUT. 1999-09-11 Jim Blandy * configure.in (GUILE_STAMP): Don't set this variable, or substitute it into anything. Full explanation in ice-9/ChangeLog. * configure, Makefile.in: Regenerated. 1999-09-06 James Blandy Propagate the changes of 2 Sept the rest of the way through. * configure: Regenerated. * Makefile.in: Regenerated. Not sure why this diff is so big. 1999-09-02 Jim Blandy * acinclude.m4 (GUILE_HEADER_LIBC_WITH_UNISTD): Fix typo in variable name. (Thanks to Bill Schottstaedt.) * aclocal.m4: Regenerated. 1999-09-02 Mikael Djurfeldt * configure.in: Test for presence of function on_exit. 1999-09-01 James Blandy * configure.in: Use AC_REPLACE_FUNCS to grab libguile/memmove.c if the system doesn't have memmove. Don't test for memmove and bcopy with AC_CHECK_FUNCS. * configure: Regenerated. 1999-08-30 Mikael Djurfeldt * configure.in: Test for atexit. 1999-08-29 Mikael Djurfeldt * acinclude.m4: Updated. (Thanks to Karl Eichwalder.) * configure.in: Test for presence of S_ISLNK in sys/stat.h. (Thanks to Bernard Urban.) Test for memmove and bcopy. (Thanks to suzukis@file.phys.tohoku.ac.jp.) * acconfig.h: Added HAVE_S_ISLNK. 1999-08-20 James Blandy * Guile 1.3.2 released. * Makefile.in: Regenerated. 1999-07-24 Mikael Djurfeldt * README, config.guess, config.sub, liconfig, ltmain.sh: Switched to libtool-1.3.3. 1999-07-22 Marius Vollmer Added guile-readline subdirectory with the removed readline support. * guile-readline: New directory, see ChangeLog there. * configure.in: Cause configure to descend into guile-readline dir. * Makefile.am: Likewise for make. * NEWS: Explain how to activate the readline support. * configure, Makefile.in: Regenerated. 1999-07-19 Jim Blandy Fixes for EMX from Mikael StÃ¥ldal. * configure.in: Check for . * configure: Regenerated. 1999-07-18 Jim Blandy * qthreads.m4 (QTHREADS_CONFIGURE): 'alpha' in a configuration name can have suffixes, like alphaev56-unknown-linux-gnu. * aclocal.m4, configure: Rebuilt. (Thanks to Sebastien Villemot.) 1999-07-04 Gary Houston * configure.in: don't check for ways to violate stdio abstraction. 1999-05-02 Jim Blandy * configure.in (AC_CHECK_FUNCS): Fill in list of functions that libguile/net_db.h wants to use. (Add setprotoent, setservent.) 1999-04-17 Jim Blandy Remove all automatic readline support, to avoid copyright confusion. * INSTALL: Update text. * NEWS: Explain the situation. * configure.in: Remove configury for readline and its supporting libraries. * configure: Regenerated. * README: Change URL's for automake and autoconf. * Makefile.in, configure: Regenerated with autoconf 2.13, automake 1.4, libtool 1.2f (1.385 1999/03/15 17:24:54). I've upgraded to all the right tools, according to README, but I'm still getting different results than Mikael is. Hmm. 1999-03-22 Mikael Djurfeldt * New libtool: 1.2f * ltmain.sh, ltconfig, config.guess, config.sub: New versions. * README: Mention new version number of libtool. 1999-03-04 Mikael Djurfeldt New automake: 1.4 * config.guess, config.sub, install-sh, mdate-sh, missing, mkinstalldirs: New versions. * Makefile.in, aclocal.m4, configure: Regenerated. * README: Mention new version numbers on autoconf and automake. 1999-02-12 Jim Blandy * configure.in: Add --with-readline flag. * configure: Rebuilt. 1999-02-09 Maciej Stachowiak * NEWS: Added entry for optargs module. 1999-02-06 Jim Blandy * configure: Regenerated using autoconf 2.12. 1999-01-26 Mikael Djurfeldt * configure.in: Removed test AC_C_BIGENDIAN. (This test was considered to encourage bad coding style.) 1999-01-21 Mikael Djurfeldt * configure.in: Added test AC_C_BIGENDIAN. 1999-01-11 Jim Blandy * configure.in: Remove quotes around ac_cv_lib_readline_main and ac_cv_var_rl_getc_function. They should both always be set to non-null values; this way, we get error messages. * configure: Regenerated. 1999-01-10 Jim Blandy * configure.in: Cite the variable ac_cv_lib_readline_main, not ac_cv_lib_readline_readline; the latter isn't set any more, since we look for 'main' in libreadline now. Add quotes around reference to the variable references, too, so this will work even when a variable's value is the empty string. * configure: Regenerated. 1999-01-07 Mikael Djurfeldt * acconfig.h: Added HAVE_LONG_LONGS. * configure.in: Added AC_CHECK_SIZEOF(long), AC_CHECK_SIZEOF(int); Added check for long longs. 1998-12-14 Jim Blandy * configure.in: Check for tgoto in ncurses, then termcap. S.u.S.E. Linux doesn't have a termcap. (Thanks to Karl Eichwalder.) * configure: Regenerated. 1998-10-24 Jim Blandy * configure.in: Call AM_PROG_CC_STDC, to see what flags we should pass the compiler to make it support ANSI. (Thanks to Bernard Urban.) * aclocal.m4, configure: Regenerated. 1998-10-20 Jim Blandy * Guile 1.3 released. 1998-10-19 Jim Blandy * GUILE-VERSION: Bump to 1.3. * Makefile.am (EXTRA_DIST): Don't omit ANON-CVS and SNAPSHOTS. * Makefile.in: Regenerated. 1998-10-16 Jim Blandy * qthreads.m4 (QTHREADS_CONFIGURE): On NetBSD, pass through a flag to the Makefile which explicitly tells it to pass assembly files through the preprocessor. (Thanks to Perry Metzger.) * aclocal.m4, configure, Makefile.in: Regenerated. 1998-10-14 Jim Blandy * configure.in: Define SCM_SINGLES whenever a float can fit in a long, not only when a float is the same size as a long. This gets us SCM_SINGLES defined on alphas. (Thanks to Clark McGrew.) * configure: Regenerated. * configure.in: Construct libguile/versiondat.h here; see log entry in libguile/ChangeLog for details. * configure: Regenerated. * configure.in: Allow tabs and whitespace between `void' and `usleep'. (Thanks to Harvey J. Stein.) * configure: Regenerated. Don't redefine sleep/usleep. * configure.in: Remove tests for usleep's argument type; we only need that if we're going to replace it. * acconfig.h (USLEEP_ARG_TYPE): Delete. All the other SLEEP garbage is needed just to use usleep and sleep without compiler warnings. * configure: Regenerated. 1998-10-12 Jim Blandy * configure: Regenerated. * configure.in (GUILE_FUNC_DECLARED): Name the cache variables starting with guile_cv_; ac_cv_ is autoconf's namespace. The type of the argument to usleep varies from system to system, as does the return type. We really shouldn't be redefining usleep at all, but I don't have time to clean that up before the 1.3 release. It's on the schedule for afterwards. * configure.in: Cache results from usleep return value test. Test for the type of the usleep argument, and cache that too. * acconfig.h (USLEEP_ARG_TYPE): New macro. 1998-10-11 Jim Blandy * acconfig.h (HAVE_RL_GETC_FUNCTION): Fix this entry. 1998-10-10 Jim Blandy * GUILE-VERSION: bump to 1.2.91, since we're doing snapshots again. * Guile 1.2.90 released --- beta. * GUILE-VERSION: Set to 1.2.90. This would appear to be a regression from 1.3a, but everyone knows that the next release is 1.3, I want to switch to a more coherent version numbering system, and now is the time. 1998-10-09 Jim Blandy * configure.in: Call AC_C_INLINE, so we can use inline happily in libguile. * configure: Regenerated. 1998-10-07 Jim Blandy * configure.in: Don't forget to #define HAVE_RL_GETC_FUNCTION if we do find the rl_getc_function variable in the readline library; AC_CHECK_FUNCS used to do this for us, but we're not using it any more. * acconfig.h: Add an entry for HAVE_RL_GETC_FUNCTION. * configure.in: Properly test for the presence of rl_getc_function; it's a variable, not a function. * configure: Regenerated. * doc: New subdirectory. * Makefile.am (SUBDIRS): List it. * configure.in (AC_OUTPUT): Build its Makefile. * configure, Makefile.in: Regenerated. * guile.m4 (GUILE_FLAGS): New macro. * guile.m4 (AM_INIT_GUILE_MODULE): Deleted; it doesn't do anything terribly helpful any more, nobody's using it, and this is not really the way I want to handle modules anyway. 1998-10-03 Jim Blandy * configure.in (FD_SETTER, FILE_CNT_GPTR): New cases for SCO's stdio implementation. (Thanks to David Tillman.) * configure: Rebuilt. * guile-config: Renamed from `build'. * Makefile.am (SUBDIRS): Mention `guile-config', not `build'. * configure.in: Create `guile-config/Makefile.in', not `build/Makefile.in'. Doc fix, too. * qthreads.m4: Doc fix. * Makefile.in, aclocal.m4, configure: Regeneranegerederadea. 1998-10-03 * configure.in: Check for a missing `sleep' declaration. * acconfig.h (MISSING_SLEEP_DECL): Provide some text for this. * configure: Regenerated. * configure.in: Don't use the canonical host name to decide whether `bzero' and `usleep' have declarations --- that's going back to the bad old days before autoconf. Remove the call to AC_CANONICAL_HOST and the subsequent case statement. (GUILE_FUNC_DECLARED): New m4 macro. Use it to check for declarations for `bzero', `usleep', and (new!) `strptime'. * acconfig.h: (DECLARE_BZERO, DECLARE_USLEEP): Removed. (MISSING_BZERO_DECL, MISSING_USLEEP_DECL, MISSING_STRPTIME_DECL): Added. I think this naming convention is more consistent with the rest of autoconf; names generally describes the system, not what the package should do to accomodate the system. * configure: Regenerated. 1998-09-05 Jim Blandy * configure.in: Remove --disable-debug option. The debugging support is pretty stable now, and it's confusing people. * configure: Regenerated. * HACKING: Remove -Wstrict-prototypes from the list of requested flags (to match 1998-07-30 change). 1998-07-30 Jim Blandy * configure.in: Don't use -Wstrict-prototypes after all. * configure: Regenerated. 1998-07-29 Jim Blandy * configure.in: Request more warnings. * configure: Regenerated. * HACKING: Ask people not to make changes that introduce those warnings. Now I have to go through the code and actually bring it up to standards... :( * Makefile.in, aclocal.m4, configure: Regenerated using the last public version of automake, not the hacked Cygnus version. * config.guess, config.sub, ltconfig, ltmain.sh: New versions from libtool. * configure.in, qthreads.m4: Display a message about how the threads configuration went. * aclocal.m4, configure: Regenerated. 1998-07-28 Jim Blandy Remove the TOTORO kludge. We're not doing snapshots any more, so totoro is completely uninvolved. (Poor Totoro!) * configure.in: Remove code to check the hostname and #define TOTORO. * acconfig.h: Remove comments for TOTORO symbol. * configure, Makefile.in: Regenerated. * qthreads.m4 (QTHREADS_CONFIGURE): We *can* use AC_REQUIRE here to get AC_PROG_LN_S. * aclocal.m4, configure: Regenerated. 1998-07-26 Jim Blandy Clean up thread configuration. * qthreads.m4: New file, which knows how to configure the qthreads library. * configure.in: Replace all thread package selection code. Do the --with-threads argument processing here. Enable the appropriate thread interface files in libguile. Remove all qthreads configuration code; call QTHREADS_CONFIGURE instead. Set GUILE_LIBS using the info provided by QTHREADS_CONFIGURE. * threads.m4: Removed; not used any more. * Makefile.am (aclocal_DATA): Mention qthreads.m4, not threads.m4. * Makefile.in, aclocal.m4, configure: Rgnrtd. (Sv th vwls!) Note that these were regenerated with the tools available from Cygnus's source tree, which have patches not available to the general public. I'm not sure this was a good idea; feel free to revert them to the latest released versions of the tools. Upgrade to the version of libtool available at Cygnus. See note above. * config.guess, config.sub, ltconfig, ltmain.sh: Upgraded. 1998-07-12 Mikael Djurfeldt * configure.in: Changed variable HOSTNAME --> PROG_HOSTNAME in totoro kludge. Sat Jul 11 21:54:29 1998 Mikael Djurfeldt * acconfig.h, configure.in: Define TOTORO if configuring on totoro.red-bean.com. * configure.in: Check for strdup. 1998-05-19 Mikael Djurfeldt * configure.in: Check for rl_cleanup_after_signal. 1998-05-11 Mikael Djurfeldt * configure.in: Added test for rl_getc_function. Warn if libreadline is found but not this function. 1998-05-06 Mikael Djurfeldt * configure.in: Replaced some AC_CHECK_FUNC --> AC_CHECK_FUNCS so that suitable HAVE_ symbols get defined. 1998-04-25 Mikael Djurfeldt * configure.in: Define USLEEP_RETURNS_VOID on some systems. (Thanks to Julian Satchell.) 1998-04-20 Mikael Djurfeldt * configure.in: Check for usleep; Define DECLARE_BZERO and DECLARE_USLEEP on Solaris 2.5 since it supplies those functions without declaring them. * acconfig.h: Added DECLARE_BZERO, DECLARE_USLEEP 1998-04-19 Mikael Djurfeldt * configure.in: Define HAVE_DLOPEN also when HAVE_LIBDL is defined. 1998-04-18 Mikael Djurfeldt * configure.in (GUILE_LIBS): New variable. Contains libraries which libguile needs to be linked with. Substituted into libpath.h. * threads.m4 (threads_package): Don't add $LDFLAGS and $LIBS to $cy_cv_threads_libs. 1998-04-11 Mikael Djurfeldt New libtool: 1.2 * ltconfig, ltmain.sh, config.sub, config.guess: Updated. New automake: 1.3 * Makefile.in, aclocal.m4, configure: Regenerated. * README: Mention new version numbers on libtool and automake. 1997-12-11 Tim Pierce * HACKING: Note that SSH is mandatory for CVS access. Sun Dec 7 06:11:24 1997 Gary Houston * README: using Automake 1.2d * configure.in: AC_CHECK_FUNCS: add "system". 1997-12-01 Tim Pierce * acconfig.h: Add USCORE. 1997-11-27 Mikael Djurfeldt * configure.in: Added code to enable GUILE_ISELECT on systems which have the necessary functions (gettimeofday, select). * acconfig.h: Added GUILE_ISELECT. 1997-11-24 Tim Pierce * acinclude.m4: Assume dlsym does not add underscore if cross-compiling. * aclocal.m4, configure: Regenderated. 1997-11-21 Tim Pierce * acinclude.m4 (GUILE_DLSYM_USCORE): New macro, thanks Dan Hagerty . * configure.in: Use it. * configure: Regenerated. * acconfig.h (DLSYM_ADDS_USCORE): New #define. 1997-10-26 Mikael Djurfeldt * README (libtool): Tell people to use version 1.0e. Sat Oct 25 02:50:43 1997 Jim Blandy Call the QuickThreads library libqthreads.a, not libqt.a. The old name conflicts with the Qt user interface toolkit. * threads.m4 (CY_AC_WITH_THREADS): Use new library name. * configure.in: Same. * aclocal.m4, configure: Regenerated. Thu Oct 23 00:58:06 1997 Jim Blandy * configure.in: Check for the readline library, and the termcap library (on which readline relies). * configure: Regenerated. Wed Oct 22 16:55:57 1997 Jim Blandy New libtool: 1.0e * ltconfig, ltmain.sh, config.sub, config.guess: Updated. * configure, aclocal.m4: Regenerated. 1997-10-02 Marius Vollmer Make dynamic linking work on Dec Unix. (Thanks to Clark McGrew) * configure.in: Check whether dlopen can be found without -ldl. Mon Sep 29 23:52:52 1997 Jim Blandy * Makefile.in: Regenerated with automake 1.2c. Sat Sep 27 23:01:58 1997 Jim Blandy * Makefile.am: Add new `build' subdirectory to SUBDIRS. * configure.in: Add build/Makefile to AC_OUTPUT clause. * Makefile.in, configure: Regenerated. * Makefile.in, aclocal.m4: Regenerated with automake 1.2a. Tue Sep 16 00:19:46 1997 Mikael Djurfeldt * README, ltconfig, ltmain.sh: New libtool: 1.0c. Thu Sep 11 11:28:24 1997 Mikael Djurfeldt * ltmain.sh: Added a missing '\' before \n on line 32. Thu Aug 28 23:40:43 1997 Jim Blandy New libtool: 1.0b. * ltconfig, ltmain.sh, config.guess: Freshly libtoolized. * Makefile.in, aclocal.m4, configure: Regenerated, salamander-style. Wed Aug 27 11:35:09 1997 Jim Blandy * Makefile.in: Regenerated, so it uses "tar", not "gtar". * configure.in: Use the QuickThreads assembler fragment with Irix dynamic linking support for Irix 6 as well as Irix 5. Thanks to Jesse Glick. * configure: Regenerated. Sun Aug 24 15:51:12 1997 Mikael Djurfeldt * acinclude.m4 (GUILE_NAMED_CHECK_FUNC): New macro: Tagged test, so that test for the same function can be performed multiple times. * configure.in (AC_CHECK_HEADERS): Test for rxposix.h, rx/rxposix.h. Add library rx only if regcomp can't be found without it. * acconfig.h (HAVE_REGCOMP): Added it here since autoheader misses it for some reason! Fri Aug 22 21:21:49 1997 Jim Blandy * THANKS: New file. * Makefile.in, aclocal.m4, configure: Regenerated. Wed Jul 23 20:24:27 1997 Mikael Djurfeldt * configure.in: Added thread support for the alpha architecture. configure: Regenerated. Thu Jul 17 07:56:05 1997 Gary Houston * configure.in: use AC_CHECK_FUNCS for sethostent etc., so scmconfig.h is updated with the test results. this may disable one of the cygwin hacks. Fri Jul 11 00:18:19 1997 Jim Blandy Changes to compile under gnu-win32, from Marcus Daniels: * configure.in: When sys/un.h exists, define HAVE_UNIX_DOMAIN_SOCKETS to indicate that Unix domain sockets will work. Check for socketpair, getgroups, setwent, pause, and tzset (cygwin currently lacks these them). Check for sethostent endhostent getnetent setnetent endnetent getprotoent endprotoent getservent endservent getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof (cygwin currently lacks them). In the case of cygwin, temporarily prefix these functions with "cygwin32_", the way that netdb.h does. Don't define HAVE_REGCOMP unless both regcomp and regex.h are available (cygwin b18 came distributed without a working regex.h file). * acconfig.h (HAVE_UNIX_DOMAIN_SOCKETS): Add this. * configure: Regenerated. Wed Jul 2 12:28:40 1997 Tim Pierce * ltmain.sh: Remove any trailing colon on $shlibpath_var (i.e. LD_LIBRARY_PATH) for braindamaged linkers that choke on it. Patch sent to bug-libtool. Sat Jun 28 16:13:43 1997 Tim Pierce * configure.in: Add alloca.o explicitly to LIBOBJS (thanks Eric Backus for reporting this problem and suggesting a fix). * configure: Regenerated. Thu Jun 26 20:43:31 1997 Jim Blandy * Guile 1.2 released. * configure.in: Check for librx after libm; fundamentals need to come first. * configure: Regenerated. Tue Jun 24 13:34:20 1997 Tim Pierce * aclocal.m4 (AM_PATH_PROG_LD): Change `ac_cv_path_LD' typo to `am_cv_path_LD'. * configure: Regenerated. Sun Jun 22 15:43:07 1997 Jim Blandy Try to detect when people are using one version of libguile and a different version of ice-9. People have been skewing things and sending in bug reports. * configure.in: Provide libguile its version information through a separate header file generated by the Makefile, not through scmconfig.h. (GUILE_MAJOR_VERSION, GUILE_MINOR_VERSION, GUILE_VERSION): AC_SUBST these, instead of AC_DEFINE'ing them. (GUILE_STAMP): New AC_SUBST: the time we configured the tree. (AC_OUTPUT): Create ice-9/version.scm. * acconfig.h (GUILE_MAJOR_VERSION, GUILE_MINOR_VERSION, GUILE_VERSION): Deleted. * Makefile.in: Regenerated. * aclocal.m4: Regenerated, using the libtool 0.9h m4 macros. * Makefile.am (EXTRA_DIST): Include acconfig.h in the distribution. * Makefile.in: Regenerated. Sat Jun 21 00:14:07 1997 Jim Blandy * ltmain.sh (line 1191): Don't forget 'test' in if statement. * ltconfig, ltmain.sh: libtoolized, using libtool 0.9h. Wed Jun 11 00:34:01 1997 Jim Blandy * ltconfig, ltmain.sh, config.guess: New files from libtool 0.9g. * configure.in: By default, include functions in Guile to allow linking with dynamic libraries at run-time. In other words, --enable-dynamic-linking is now the default. * configure: Rebuilt. * configure.in: Remove space between AC_CHECK_LIB and opening paren in check for Rx. * configure: Regenerated. * configure.in: Remove all mention of xtra_PLUGIN_guile_libs. It's never used. * configure, Makefile.in: Regenerated. Tue Jun 10 23:37:12 1997 Jim Blandy * configure.in: Move checks for libraries (-lm, -lnsl, -lsocket, -dl, -dld) before checks for functions. * configure: Regenerated. Mon Jun 9 02:35:46 1997 Tim Pierce * config.guess: New copy from autoconf-2.12, which recognizes OpenBSD. Tue Jun 3 16:34:19 1997 Jim Blandy * configure.in: Check for Rx, so we will use its routines (which I pretty much trust) if it is installed. * configure: Regenerated. Sat May 31 03:48:45 1997 Gary Houston * acconfig.h: mention HAVE_RESTARTS. * configure.in: check for sigaction and restartable system calls. Tue May 27 22:47:52 1997 Tim Pierce * configure.in: Check for presence of regcomp. * configure: Regenerated. Mon May 26 12:14:20 1997 Jim Blandy * COPYING: New address for FSF. * configure.in: We don't need to add fileblocks.o to LIBOBJS if struct stat doesn't have the st_blocks field. We take care of that case in the code. Replace AC_STRUCT_ST_BLOCKS with its definition, edited appropriately. (Bernard URBAN) * configure: Regenerated. Sat May 17 13:49:28 1997 Jim Blandy * configure.in: Don't link against -lnsl or -lsocket unless we actually need to. This causes trouble on Irix. (Thanks to Larry Schwimmer.) * config.sub: Get newer version, that recognizes the i686. Fri May 16 17:26:10 1997 Jim Blandy * README: Changed Mikael's threads work attribution in order to sooth Anthony's enormous, but wounded, ego. Fri May 16 17:26:53 1997 Jim Blandy Just kidding!!! Fri May 16 04:24:48 1997 Jim Blandy Guile 1.1 released. * GUILE-VERSION: Bump to 1.1. Tue May 13 16:34:40 1997 Jim Blandy Switch to automake-1.1p. * Makefile.in, aclocal.m4, configure: Regenerated. Mon May 12 18:29:45 1997 Jim Blandy * threads.m4: Copy Anthony's change here, so it'll actually survive. Thu May 8 11:48:40 1997 Anthony Green * aclocal.m4: Fixes for building with coop threads in a seperate compilation directory. * configure: Rebuilt. Fri May 2 16:24:15 1997 Jim Blandy Upgrade to libtool 0.9e. * ltconfig, ltmain.sh, config.guess, config.sub: New versions, supplied by libtool. * configure.in: When configuring qt, sunos needs the underscore files; Solaris and Linux both need the normal files. * configure: Reebilt. Thu May 1 15:35:49 1997 Jim Blandy * configure.in: Get the paths for qt's md files right, so it can build correctly when using a separate compilation directory. * configure: Regenerated. Thu Apr 24 01:20:34 1997 Jim Blandy Get threads to work again. * Makefile.am (SUBDIRS): List libguile last, so qt gets built first. * Makefile.in: Regenerated. * aclocal.m4, configure: Regenerate, with modern definition of CY_AC_WITH_THREADS. Where did the old text come from? Creepy... Reduced Guile distribution: one configure script, no plugins. * configure.in: Merged the old text from qt/configure.in and libguile/configure.in; Tom Tromey says automake only wants one configure.in script. This seems fishy, but... * Makefile.am: List the subdirectories explicitly; no more PLUGIN gubbish. * acconfig.h, acinclude.m4: Moved here from libguile, since libguile's configure script lives here now. * AUTHORS, INSTALL, README: Updated. * Makefile.in, aclocal.m4 configure: Regenerated. Just like amputated amphibian limbs. Tue Apr 22 16:57:38 1997 Jim Blandy * newdoc/ref/Makefile.am (dist_texis): Distribute the index files. * newdoc/ref/Makefile.in: Regenerated. Mon Apr 14 18:51:25 1997 Jim Blandy * threads.m4 (CY_AC_WITH_THREADS): When using coop threads, no need to link against libthreads; the files it used to contain are now a part of libguile. Sun Apr 13 22:14:10 1997 Jim Blandy * guile.m4: Revert change of Mar 15, and use the new 'no-define' argument to the AM_INIT_AUTOMAKE macro. Fri Apr 11 15:43:07 1997 Jim Blandy * ltconfig, ltmain.sh: Upgraded libtool files to 0.9d. * README: Say where to find libtool 0.9d. Wed Apr 9 17:51:13 1997 Jim Blandy Changes to work with automake-1.1n, which has better libtool support. Also use libtool 0.8. * README: Note new version numbers for automake and libtool. * missing: New file required by new automake. * Makefile.in: Regenerated. Sat Apr 5 16:48:38 1997 Jim Blandy * newdoc/ref/scheme.texi (set-object-property!): Fix function name. * Makefile.am: Omit doc subtree. * configure.in: Omit makefiles in doc subtree. * Makefile.in, configure: Rebuilt. Sat Mar 15 01:11:44 1997 Mikael Djurfeldt * guile.m4 (AM_INIT_GUILE_MODULE): Replaced AM_INIT_AUTOMAKE macro with its definition and commented out definition of PACKAGE. This changed seemed necessary after having removed PACKAGE from libguile/acconfig.h. Mon Feb 24 21:43:26 1997 Mikael Djurfeldt * ltconfig, ltmain.sh: New versions from libtool-0.9. * configure.in: Added AM_MAINTAINER_MODE Fri Feb 7 17:57:46 1997 Jim Blandy * config.sub, config.guess: New versions, that handle i686, etc. Thu Jan 23 07:06:15 1997 Mark Galassi * newdoc/tutorial/guile-tut.texi: started checking in the Guile tutorial rewrite, but have not merged much into it yet. Tue Jan 21 17:28:40 1997 Mark Galassi * newdoc/ref/guile-ref.texi: started checking in parts of the reference manual re-write. Sat Jan 11 14:40:17 1997 Marius Vollmer * ltconfig, ltmain.sh: New files for libtool support. libguile, rx, gh and gtcltk-lib can now be build as shared libraries. * Makefile.am (EXTRA_DIST): Added ltconfig and ltmain.sh Sun Jan 5 16:57:10 1997 Jim Blandy * Guile 1.0 released. This is the first release by the Free Software Foundation; Cygnus has also released earlier versions of Guile. * GUILE-VERSION: Updated version number. * NEWS: Added comments for all the user-visible changes marked in the ChangeLogs. * README: Updated for release. Thu Dec 12 00:14:32 1996 Gary Houston * scsh: new directory. Mon Dec 2 17:33:04 1996 Tom Tromey * configure.in: Generate doc/guile-programmer/Makefile and doc/guile-user/Makefile. Sat Nov 30 23:45:54 1996 Tom Tromey * aclocal.m4: Now automatically generated by aclocal. * threads.m4: New file. * guile.m4: New file. * Makefile.am, doc/Makefile.am: New files. * configure.in: Updated for Automake. Avoid excessively verbose "greet" messages. Wed Oct 16 07:32:14 1996 Mark Galassi * lgh: directory renamed to gh, along with all prefixes of the high level library procedures. Thu Oct 10 14:37:43 1996 Jim Blandy * Makefile.in (TAGS tags): Find the source files in $srcdir. Wed Oct 9 19:37:14 1996 Jim Blandy * Makefile.in (DISTFILES): Add AUTHORS and aclocal.m4. Tue Oct 1 00:13:55 1996 Mikael Djurfeldt * configure.in: Added some configuration magic from the Cygnus distribution. * aclocal.m4: New file. For now used for thread support configuration. Fri Sep 13 14:39:30 1996 Mark Galassi * Makefile.in (DISTFILES): added mkinstalldirs to the DISTFILES * PLUGIN: changed the PLUGIN/REQ files in the ice-9 and lgh directories, to arrange for lgh to the last thing configured/built. Wed Sep 11 21:11:33 1996 Mark Galassi * lgh/: added the directory in which I implement the high level libguile library (lgh_) for this release of Guile. See the ChangeLog in there for further details. Wed Sep 11 16:12:53 1996 Mark Galassi * doc/ (guile-user and guile-programmer): added the guile-user and guile-programmer directories which contain the user and programmer manuals. See the ChangeLog entries there for detail. Wed Sep 11 14:33:49 1996 Jim Blandy * Makefile.in (distclean): Don't forget to delete doc/Makefile. * Makefile.in (distclean): Don't forget to delete config.build-subdirs. Thu Sep 5 17:36:15 1996 Jim Blandy * Makefile.in (tags): New name for `TAGS' target, which will always run the commands. Thu Sep 5 09:56:50 1996 Jim Blandy * README: Doc fixes. Fri Aug 30 16:56:27 1996 Jim Blandy * Makefile.in (TAGS): Produce a single tags file for all of Guile. Thu Aug 15 19:03:03 1996 Jim Blandy * configure.in: Check for -ldl, so the check for Tcl won't fail spuriously. Thu Aug 15 01:29:29 1996 Jim Blandy Change the way we decide whether to build gtcltk-lib, so that it's omitted from the build process when appropriate, but never from the dist process. * configure.in: Don't edit all_subdirs depending on the availability of Tk; let that be the list of all PLUGIN subdirectories present, as it used to be. Instead, edit a new variable, build_subdirs; write its final value, the list of subdirs we do want to compile in, to config.build-subdirs. Substitute that into the top-level Makefile too. * Makefile.in (subdirs): Set this to @build_subdirs@, so we only recurse on the subdirectories we should build. (distdirs): Set this to @existingdirs@, so it includes the subdirs we decided not to build. * doc/gtcltk.texi: File resurrected from old Guile releases. * doc/Makefile.in (info): Build the gtcltk documentation. (DIST_FILES): Include it in the distribution. * configure.in: If we can find the library for tcl7.5, build gtcltk-lib. Call AC_PROG_CC, to help run that test with the right compiler (not sure this is necessary). Mon Aug 12 15:09:37 1996 Jim Blandy * NEWS: Fix bug reporting address. Fri Aug 9 15:58:42 1996 Jim Blandy * AUTHORS: New file, in accordance with the GNU maintainers' standards. Tue Aug 6 14:40:44 1996 Jim Blandy * README: Renamed from ANNOUNCE; include bug report address, description, and short tour. * INSTALL: Renamed from BUILDING. * NEWS: New file. * Makefile.in (DISTFILES): Update appropriately. Thu Aug 1 02:31:53 1996 Jim Blandy * doc/Makefile.in: Added pattern targets for creating DVI and PostScript files. (%.ps, %.dvi, %.txt): New targets. (DVIPS, TEXI2DVI): New variables. * GUILE-VERSION: Updated to 1.0b3. Rehashed distribution system, in preparation for nightly snapshots. Other changes in subdirectories. * Makefile.in (dist): Rewritten --- the old target was out of date, dependent on files that we don't have, and relied on GNU tar. The new target is simpler. (VERSION, srcdir, dist_dirs): New variables. (DISTFILES): Renamed from localfiles. Added GUILE-VERSION and TODO. (localtreats): Variable removed. We don't have this file. (info): cd to doc and make info there; don't make info in every ${subdir}; those Makefiles don't know what to do. (distname, distdir, treats, announcefile): Variables removed. (manifest-file): Target removed. (dist-dir): New target, responsible for distributable files in this directory. (GZIP, GZIP_EXT, TAR_VERBOSE, DIST_NAME): New variables, controlling the 'dist' target. * configure.in: Substitute GUILE-VERSION into the top-level Makefile. Build doc/Makefile from doc/Makefile.in. * doc/Makefile.in: New file. ;; Local Variables: ;; coding: utf-8 ;; End: guile-1.8-1.8.8+1.orig/GUILE-VERSION000066400000000000000000000045421155472604000161600ustar00rootroot00000000000000# -*-shell-script-*- GUILE_MAJOR_VERSION=1 GUILE_MINOR_VERSION=8 GUILE_MICRO_VERSION=8 GUILE_EFFECTIVE_VERSION=${GUILE_MAJOR_VERSION}.${GUILE_MINOR_VERSION} GUILE_VERSION=${GUILE_EFFECTIVE_VERSION}.${GUILE_MICRO_VERSION} # For automake. VERSION=${GUILE_VERSION} PACKAGE=guile # All of the shared lib versioning info. Right now, for this to work # properly, you'll also need to add AC_SUBST calls to the right place # in configure.in, add the right -version-info statement to your # Makefile.am The only library not handled here is # guile-readline/libguile-readline. It is handled in # ./guile-readline/LIBGUILEREADLINE-VERSION. # See libtool info pages for more information on how and when to # change these. LIBGUILE_INTERFACE_CURRENT=21 LIBGUILE_INTERFACE_REVISION=0 LIBGUILE_INTERFACE_AGE=4 LIBGUILE_INTERFACE="${LIBGUILE_INTERFACE_CURRENT}:${LIBGUILE_INTERFACE_REVISION}:${LIBGUILE_INTERFACE_AGE}" # NOTE: You must edit each corresponding .scm file (the one that # dynamic-links the relevant lib) if you change the versioning # information here to make sure the dynamic-link explicitly loads the # right shared lib version. LIBGUILE_SRFI_SRFI_1_MAJOR=3 LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT=3 LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION=2 LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE=0 LIBGUILE_SRFI_SRFI_1_INTERFACE="${LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE}" LIBGUILE_SRFI_SRFI_4_MAJOR=3 LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT=3 LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION=1 LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE=0 LIBGUILE_SRFI_SRFI_4_INTERFACE="${LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE}" LIBGUILE_SRFI_SRFI_13_14_MAJOR=3 LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT=3 LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION=1 LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE=0 LIBGUILE_SRFI_SRFI_13_14_INTERFACE="${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE}" LIBGUILE_SRFI_SRFI_60_MAJOR=2 LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT=2 LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION=2 LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE=0 LIBGUILE_SRFI_SRFI_60_INTERFACE="${LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT}:${LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION}:${LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE}" guile-1.8-1.8.8+1.orig/HACKING000066400000000000000000000277611155472604000152440ustar00rootroot00000000000000-*-text-*- Guile Hacking Guide Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2008 Free software Foundation, Inc. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and permission notice are preserved, and that the distributor grants the recipient permission for further redistribution as permitted by this notice. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them, and that any new or changed statements about the activities of the Free Software Foundation are approved by the Foundation. What to Hack ========================================================= You can hack whatever you want, thank GNU. However, to see what others have indicated as their interest (and avoid potential wasteful duplication of effort), see file TODO. Note that the version you find may be out of date; a CVS checkout is recommended: see below for details (see also the files ANON-CVS and SNAPSHOTS). It's also a good idea to join the guile-devel@gnu.org mailing list. See http://www.gnu.org/software/guile/mail/mail.html for more info. Hacking It Yourself ================================================== When Guile is obtained from Git, a few extra steps must be taken before the usual configure, make, make install. You will need to have up-to-date versions of the tools as listed below, correctly installed. Sometimes older or newer versions will work. (See below for versions to avoid.) Then you must run the autogen.sh script, as described below. The same procedure can be used to regenerate the files in released versions of Guile. In that case the headers of the original generated files (e.g., configure, Makefile.in, ltmain.sh) can be used to identify which tool versions may be required. Autoconf --- a system for automatically generating `configure' scripts from templates which list the non-portable features a program would like to use. Available in "ftp://ftp.gnu.org/pub/gnu/autoconf" Automake --- a system for automatically generating Makefiles that conform to the (rather Byzantine) GNU coding standards. The nice thing is that it takes care of hairy targets like 'make dist' and 'make distclean', and automatically generates Makefile dependencies. Automake is available in "ftp://ftp.gnu.org/pub/gnu/automake" libtool --- a system for managing the zillion hairy options needed on various systems to produce shared libraries. Available in "ftp://ftp.gnu.org/pub/gnu/libtool". Version 1.5.26 (or later) is needed for correct AIX support. gettext --- a system for rigging a program so that it can output its messages in the local tongue. Guile presently only exports the gettext functionality to Scheme, it does not use it itself. flex --- a scanner generator. It's probably not essential to have the latest version. One false move and you will be lost in a little maze of automatically generated files, all different. Here is the authoritative list of tool/version/platform tuples that have been known to cause problems, and a short description of the problem. - automake 1.4 adds extraneous rules to the top-level Makefile if you specify specific Makefiles to rebuild on the command line. - automake 1.4-p4 (debian "1:1.4-p4-1.1") all platforms automake "include" facility does not recognize filenames w/ "-". - libtool 1.4 uses acconfig.h, which is deprecated by newest autoconf (which constructs the equivalent through 3rd arg of AC_DEFINE forms). - autoreconf from autoconf prior to 2.59 will run gettextize, which will mess up the Guile tree. - (add here.) Sample GDB Initialization File========================================= Here is a sample .gdbinit posted by Bill Schottstaedt (modified to use `set' instead of `call' in some places): define gp set gdb_print($arg0) print gdb_output end document gp Executes (object->string arg) end define ge call gdb_read($arg0) call gdb_eval(gdb_result) set gdb_print(gdb_result) print gdb_output end document ge Executes (print (eval (read arg))): ge "(+ 1 2)" => 3 end define gh call g_help(scm_str2symbol($arg0), 20) set gdb_print($1) print gdb_output end document gh Prints help string for arg: gh "enved-target" end Bill further writes: so in gdb if you see something useless like: #32 0x081ae8f4 in scm_primitive_load (filename=1112137128) at load.c:129 You can get the file name with gp: (gdb) gp 1112137128 $1 = 0x40853fac "\"/home/bil/test/share/guile/1.5.0/ice-9/session.scm\"" Contributing Your Changes ============================================ - If you have put together a change that meets the coding standards described below, we encourage you to submit it to Guile. Post your patch to guile-devel@gnu.org. - We prefer patches generated using 'git format-patch'. - Provide a description in the commit message, like so: 1-line description of change More extensive discussion of your change. Document why you are changing things. * filename (function name): file specific change comments. - For proper credit, also make sure you update the AUTHORS file (for new files for which you've assigned copyright to the FSF), or the THANKS file (for everything else). Coding standards ===================================================== - As for any part of Project GNU, changes to Guile should follow the GNU coding standards. The standards are available via anonymous FTP from prep.ai.mit.edu, as /pub/gnu/standards/standards.texi and make-stds.texi. - The Guile tree should compile without warnings under the following GCC switches, which are the default in the current configure script: -O2 -Wall -Wpointer-arith -Wmissing-prototypes To make sure of this, you can use the --enable-error-on-warning option to configure. This option will make GCC fail if it hits a warning. Note that the warnings generated vary from one version of GCC to the next, and from one architecture to the next (apparently). To provide a concrete common standard, Guile should compile without warnings from GCC 2.7.2.3 in a Red Hat 5.2 i386 Linux machine. Furthermore, each developer should pursue any additional warnings noted by on their compiler. This means that people using more stringent compilers will have more work to do, and assures that everyone won't switch to the most lenient compiler they can find. :) - If you add code which uses functions or other features that are not entirely portable, please make sure the rest of Guile will still function properly on systems where they are missing. This usually entails adding a test to configure.in, and then adding #ifdefs to your code to disable it if the system's features are missing. - The normal way of removing a function, macro or variable is to mark it as "deprecated", keep it for a while, and remove it in a later release. If a function or macro is marked as "deprecated" it indicates that people shouldn't use it in new programs, and should try to remove it in old. Make sure that an alternative exists unless it is our purpose to remove functionality. Don't deprecate definitions if it is unclear when they will be removed. (This is to ensure that a valid way of implementing some functionality always exists.) When deprecating a definition, always follow this procedure: 1. Mark the definition using #if (SCM_DEBUG_DEPRECATED == 0) ... #endif or, for Scheme code, wrap it using (begin-deprecated ...) 2. Make the deprecated code issue a warning when it is used, by using scm_c_issue_deprecation_warning (in C) or issue-deprecation-warning (in Scheme). 3. Write a comment at the definition explaining how a programmer can manage without the deprecated definition. 4. Add an entry that the definition has been deprecated in NEWS and explain what do do instead. 5. In file TODO, there is a list of releases with reminders about what to do at each release. Add a reminder about the removal of the deprecated defintion at the appropriate release. - Write commit messages for functions written in C using the functions' C names, and write entries for functions written in Scheme using the functions' Scheme names. For example, * foo.c: Moved scm_procedure_documentation from eval.c. is preferred over * foo.c: Moved procedure-documentation from eval.c. Changes like adding this line are special: SCM_PROC (s_map_in_order, "map-in-order", 2, 0, 1, scm_map); Since the change here is about the name itself --- we're adding a new alias for scm_map that guarantees the order in which we process list elements, but we're not changing scm_map at all --- it's appropriate to use the Scheme name in the commit message. - Make sure you have papers from people before integrating their changes or contributions. This is very frustrating, but very important to do right. From maintain.texi, "Information for Maintainers of GNU Software": When incorporating changes from other people, make sure to follow the correct procedures. Doing this ensures that the FSF has the legal right to distribute and defend GNU software. For the sake of registering the copyright on later versions ofthe software you need to keep track of each person who makes significant changes. A change of ten lines or so, or a few such changes, in a large program is not significant. *Before* incorporating significant changes, make sure that the person has signed copyright papers, and that the Free Software Foundation has received them. If you receive contributions you want to use from someone, let me know and I'll take care of the administrivia. Put the contributions aside until we have the necessary papers. Once you accept a contribution, be sure to keep the files AUTHORS and THANKS uptodate. - When you make substantial changes to a file, add the current year to the list of years in the copyright notice at the top of the file. - When you get bug reports or patches from people, be sure to list them in THANKS. Naming conventions ================================================= We use certain naming conventions to structure the considerable number of global identifiers. All identifiers should be either all lower case or all upper case. Syllables are separated by underscores `_'. All non-static identifiers should start with scm_ or SCM_. Then might follow zero or more syllables giving the category of the identifier. The currently used category identifiers are t - type name c,C - something with a interface suited for C use. This is used to name functions that behave like Scheme primitives but have a more C friendly calling convention. i,I - internal to libguile. It is global, but not considered part of the libguile API. f - a SCM variable pointing to a Scheme function object. F - a bit mask for a flag. m - a macro transformer procedure n,N - a count of something s - a constant C string k - a SCM variable pointing to a keyword. sym - a SCM variable pointing to a symbol. var - a SCM variable pointing to a variable object. The follwing syllables also have a technical meaning: str - this denotes a zero terminated C string mem - a C string with an explicit count See also the file `devel/names.text'. Helpful hints ======================================================== - [From Mikael Djurfeldt] When working on the Guile internals, it is quite often practical to implement a scheme-level procedure which helps you examine the feature you're working on. Examples of such procedures are: pt-size, debug-hand and current-pstate. I've now put #ifdef GUILE_DEBUG around all such procedures, so that they are not compiled into the "normal" Guile library. Please do the same when you add new procedures/C functions for debugging purpose. You can define the GUILE_DEBUG flag by passing --enable-guile-debug to the configure script. Jim Blandy, and others guile-1.8-1.8.8+1.orig/LICENSE000066400000000000000000000001661155472604000152500ustar00rootroot00000000000000Guile is covered under the terms of the GNU Lesser General Public License, version 2.1 or later. See COPYING.LESSER. guile-1.8-1.8.8+1.orig/Makefile.am000066400000000000000000000027521155472604000163020ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in. ## ## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006, 2007, 2008 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA # want automake 1.10 or higher so that AM_GNU_GETTEXT can tell automake that # config.rpath is needed # AUTOMAKE_OPTIONS = 1.10 SUBDIRS = oop libguile ice-9 guile-config guile-readline emacs \ scripts srfi doc examples test-suite benchmark-suite lang am bin_SCRIPTS = guile-tools include_HEADERS = libguile.h EXTRA_DIST = LICENSE HACKING GUILE-VERSION guile-1.8.pc.in \ ChangeLog-2008 m4/autobuild.m4 TESTS = check-guile ACLOCAL_AMFLAGS = -I m4 DISTCLEANFILES = check-guile.log pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = guile-1.8.pc # Makefile.am ends here guile-1.8-1.8.8+1.orig/NEWS000066400000000000000000010362221155472604000147450ustar00rootroot00000000000000Guile NEWS --- history of user-visible changes. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. See the end for copying conditions. Please send Guile bug reports to bug-guile@gnu.org. Changes in 1.8.8 (since 1.8.7) * Bugs fixed ** Fix possible buffer overruns when parsing numbers ** Fix random number generator on 64-bit platforms Previously the `scm_c_random' function would crash or return only 32-bit worth of randomness. In addition, the new `scm_c_random64' function explicitly returns 64 bits of randomness. ** Add missing range checks in `vector-move-left!' and `vector-move-right!' Previously these procedures could write past the end of a vector. ** Avoid clash with system setjmp/longjmp on IA64 ** Don't dynamically link an extension that is already registered ** Fix `wrong type arg' exceptions with IPv6 addresses ** Fix typos in `(srfi srfi-19)' ** Have `(srfi srfi-35)' provide named struct vtables ** Fix C documentation extraction ("snarfing") with recent GCC versions ** Fix some Interix build problems ** Fix Tru64 build problems ** Fix GC-related build issues on Solaris 10 x86 with Sun Studio 12 ** Several small documentation fixes Changes in 1.8.7 (since 1.8.6) * Bugs fixed ** Fix compilation with `--disable-deprecated' ** Fix %fast-slot-ref/set!, to avoid possible segmentation fault ** Fix MinGW build problem caused by HAVE_STRUCT_TIMESPEC confusion ** Fix build problem when scm_t_timespec is different from struct timespec ** Fix build when compiled with -Wundef -Werror ** More build fixes for `alphaev56-dec-osf5.1b' (Tru64) ** Build fixes for `powerpc-ibm-aix5.3.0.0' (AIX 5.3) ** With GCC, always compile with `-mieee' on `alpha*' and `sh*' ** Better diagnose broken `(strftime "%z" ...)' in `time.test' (bug #24130) ** Fix parsing of SRFI-88/postfix keywords longer than 128 characters ** Fix reading of complex numbers where both parts are inexact decimals ** Allow @ macro to work with (ice-9 syncase) Previously, use of the @ macro in a module whose code is being transformed by (ice-9 syncase) would cause an "Invalid syntax" error. Now it works as you would expect (giving the value of the specified module binding). ** Have `scm_take_locale_symbol ()' return an interned symbol (bug #25865) ** Fix potential deadlocks when running on multiple threads ** Fix problems building with the i586-mingw32msvc cross-compiler It's now possible to build Guile for Windows by using the i586-mingw32msvc cross-compiler on GNU/Linux. This kind of build produces DLLs and a main program that can be copied to and used on a Windows PC. For how to do this, see the `Cross building Guile' section in `README'. Changes in 1.8.6 (since 1.8.5) * New features (see the manual for details) ** New convenience function `scm_c_symbol_length ()' ** Single stepping through code from Emacs When you use GDS to evaluate Scheme code from Emacs, you can now use `C-u' to indicate that you want to single step through that code. See `Evaluating Scheme Code' in the manual for more details. ** New "guile(1)" man page! * Changes to the distribution ** Automake's `AM_MAINTAINER_MODE' is no longer used Thus, the `--enable-maintainer-mode' configure option is no longer available: Guile is now always configured in "maintainer mode". ** `ChangeLog' files are no longer updated Instead, changes are detailed in the version control system's logs. See the top-level `ChangeLog' files for details. * Bugs fixed ** `symbol->string' now returns a read-only string, as per R5RS ** Fix incorrect handling of the FLAGS argument of `fold-matches' ** `guile-config link' now prints `-L$libdir' before `-lguile' ** Fix memory corruption involving GOOPS' `class-redefinition' ** Fix possible deadlock in `mutex-lock' ** Fix build issue on Tru64 and ia64-hp-hpux11.23 (`SCM_UNPACK' macro) ** Fix build issue on mips, mipsel, powerpc and ia64 (stack direction) ** Fix build issue on hppa2.0w-hp-hpux11.11 (`dirent64' and `readdir64_r') ** Fix build issue on i386-unknown-freebsd7.0 ("break strict-aliasing rules") ** Fix misleading output from `(help rationalize)' ** Fix build failure on Debian hppa architecture (bad stack growth detection) ** Fix `gcd' when called with a single, negative argument. ** Fix `Stack overflow' errors seen when building on some platforms ** Fix bug when `scm_with_guile ()' was called several times from the same thread ** The handler of SRFI-34 `with-exception-handler' is now invoked in the dynamic environment of the call to `raise' ** Fix potential deadlock in `make-struct' ** Fix compilation problem with libltdl from Libtool 2.2.x ** Fix sloppy bound checking in `string-{ref,set!}' with the empty string Changes in 1.8.5 (since 1.8.4) * Infrastructure changes ** Guile repository switched from CVS to Git The new repository can be accessed using "git-clone git://git.sv.gnu.org/guile.git", or can be browsed on-line at http://git.sv.gnu.org/gitweb/?p=guile.git . See `README' for details. ** Add support for `pkg-config' See "Autoconf Support" in the manual for details. * New modules (see the manual for details) ** `(srfi srfi-88)' * New features (see the manual for details) ** New `postfix' read option, for SRFI-88 keyword syntax ** Some I/O primitives have been inlined, which improves I/O performance ** New object-based traps infrastructure This is a GOOPS-based infrastructure that builds on Guile's low-level evaluator trap calls and facilitates the development of debugging features like single-stepping, breakpoints, tracing and profiling. See the `Traps' node of the manual for details. ** New support for working on Guile code from within Emacs Guile now incorporates the `GDS' library (previously distributed separately) for working on Guile code from within Emacs. See the `Using Guile In Emacs' node of the manual for details. * Bugs fixed ** `scm_add_slot ()' no longer segfaults (fixes bug #22369) ** Fixed `(ice-9 match)' for patterns like `((_ ...) ...)' Previously, expressions like `(match '((foo) (bar)) (((_ ...) ...) #t))' would trigger an unbound variable error for `match:andmap'. ** `(oop goops describe)' now properly provides the `describe' feature ** Fixed `args-fold' from `(srfi srfi-37)' Previously, parsing short option names of argument-less options would lead to a stack overflow. ** `(srfi srfi-35)' is now visible through `cond-expand' ** Fixed type-checking for the second argument of `eval' ** Fixed type-checking for SRFI-1 `partition' ** Fixed `struct-ref' and `struct-set!' on "light structs" ** Honor struct field access rights in GOOPS ** Changed the storage strategy of source properties, which fixes a deadlock ** Allow compilation of Guile-using programs in C99 mode with GCC 4.3 and later ** Fixed build issue for GNU/Linux on IA64 ** Fixed build issues on NetBSD 1.6 ** Fixed build issue on Solaris 2.10 x86_64 ** Fixed build issue with DEC/Compaq/HP's compiler ** Fixed `scm_from_complex_double' build issue on FreeBSD ** Fixed `alloca' build issue on FreeBSD 6 ** Removed use of non-portable makefile constructs ** Fixed shadowing of libc's on Tru64, which broke compilation ** Make sure all tests honor `$TMPDIR' Changes in 1.8.4 (since 1.8.3) * Bugs fixed ** CR (ASCII 0x0d) is (again) recognized as a token delimiter by the reader ** Fixed a segmentation fault which occurred when displaying the backtrace of a stack with a promise object (made by `delay') in it. ** Make `accept' leave guile mode while blocking ** `scm_c_read ()' and `scm_c_write ()' now type-check their port argument ** Fixed a build problem on AIX (use of func_data identifier) ** Fixed a segmentation fault which occurred when hashx-ref or hashx-set! was called with an associator proc that returns neither a pair nor #f. ** Secondary threads now always return a valid module for (current-module). ** Avoid MacOS build problems caused by incorrect combination of "64" system and library calls. ** `guile-snarf' now honors `$TMPDIR' ** `guile-config compile' now reports CPPFLAGS used at compile-time ** Fixed build with Sun Studio (Solaris 9) ** Fixed wrong-type-arg errors when creating zero length SRFI-4 uniform vectors on AIX. ** Fixed a deadlock that occurs upon GC with multiple threads. ** Fixed compile problem with GCC on Solaris and AIX (use of _Complex_I) ** Fixed autotool-derived build problems on AIX 6.1. ** Fixed NetBSD/alpha support ** Fixed MacOS build problem caused by use of rl_get_keymap(_name) * New modules (see the manual for details) ** `(srfi srfi-69)' * Documentation fixes and improvements ** Removed premature breakpoint documentation The features described are not available in the series of 1.8.x releases, so the documentation was misleading and has been removed. ** More about Guile's default *random-state* variable ** GOOPS: more about how to use `next-method' * Changes to the distribution ** Corrected a few files that referred incorrectly to the old GPL + special exception licence In fact Guile since 1.8.0 has been licensed with the GNU Lesser General Public License, and the few incorrect files have now been fixed to agree with the rest of the Guile distribution. ** Removed unnecessary extra copies of COPYING* The distribution now contains a single COPYING.LESSER at its top level. Changes in 1.8.3 (since 1.8.2) * New modules (see the manual for details) ** `(srfi srfi-35)' ** `(srfi srfi-37)' * Bugs fixed ** The `(ice-9 slib)' module now works as expected ** Expressions like "(set! 'x #t)" no longer yield a crash ** Warnings about duplicate bindings now go to stderr ** A memory leak in `make-socket-address' was fixed ** Alignment issues (e.g., on SPARC) in network routines were fixed ** A threading issue that showed up at least on NetBSD was fixed ** Build problems on Solaris and IRIX fixed * Implementation improvements ** The reader is now faster, which reduces startup time ** Procedures returned by `record-accessor' and `record-modifier' are faster Changes in 1.8.2 (since 1.8.1): * New procedures (see the manual for details) ** set-program-arguments ** make-vtable * Incompatible changes ** The body of a top-level `define' no longer sees the binding being created In a top-level `define', the binding being created is no longer visible from the `define' body. This breaks code like "(define foo (begin (set! foo 1) (+ foo 1)))", where `foo' is now unbound in the body. However, such code was not R5RS-compliant anyway, per Section 5.2.1. * Bugs fixed ** Fractions were not `equal?' if stored in unreduced form. (A subtle problem, since printing a value reduced it, making it work.) ** srfi-60 `copy-bit' failed on 64-bit systems ** "guile --use-srfi" option at the REPL can replace core functions (Programs run with that option were ok, but in the interactive REPL the core bindings got priority, preventing SRFI replacements or extensions.) ** `regexp-exec' doesn't abort() on #\nul in the input or bad flags arg ** `kill' on mingw throws an error for a PID other than oneself ** Procedure names are attached to procedure-with-setters ** Array read syntax works with negative lower bound ** `array-in-bounds?' fix if an array has different lower bounds on each index ** `*' returns exact 0 for "(* inexact 0)" This follows what it always did for "(* 0 inexact)". ** SRFI-19: Value returned by `(current-time time-process)' was incorrect ** SRFI-19: `date->julian-day' did not account for timezone offset ** `ttyname' no longer crashes when passed a non-tty argument ** `inet-ntop' no longer crashes on SPARC when passed an `AF_INET' address ** Small memory leaks have been fixed in `make-fluid' and `add-history' ** GOOPS: Fixed a bug in `method-more-specific?' ** Build problems on Solaris fixed ** Build problems on HP-UX IA64 fixed ** Build problems on MinGW fixed Changes in 1.8.1 (since 1.8.0): * LFS functions are now used to access 64-bit files on 32-bit systems. * New procedures (see the manual for details) ** primitive-_exit - [Scheme] the-root-module ** scm_primitive__exit - [C] ** make-completion-function - [Scheme] (ice-9 readline) ** scm_c_locale_stringn_to_number - [C] ** scm_srfi1_append_reverse [C] ** scm_srfi1_append_reverse_x [C] ** scm_log - [C] ** scm_log10 - [C] ** scm_exp - [C] ** scm_sqrt - [C] * Bugs fixed ** Build problems have been fixed on MacOS, SunOS, and QNX. ** `strftime' fix sign of %z timezone offset. ** A one-dimensional array can now be 'equal?' to a vector. ** Structures, records, and SRFI-9 records can now be compared with `equal?'. ** SRFI-14 standard char sets are recomputed upon a successful `setlocale'. ** `record-accessor' and `record-modifier' now have strict type checks. Record accessor and modifier procedures now throw an error if the record type of the record they're given is not the type expected. (Previously accessors returned #f and modifiers silently did nothing). ** It is now OK to use both autoload and use-modules on a given module. ** `apply' checks the number of arguments more carefully on "0 or 1" funcs. Previously there was no checking on primatives like make-vector that accept "one or two" arguments. Now there is. ** The srfi-1 assoc function now calls its equality predicate properly. Previously srfi-1 assoc would call the equality predicate with the key last. According to the SRFI, the key should be first. ** A bug in n-par-for-each and n-for-each-par-map has been fixed. ** The array-set! procedure no longer segfaults when given a bit vector. ** Bugs in make-shared-array have been fixed. ** stringinexact should no longer overflow when given certain large fractions. ** srfi-9 accessor and modifier procedures now have strict record type checks. This matches the srfi-9 specification. ** (ice-9 ftw) procedures won't ignore different files with same inode number. Previously the (ice-9 ftw) procedures would ignore any file that had the same inode number as a file they had already seen, even if that file was on a different device. Changes in 1.8.0 (changes since the 1.6.x series): * Changes to the distribution ** Guile is now licensed with the GNU Lesser General Public License. ** The manual is now licensed with the GNU Free Documentation License. ** Guile now requires GNU MP (http://swox.com/gmp). Guile now uses the GNU MP library for arbitrary precision arithmetic. ** Guile now has separate private and public configuration headers. That is, things like HAVE_STRING_H no longer leak from Guile's headers. ** Guile now provides and uses an "effective" version number. Guile now provides scm_effective_version and effective-version functions which return the "effective" version number. This is just the normal full version string without the final micro-version number, so the current effective-version is "1.8". The effective version should remain unchanged during a stable series, and should be used for items like the versioned share directory name i.e. /usr/share/guile/1.8. Providing an unchanging version number during a stable release for things like the versioned share directory can be particularly important for Guile "add-on" packages, since it provides a directory that they can install to that won't be changed out from under them with each micro release during a stable series. ** Thread implementation has changed. When you configure "--with-threads=null", you will get the usual threading API (call-with-new-thread, make-mutex, etc), but you can't actually create new threads. Also, "--with-threads=no" is now equivalent to "--with-threads=null". This means that the thread API is always present, although you might not be able to create new threads. When you configure "--with-threads=pthreads" or "--with-threads=yes", you will get threads that are implemented with the portable POSIX threads. These threads can run concurrently (unlike the previous "coop" thread implementation), but need to cooperate for things like the GC. The default is "pthreads", unless your platform doesn't have pthreads, in which case "null" threads are used. See the manual for details, nodes "Initialization", "Multi-Threading", "Blocking", and others. ** There is the new notion of 'discouraged' features. This is a milder form of deprecation. Things that are discouraged should not be used in new code, but it is OK to leave them in old code for now. When a discouraged feature is used, no warning message is printed like there is for 'deprecated' features. Also, things that are merely discouraged are nevertheless implemented efficiently, while deprecated features can be very slow. You can omit discouraged features from libguile by configuring it with the '--disable-discouraged' option. ** Deprecation warnings can be controlled at run-time. (debug-enable 'warn-deprecated) switches them on and (debug-disable 'warn-deprecated) switches them off. ** Support for SRFI 61, extended cond syntax for multiple values has been added. This SRFI is always available. ** Support for require-extension, SRFI-55, has been added. The SRFI-55 special form `require-extension' has been added. It is available at startup, and provides a portable way to load Scheme extensions. SRFI-55 only requires support for one type of extension, "srfi"; so a set of SRFIs may be loaded via (require-extension (srfi 1 13 14)). ** New module (srfi srfi-26) provides support for `cut' and `cute'. The (srfi srfi-26) module is an implementation of SRFI-26 which provides the `cut' and `cute' syntax. These may be used to specialize parameters without currying. ** New module (srfi srfi-31) This is an implementation of SRFI-31 which provides a special form `rec' for recursive evaluation. ** The modules (srfi srfi-13), (srfi srfi-14) and (srfi srfi-4) have been merged with the core, making their functionality always available. The modules are still available, tho, and you could use them together with a renaming import, for example. ** Guile no longer includes its own version of libltdl. The official version is good enough now. ** The --enable-htmldoc option has been removed from 'configure'. Support for translating the documentation into HTML is now always provided. Use 'make html'. ** New module (ice-9 serialize): (serialize FORM1 ...) and (parallelize FORM1 ...) are useful when you don't trust the thread safety of most of your program, but where you have some section(s) of code which you consider can run in parallel to other sections. See ice-9/serialize.scm for more information. ** The configure option '--disable-arrays' has been removed. Support for arrays and uniform numeric arrays is now always included in Guile. * Changes to the stand-alone interpreter ** New command line option `-L'. This option adds a directory to the front of the load path. ** New command line option `--no-debug'. Specifying `--no-debug' on the command line will keep the debugging evaluator turned off, even for interactive sessions. ** User-init file ~/.guile is now loaded with the debugging evaluator. Previously, the normal evaluator would have been used. Using the debugging evaluator gives better error messages. ** The '-e' option now 'read's its argument. This is to allow the new '(@ MODULE-NAME VARIABLE-NAME)' construct to be used with '-e'. For example, you can now write a script like #! /bin/sh exec guile -e '(@ (demo) main)' -s "$0" "$@" !# (define-module (demo) :export (main)) (define (main args) (format #t "Demo: ~a~%" args)) * Changes to Scheme functions and syntax ** Guardians have changed back to their original semantics Guardians now behave like described in the paper by Dybvig et al. In particular, they no longer make guarantees about the order in which they return objects, and they can no longer be greedy. They no longer drop cyclic data structures. The C function scm_make_guardian has been changed incompatibly and no longer takes the 'greedy_p' argument. ** New function hashx-remove! This function completes the set of 'hashx' functions. ** The concept of dynamic roots has been factored into continuation barriers and dynamic states. Each thread has a current dynamic state that carries the values of the fluids. You can create and copy dynamic states and use them as the second argument for 'eval'. See "Fluids and Dynamic States" in the manual. To restrict the influence that captured continuations can have on the control flow, you can errect continuation barriers. See "Continuation Barriers" in the manual. The function call-with-dynamic-root now essentially temporarily installs a new dynamic state and errects a continuation barrier. ** The default load path no longer includes "." at the end. Automatically loading modules from the current directory should not happen by default. If you want to allow it in a more controlled manner, set the environment variable GUILE_LOAD_PATH or the Scheme variable %load-path. ** The uniform vector and array support has been overhauled. It now complies with SRFI-4 and the weird prototype based uniform array creation has been deprecated. See the manual for more details. Some non-compatible changes have been made: - characters can no longer be stored into byte arrays. - strings and bit vectors are no longer considered to be uniform numeric vectors. - array-rank throws an error for non-arrays instead of returning zero. - array-ref does no longer accept non-arrays when no indices are given. There is the new notion of 'generalized vectors' and corresponding procedures like 'generalized-vector-ref'. Generalized vectors include strings, bitvectors, ordinary vectors, and uniform numeric vectors. Arrays use generalized vectors as their storage, so that you still have arrays of characters, bits, etc. However, uniform-array-read! and uniform-array-write can no longer read/write strings and bitvectors. ** There is now support for copy-on-write substrings, mutation-sharing substrings and read-only strings. Three new procedures are related to this: substring/shared, substring/copy, and substring/read-only. See the manual for more information. ** Backtraces will now highlight the value that caused the error. By default, these values are enclosed in "{...}", such as in this example: guile> (car 'a) Backtrace: In current input: 1: 0* [car {a}] :1:1: In procedure car in expression (car (quote a)): :1:1: Wrong type (expecting pair): a ABORT: (wrong-type-arg) The prefix and suffix used for highlighting can be set via the two new printer options 'highlight-prefix' and 'highlight-suffix'. For example, putting this into ~/.guile will output the bad value in bold on an ANSI terminal: (print-set! highlight-prefix "\x1b[1m") (print-set! highlight-suffix "\x1b[22m") ** 'gettext' support for internationalization has been added. See the manual for details. ** New syntax '@' and '@@': You can now directly refer to variables exported from a module by writing (@ MODULE-NAME VARIABLE-NAME) For example (@ (ice-9 pretty-print) pretty-print) will directly access the pretty-print variable exported from the (ice-9 pretty-print) module. You don't need to 'use' that module first. You can also use '@' as a target of 'set!', as in (set! (@ mod var) val). The related syntax (@@ MODULE-NAME VARIABLE-NAME) works just like '@', but it can also access variables that have not been exported. It is intended only for kluges and temporary fixes and for debugging, not for ordinary code. ** Keyword syntax has been made more disciplined. Previously, the name of a keyword was read as a 'token' but printed as a symbol. Now, it is read as a general Scheme datum which must be a symbol. Previously: guile> #:12 #:#{12}# guile> #:#{12}# #:#{\#{12}\#}# guile> #:(a b c) #:#{}# ERROR: In expression (a b c): Unbound variable: a guile> #: foo #:#{}# ERROR: Unbound variable: foo Now: guile> #:12 ERROR: Wrong type (expecting symbol): 12 guile> #:#{12}# #:#{12}# guile> #:(a b c) ERROR: Wrong type (expecting symbol): (a b c) guile> #: foo #:foo ** The printing of symbols that might look like keywords can be controlled. The new printer option 'quote-keywordish-symbols' controls how symbols are printed that have a colon as their first or last character. The default now is to only quote a symbol with #{...}# when the read option 'keywords' is not '#f'. Thus: guile> (define foo (string->symbol ":foo")) guile> (read-set! keywords #f) guile> foo :foo guile> (read-set! keywords 'prefix) guile> foo #{:foo}# guile> (print-set! quote-keywordish-symbols #f) guile> foo :foo ** 'while' now provides 'break' and 'continue' break and continue were previously bound in a while loop, but not documented, and continue didn't quite work properly. The undocumented parameter to break which gave a return value for the while has been dropped. ** 'call-with-current-continuation' is now also available under the name 'call/cc'. ** The module system now checks for duplicate bindings. The module system now can check for name conflicts among imported bindings. The behavior can be controlled by specifying one or more 'duplicates' handlers. For example, to make Guile return an error for every name collision, write: (define-module (foo) :use-module (bar) :use-module (baz) :duplicates check) The new default behavior of the module system when a name collision has been detected is to 1. Give priority to bindings marked as a replacement. 2. Issue a warning (different warning if overriding core binding). 3. Give priority to the last encountered binding (this corresponds to the old behavior). If you want the old behavior back without replacements or warnings you can add the line: (default-duplicate-binding-handler 'last) to your .guile init file. ** New define-module option: :replace :replace works as :export, but, in addition, marks the binding as a replacement. A typical example is `format' in (ice-9 format) which is a replacement for the core binding `format'. ** Adding prefixes to imported bindings in the module system There is now a new :use-module option :prefix. It can be used to add a prefix to all imported bindings. (define-module (foo) :use-module ((bar) :prefix bar:)) will import all bindings exported from bar, but rename them by adding the prefix `bar:'. ** Conflicting generic functions can be automatically merged. When two imported bindings conflict and they are both generic functions, the two functions can now be merged automatically. This is activated with the 'duplicates' handler 'merge-generics'. ** New function: effective-version Returns the "effective" version number. This is just the normal full version string without the final micro-version number. See "Changes to the distribution" above. ** New threading functions: parallel, letpar, par-map, and friends These are convenient ways to run calculations in parallel in new threads. See "Parallel forms" in the manual for details. ** New function 'try-mutex'. This function will attempt to lock a mutex but will return immediately instead of blocking and indicate failure. ** Waiting on a condition variable can have a timeout. The function 'wait-condition-variable' now takes a third, optional argument that specifies the point in time where the waiting should be aborted. ** New function 'broadcast-condition-variable'. ** New functions 'all-threads' and 'current-thread'. ** Signals and system asyncs work better with threads. The function 'sigaction' now takes a fourth, optional, argument that specifies the thread that the handler should run in. When the argument is omitted, the handler will run in the thread that called 'sigaction'. Likewise, 'system-async-mark' takes a second, optional, argument that specifies the thread that the async should run in. When it is omitted, the async will run in the thread that called 'system-async-mark'. C code can use the new functions scm_sigaction_for_thread and scm_system_async_mark_for_thread to pass the new thread argument. When a thread blocks on a mutex, a condition variable or is waiting for IO to be possible, it will still execute system asyncs. This can be used to interrupt such a thread by making it execute a 'throw', for example. ** The function 'system-async' is deprecated. You can now pass any zero-argument procedure to 'system-async-mark'. The function 'system-async' will just return its argument unchanged now. ** New functions 'call-with-blocked-asyncs' and 'call-with-unblocked-asyncs' The expression (call-with-blocked-asyncs PROC) will call PROC and will block execution of system asyncs for the current thread by one level while PROC runs. Likewise, call-with-unblocked-asyncs will call a procedure and will unblock the execution of system asyncs by one level for the current thread. Only system asyncs are affected by these functions. ** The functions 'mask-signals' and 'unmask-signals' are deprecated. Use 'call-with-blocked-asyncs' or 'call-with-unblocked-asyncs' instead. Those functions are easier to use correctly and can be nested. ** New function 'unsetenv'. ** New macro 'define-syntax-public'. It works like 'define-syntax' and also exports the defined macro (but only on top-level). ** There is support for Infinity and NaNs. Following PLT Scheme, Guile can now work with infinite numbers, and 'not-a-numbers'. There is new syntax for numbers: "+inf.0" (infinity), "-inf.0" (negative infinity), "+nan.0" (not-a-number), and "-nan.0" (same as "+nan.0"). These numbers are inexact and have no exact counterpart. Dividing by an inexact zero returns +inf.0 or -inf.0, depending on the sign of the dividend. The infinities are integers, and they answer #t for both 'even?' and 'odd?'. The +nan.0 value is not an integer and is not '=' to itself, but '+nan.0' is 'eqv?' to itself. For example (/ 1 0.0) => +inf.0 (/ 0 0.0) => +nan.0 (/ 0) ERROR: Numerical overflow Two new predicates 'inf?' and 'nan?' can be used to test for the special values. ** Inexact zero can have a sign. Guile can now distinguish between plus and minus inexact zero, if your platform supports this, too. The two zeros are equal according to '=', but not according to 'eqv?'. For example (- 0.0) => -0.0 (= 0.0 (- 0.0)) => #t (eqv? 0.0 (- 0.0)) => #f ** Guile now has exact rationals. Guile can now represent fractions such as 1/3 exactly. Computing with them is also done exactly, of course: (* 1/3 3/2) => 1/2 ** 'floor', 'ceiling', 'round' and 'truncate' now return exact numbers for exact arguments. For example: (floor 2) now returns an exact 2 where in the past it returned an inexact 2.0. Likewise, (floor 5/4) returns an exact 1. ** inexact->exact no longer returns only integers. Without exact rationals, the closest exact number was always an integer, but now inexact->exact returns the fraction that is exactly equal to a floating point number. For example: (inexact->exact 1.234) => 694680242521899/562949953421312 When you want the old behavior, use 'round' explicitly: (inexact->exact (round 1.234)) => 1 ** New function 'rationalize'. This function finds a simple fraction that is close to a given real number. For example (and compare with inexact->exact above): (rationalize (inexact->exact 1.234) 1/2000) => 58/47 Note that, as required by R5RS, rationalize returns only then an exact result when both its arguments are exact. ** 'odd?' and 'even?' work also for inexact integers. Previously, (odd? 1.0) would signal an error since only exact integers were recognized as integers. Now (odd? 1.0) returns #t, (odd? 2.0) returns #f and (odd? 1.5) signals an error. ** Guile now has uninterned symbols. The new function 'make-symbol' will return an uninterned symbol. This is a symbol that is unique and is guaranteed to remain unique. However, uninterned symbols can not yet be read back in. Use the new function 'symbol-interned?' to check whether a symbol is interned or not. ** pretty-print has more options. The function pretty-print from the (ice-9 pretty-print) module can now also be invoked with keyword arguments that control things like maximum output width. See the manual for details. ** Variables have no longer a special behavior for `equal?'. Previously, comparing two variables with `equal?' would recursivly compare their values. This is no longer done. Variables are now only `equal?' if they are `eq?'. ** `(begin)' is now valid. You can now use an empty `begin' form. It will yield # when evaluated and simply be ignored in a definition context. ** Deprecated: procedure->macro Change your code to use 'define-macro' or r5rs macros. Also, be aware that macro expansion will not be done during evaluation, but prior to evaluation. ** Soft ports now allow a `char-ready?' procedure The vector argument to `make-soft-port' can now have a length of either 5 or 6. (Previously the length had to be 5.) The optional 6th element is interpreted as an `input-waiting' thunk -- i.e. a thunk that returns the number of characters that can be read immediately without the soft port blocking. ** Deprecated: undefine There is no replacement for undefine. ** The functions make-keyword-from-dash-symbol and keyword-dash-symbol have been discouraged. They are relics from a time where a keyword like #:foo was used directly as a Tcl option "-foo" and thus keywords were internally stored as a symbol with a starting dash. We now store a symbol without the dash. Use symbol->keyword and keyword->symbol instead. ** The `cheap' debug option is now obsolete Evaluator trap calls are now unconditionally "cheap" - in other words, they pass a debug object to the trap handler rather than a full continuation. The trap handler code can capture a full continuation by using `call-with-current-continuation' in the usual way, if it so desires. The `cheap' option is retained for now so as not to break existing code which gets or sets it, but setting it now has no effect. It will be removed in the next major Guile release. ** Evaluator trap calls now support `tweaking' `Tweaking' means that the trap handler code can modify the Scheme expression that is about to be evaluated (in the case of an enter-frame trap) or the value that is being returned (in the case of an exit-frame trap). The trap handler code indicates that it wants to do this by returning a pair whose car is the symbol 'instead and whose cdr is the modified expression or return value. * Changes to the C interface ** The functions scm_hash_fn_remove_x and scm_hashx_remove_x no longer take a 'delete' function argument. This argument makes no sense since the delete function is used to remove a pair from an alist, and this must not be configurable. This is an incompatible change. ** The GH interface is now subject to the deprecation mechanism The GH interface has been deprecated for quite some time but now it is actually removed from Guile when it is configured with --disable-deprecated. See the manual "Transitioning away from GH" for more information. ** A new family of functions for converting between C values and Scheme values has been added. These functions follow a common naming scheme and are designed to be easier to use, thread-safe and more future-proof than the older alternatives. - int scm_is_* (...) These are predicates that return a C boolean: 1 or 0. Instead of SCM_NFALSEP, you can now use scm_is_true, for example. - scm_to_ (SCM val, ...) These are functions that convert a Scheme value into an appropriate C value. For example, you can use scm_to_int to safely convert from a SCM to an int. - SCM scm_from_ ( val, ...) These functions convert from a C type to a SCM value; for example, scm_from_int for ints. There is a huge number of these functions, for numbers, strings, symbols, vectors, etc. They are documented in the reference manual in the API section together with the types that they apply to. ** New functions for dealing with complex numbers in C have been added. The new functions are scm_c_make_rectangular, scm_c_make_polar, scm_c_real_part, scm_c_imag_part, scm_c_magnitude and scm_c_angle. They work like scm_make_rectangular etc but take or return doubles directly. ** The function scm_make_complex has been discouraged. Use scm_c_make_rectangular instead. ** The INUM macros have been deprecated. A lot of code uses these macros to do general integer conversions, although the macros only work correctly with fixnums. Use the following alternatives. SCM_INUMP -> scm_is_integer or similar SCM_NINUMP -> !scm_is_integer or similar SCM_MAKINUM -> scm_from_int or similar SCM_INUM -> scm_to_int or similar SCM_VALIDATE_INUM_* -> Do not use these; scm_to_int, etc. will do the validating for you. ** The scm_num2 and scm_2num functions and scm_make_real have been discouraged. Use the newer scm_to_ and scm_from_ functions instead for new code. The functions have been discouraged since they don't fit the naming scheme. ** The 'boolean' macros SCM_FALSEP etc have been discouraged. They have strange names, especially SCM_NFALSEP, and SCM_BOOLP evaluates its argument twice. Use scm_is_true, etc. instead for new code. ** The macro SCM_EQ_P has been discouraged. Use scm_is_eq for new code, which fits better into the naming conventions. ** The macros SCM_CONSP, SCM_NCONSP, SCM_NULLP, and SCM_NNULLP have been discouraged. Use the function scm_is_pair or scm_is_null instead. ** The functions scm_round and scm_truncate have been deprecated and are now available as scm_c_round and scm_c_truncate, respectively. These functions occupy the names that scm_round_number and scm_truncate_number should have. ** The functions scm_c_string2str, scm_c_substring2str, and scm_c_symbol2str have been deprecated. Use scm_to_locale_stringbuf or similar instead, maybe together with scm_substring. ** New functions scm_c_make_string, scm_c_string_length, scm_c_string_ref, scm_c_string_set_x, scm_c_substring, scm_c_substring_shared, scm_c_substring_copy. These are like scm_make_string, scm_length, etc. but are slightly easier to use from C. ** The macros SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_LENGTH, SCM_SYMBOL_CHARS, and SCM_SYMBOL_LENGTH have been deprecated. They export too many assumptions about the implementation of strings and symbols that are no longer true in the presence of mutation-sharing substrings and when Guile switches to some form of Unicode. When working with strings, it is often best to use the normal string functions provided by Guile, such as scm_c_string_ref, scm_c_string_set_x, scm_string_append, etc. Be sure to look in the manual since many more such functions are now provided than previously. When you want to convert a SCM string to a C string, use the scm_to_locale_string function or similar instead. For symbols, use scm_symbol_to_string and then work with that string. Because of the new string representation, scm_symbol_to_string does not need to copy and is thus quite efficient. ** Some string, symbol and keyword functions have been discouraged. They don't fit into the uniform naming scheme and are not explicit about the character encoding. Replace according to the following table: scm_allocate_string -> scm_c_make_string scm_take_str -> scm_take_locale_stringn scm_take0str -> scm_take_locale_string scm_mem2string -> scm_from_locale_stringn scm_str2string -> scm_from_locale_string scm_makfrom0str -> scm_from_locale_string scm_mem2symbol -> scm_from_locale_symboln scm_mem2uninterned_symbol -> scm_from_locale_stringn + scm_make_symbol scm_str2symbol -> scm_from_locale_symbol SCM_SYMBOL_HASH -> scm_hashq SCM_SYMBOL_INTERNED_P -> scm_symbol_interned_p scm_c_make_keyword -> scm_from_locale_keyword ** The functions scm_keyword_to_symbol and sym_symbol_to_keyword are now also available to C code. ** SCM_KEYWORDP and SCM_KEYWORDSYM have been deprecated. Use scm_is_keyword and scm_keyword_to_symbol instead, but note that the latter returns the true name of the keyword, not the 'dash name', as SCM_KEYWORDSYM used to do. ** A new way to access arrays in a thread-safe and efficient way has been added. See the manual, node "Accessing Arrays From C". ** The old uniform vector and bitvector implementations have been unceremoniously removed. This implementation exposed the details of the tagging system of Guile. Use the new C API explained in the manual in node "Uniform Numeric Vectors" and "Bit Vectors", respectively. The following macros are gone: SCM_UVECTOR_BASE, SCM_SET_UVECTOR_BASE, SCM_UVECTOR_MAXLENGTH, SCM_UVECTOR_LENGTH, SCM_MAKE_UVECTOR_TAG, SCM_SET_UVECTOR_LENGTH, SCM_BITVECTOR_P, SCM_BITVECTOR_BASE, SCM_SET_BITVECTOR_BASE, SCM_BITVECTOR_MAX_LENGTH, SCM_BITVECTOR_LENGTH, SCM_MAKE_BITVECTOR_TAG, SCM_SET_BITVECTOR_LENGTH, SCM_BITVEC_REF, SCM_BITVEC_SET, SCM_BITVEC_CLR. ** The macros dealing with vectors have been deprecated. Use the new functions scm_is_vector, scm_vector_elements, scm_vector_writable_elements, etc, or scm_is_simple_vector, SCM_SIMPLE_VECTOR_REF, SCM_SIMPLE_VECTOR_SET, etc instead. See the manual for more details. Deprecated are SCM_VECTORP, SCM_VELTS, SCM_VECTOR_MAX_LENGTH, SCM_VECTOR_LENGTH, SCM_VECTOR_REF, SCM_VECTOR_SET, SCM_WRITABLE_VELTS. The following macros have been removed: SCM_VECTOR_BASE, SCM_SET_VECTOR_BASE, SCM_MAKE_VECTOR_TAG, SCM_SET_VECTOR_LENGTH, SCM_VELTS_AS_STACKITEMS, SCM_SETVELTS, SCM_GC_WRITABLE_VELTS. ** Some C functions and macros related to arrays have been deprecated. Migrate according to the following table: scm_make_uve -> scm_make_typed_array, scm_make_u8vector etc. scm_make_ra -> scm_make_array scm_shap2ra -> scm_make_array scm_cvref -> scm_c_generalized_vector_ref scm_ra_set_contp -> do not use scm_aind -> scm_array_handle_pos scm_raprin1 -> scm_display or scm_write SCM_ARRAYP -> scm_is_array SCM_ARRAY_NDIM -> scm_c_array_rank SCM_ARRAY_DIMS -> scm_array_handle_dims SCM_ARRAY_CONTP -> do not use SCM_ARRAY_MEM -> do not use SCM_ARRAY_V -> scm_array_handle_elements or similar SCM_ARRAY_BASE -> do not use ** SCM_CELL_WORD_LOC has been deprecated. Use the new macro SCM_CELL_OBJECT_LOC instead, which returns a pointer to a SCM, as opposed to a pointer to a scm_t_bits. This was done to allow the correct use of pointers into the Scheme heap. Previously, the heap words were of type scm_t_bits and local variables and function arguments were of type SCM, making it non-standards-conformant to have a pointer that can point to both. ** New macros SCM_SMOB_DATA_2, SCM_SMOB_DATA_3, etc. These macros should be used instead of SCM_CELL_WORD_2/3 to access the second and third words of double smobs. Likewise for SCM_SET_SMOB_DATA_2 and SCM_SET_SMOB_DATA_3. Also, there is SCM_SMOB_FLAGS and SCM_SET_SMOB_FLAGS that should be used to get and set the 16 exra bits in the zeroth word of a smob. And finally, there is SCM_SMOB_OBJECT and SCM_SMOB_SET_OBJECT for accesing the first immediate word of a smob as a SCM value, and there is SCM_SMOB_OBJECT_LOC for getting a pointer to the first immediate smob word. Like wise for SCM_SMOB_OBJECT_2, etc. ** New way to deal with non-local exits and re-entries. There is a new set of functions that essentially do what scm_internal_dynamic_wind does, but in a way that is more convenient for C code in some situations. Here is a quick example of how to prevent a potential memory leak: void foo () { char *mem; scm_dynwind_begin (0); mem = scm_malloc (100); scm_dynwind_unwind_handler (free, mem, SCM_F_WIND_EXPLICITLY); /* MEM would leak if BAR throws an error. SCM_DYNWIND_UNWIND_HANDLER frees it nevertheless. */ bar (); scm_dynwind_end (); /* Because of SCM_F_WIND_EXPLICITLY, MEM will be freed by SCM_DYNWIND_END as well. */ } For full documentation, see the node "Dynamic Wind" in the manual. ** New function scm_dynwind_free This function calls 'free' on a given pointer when a dynwind context is left. Thus the call to scm_dynwind_unwind_handler above could be replaced with simply scm_dynwind_free (mem). ** New functions scm_c_call_with_blocked_asyncs and scm_c_call_with_unblocked_asyncs Like scm_call_with_blocked_asyncs etc. but for C functions. ** New functions scm_dynwind_block_asyncs and scm_dynwind_unblock_asyncs In addition to scm_c_call_with_blocked_asyncs you can now also use scm_dynwind_block_asyncs in a 'dynwind context' (see above). Likewise for scm_c_call_with_unblocked_asyncs and scm_dynwind_unblock_asyncs. ** The macros SCM_DEFER_INTS, SCM_ALLOW_INTS, SCM_REDEFER_INTS, SCM_REALLOW_INTS have been deprecated. They do no longer fulfill their original role of blocking signal delivery. Depending on what you want to achieve, replace a pair of SCM_DEFER_INTS and SCM_ALLOW_INTS with a dynwind context that locks a mutex, blocks asyncs, or both. See node "Critical Sections" in the manual. ** The value 'scm_mask_ints' is no longer writable. Previously, you could set scm_mask_ints directly. This is no longer possible. Use scm_c_call_with_blocked_asyncs and scm_c_call_with_unblocked_asyncs instead. ** New way to temporarily set the current input, output or error ports C code can now use scm_dynwind_current__port in a 'dynwind context' (see above). is one of "input", "output" or "error". ** New way to temporarily set fluids C code can now use scm_dynwind_fluid in a 'dynwind context' (see above) to temporarily set the value of a fluid. ** New types scm_t_intmax and scm_t_uintmax. On platforms that have them, these types are identical to intmax_t and uintmax_t, respectively. On other platforms, they are identical to the largest integer types that Guile knows about. ** The functions scm_unmemocopy and scm_unmemoize have been removed. You should not have used them. ** Many public #defines with generic names have been made private. #defines with generic names like HAVE_FOO or SIZEOF_FOO have been made private or renamed with a more suitable public name. ** The macro SCM_TYP16S has been deprecated. This macro is not intended for public use. ** The macro SCM_SLOPPY_INEXACTP has been deprecated. Use scm_is_true (scm_inexact_p (...)) instead. ** The macro SCM_SLOPPY_REALP has been deprecated. Use scm_is_real instead. ** The macro SCM_SLOPPY_COMPLEXP has been deprecated. Use scm_is_complex instead. ** Some preprocessor defines have been deprecated. These defines indicated whether a certain feature was present in Guile or not. Going forward, assume that the features are always present. The macros are: USE_THREADS, GUILE_ISELECT, READER_EXTENSIONS, DEBUG_EXTENSIONS, DYNAMIC_LINKING. The following macros have been removed completely: MEMOIZE_LOCALS, SCM_RECKLESS, SCM_CAUTIOUS. ** The preprocessor define STACK_DIRECTION has been deprecated. There should be no need to know about the stack direction for ordinary programs. ** New function: scm_effective_version Returns the "effective" version number. This is just the normal full version string without the final micro-version number. See "Changes to the distribution" above. ** The function scm_call_with_new_thread has a new prototype. Instead of taking a list with the thunk and handler, these two arguments are now passed directly: SCM scm_call_with_new_thread (SCM thunk, SCM handler); This is an incompatible change. ** New snarfer macro SCM_DEFINE_PUBLIC. This is like SCM_DEFINE, but also calls scm_c_export for the defined function in the init section. ** The snarfer macro SCM_SNARF_INIT is now officially supported. ** Garbage collector rewrite. The garbage collector is cleaned up a lot, and now uses lazy sweeping. This is reflected in the output of (gc-stats); since cells are being freed when they are allocated, the cells-allocated field stays roughly constant. For malloc related triggers, the behavior is changed. It uses the same heuristic as the cell-triggered collections. It may be tuned with the environment variables GUILE_MIN_YIELD_MALLOC. This is the percentage for minimum yield of malloc related triggers. The default is 40. GUILE_INIT_MALLOC_LIMIT sets the initial trigger for doing a GC. The default is 200 kb. Debugging operations for the freelist have been deprecated, along with the C variables that control garbage collection. The environment variables GUILE_MAX_SEGMENT_SIZE, GUILE_INIT_SEGMENT_SIZE_2, GUILE_INIT_SEGMENT_SIZE_1, and GUILE_MIN_YIELD_2 should be used. For understanding the memory usage of a GUILE program, the routine gc-live-object-stats returns an alist containing the number of live objects for every type. ** The function scm_definedp has been renamed to scm_defined_p The name scm_definedp is deprecated. ** The struct scm_cell type has been renamed to scm_t_cell This is in accordance to Guile's naming scheme for types. Note that the name scm_cell is now used for a function that allocates and initializes a new cell (see below). ** New functions for memory management A new set of functions for memory management has been added since the old way (scm_must_malloc, scm_must_free, etc) was error prone and indeed, Guile itself contained some long standing bugs that could cause aborts in long running programs. The new functions are more symmetrical and do not need cooperation from smob free routines, among other improvements. The new functions are scm_malloc, scm_realloc, scm_calloc, scm_strdup, scm_strndup, scm_gc_malloc, scm_gc_calloc, scm_gc_realloc, scm_gc_free, scm_gc_register_collectable_memory, and scm_gc_unregister_collectable_memory. Refer to the manual for more details and for upgrading instructions. The old functions for memory management have been deprecated. They are: scm_must_malloc, scm_must_realloc, scm_must_free, scm_must_strdup, scm_must_strndup, scm_done_malloc, scm_done_free. ** Declarations of exported features are marked with SCM_API. Every declaration of a feature that belongs to the exported Guile API has been marked by adding the macro "SCM_API" to the start of the declaration. This macro can expand into different things, the most common of which is just "extern" for Unix platforms. On Win32, it can be used to control which symbols are exported from a DLL. If you `#define SCM_IMPORT' before including , SCM_API will expand into "__declspec (dllimport) extern", which is needed for linking to the Guile DLL in Windows. There are also SCM_RL_IMPORT, SCM_SRFI1314_IMPORT, and SCM_SRFI4_IMPORT, for the corresponding libraries. ** SCM_NEWCELL and SCM_NEWCELL2 have been deprecated. Use the new functions scm_cell and scm_double_cell instead. The old macros had problems because with them allocation and initialization was separated and the GC could sometimes observe half initialized cells. Only careful coding by the user of SCM_NEWCELL and SCM_NEWCELL2 could make this safe and efficient. ** CHECK_ENTRY, CHECK_APPLY and CHECK_EXIT have been deprecated. Use the variables scm_check_entry_p, scm_check_apply_p and scm_check_exit_p instead. ** SRCBRKP has been deprecated. Use scm_c_source_property_breakpoint_p instead. ** Deprecated: scm_makmacro Change your code to use either scm_makmmacro or to define macros in Scheme, using 'define-macro'. ** New function scm_c_port_for_each. This function is like scm_port_for_each but takes a pointer to a C function as the callback instead of a SCM value. ** The names scm_internal_select, scm_thread_sleep, and scm_thread_usleep have been discouraged. Use scm_std_select, scm_std_sleep, scm_std_usleep instead. ** The GC can no longer be blocked. The global flags scm_gc_heap_lock and scm_block_gc have been removed. The GC can now run (partially) concurrently with other code and thus blocking it is not well defined. ** Many definitions have been removed that were previously deprecated. scm_lisp_nil, scm_lisp_t, s_nil_ify, scm_m_nil_ify, s_t_ify, scm_m_t_ify, s_0_cond, scm_m_0_cond, s_0_ify, scm_m_0_ify, s_1_ify, scm_m_1_ify, scm_debug_newcell, scm_debug_newcell2, scm_tc16_allocated, SCM_SET_SYMBOL_HASH, SCM_IM_NIL_IFY, SCM_IM_T_IFY, SCM_IM_0_COND, SCM_IM_0_IFY, SCM_IM_1_IFY, SCM_GC_SET_ALLOCATED, scm_debug_newcell, scm_debug_newcell2, SCM_HUP_SIGNAL, SCM_INT_SIGNAL, SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, SCM_ALRM_SIGNAL, SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, SCM_ORD_SIG, SCM_NUM_SIGS, scm_top_level_lookup_closure_var, *top-level-lookup-closure*, scm_system_transformer, scm_eval_3, scm_eval2, root_module_lookup_closure, SCM_SLOPPY_STRINGP, SCM_RWSTRINGP, scm_read_only_string_p, scm_make_shared_substring, scm_tc7_substring, sym_huh, SCM_VARVCELL, SCM_UDVARIABLEP, SCM_DEFVARIABLEP, scm_mkbig, scm_big2inum, scm_adjbig, scm_normbig, scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl, SCM_FIXNUM_BIT, SCM_SETCHARS, SCM_SLOPPY_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_LENGTH_MAX, SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH, SCM_ROCHARS, SCM_ROUCHARS, SCM_SUBSTRP, SCM_COERCE_SUBSTR, scm_sym2vcell, scm_intern, scm_intern0, scm_sysintern, scm_sysintern0, scm_sysintern0_no_module_lookup, scm_init_symbols_deprecated, scm_vector_set_length_x, scm_contregs, scm_debug_info, scm_debug_frame, SCM_DSIDEVAL, SCM_CONST_LONG, SCM_VCELL, SCM_GLOBAL_VCELL, SCM_VCELL_INIT, SCM_GLOBAL_VCELL_INIT, SCM_HUGE_LENGTH, SCM_VALIDATE_STRINGORSUBSTR, SCM_VALIDATE_ROSTRING, SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY, SCM_VALIDATE_RWSTRING, DIGITS, scm_small_istr2int, scm_istr2int, scm_istr2flo, scm_istring2number, scm_istr2int, scm_istr2flo, scm_istring2number, scm_vtable_index_vcell, scm_si_vcell, SCM_ECONSP, SCM_NECONSP, SCM_GLOC_VAR, SCM_GLOC_VAL, SCM_GLOC_SET_VAL, SCM_GLOC_VAL_LOC, scm_make_gloc, scm_gloc_p, scm_tc16_variable, SCM_CHARS, SCM_LENGTH, SCM_SET_STRING_CHARS, SCM_SET_STRING_LENGTH. * Changes to bundled modules ** (ice-9 debug) Using the (ice-9 debug) module no longer automatically switches Guile to use the debugging evaluator. If you want to switch to the debugging evaluator (which is needed for backtrace information if you hit an error), please add an explicit "(debug-enable 'debug)" to your code just after the code to use (ice-9 debug). Changes since Guile 1.4: * Changes to the distribution ** A top-level TODO file is included. ** Guile now uses a versioning scheme similar to that of the Linux kernel. Guile now always uses three numbers to represent the version, i.e. "1.6.5". The first number, 1, is the major version number, the second number, 6, is the minor version number, and the third number, 5, is the micro version number. Changes in major version number indicate major changes in Guile. Minor version numbers that are even denote stable releases, and odd minor version numbers denote development versions (which may be unstable). The micro version number indicates a minor sub-revision of a given MAJOR.MINOR release. In keeping with the new scheme, (minor-version) and scm_minor_version no longer return everything but the major version number. They now just return the minor version number. Two new functions (micro-version) and scm_micro_version have been added to report the micro version number. In addition, ./GUILE-VERSION now defines GUILE_MICRO_VERSION. ** New preprocessor definitions are available for checking versions. version.h now #defines SCM_MAJOR_VERSION, SCM_MINOR_VERSION, and SCM_MICRO_VERSION to the appropriate integer values. ** Guile now actively warns about deprecated features. The new configure option `--enable-deprecated=LEVEL' and the environment variable GUILE_WARN_DEPRECATED control this mechanism. See INSTALL and README for more information. ** Guile is much more likely to work on 64-bit architectures. Guile now compiles and passes "make check" with only two UNRESOLVED GC cases on Alpha and ia64 based machines now. Thanks to John Goerzen for the use of a test machine, and thanks to Stefan Jahn for ia64 patches. ** New functions: setitimer and getitimer. These implement a fairly direct interface to the libc functions of the same name. ** The #. reader extension is now disabled by default. For safety reasons, #. evaluation is disabled by default. To re-enable it, set the fluid read-eval? to #t. For example: (fluid-set! read-eval? #t) but make sure you realize the potential security risks involved. With read-eval? enabled, reading a data file from an untrusted source can be dangerous. ** New SRFI modules have been added: SRFI-0 `cond-expand' is now supported in Guile, without requiring using a module. (srfi srfi-1) is a library containing many useful pair- and list-processing procedures. (srfi srfi-2) exports and-let*. (srfi srfi-4) implements homogeneous numeric vector datatypes. (srfi srfi-6) is a dummy module for now, since guile already provides all of the srfi-6 procedures by default: open-input-string, open-output-string, get-output-string. (srfi srfi-8) exports receive. (srfi srfi-9) exports define-record-type. (srfi srfi-10) exports define-reader-ctor and implements the reader extension #,(). (srfi srfi-11) exports let-values and let*-values. (srfi srfi-13) implements the SRFI String Library. (srfi srfi-14) implements the SRFI Character-Set Library. (srfi srfi-17) implements setter and getter-with-setter and redefines some accessor procedures as procedures with getters. (such as car, cdr, vector-ref etc.) (srfi srfi-19) implements the SRFI Time/Date Library. ** New scripts / "executable modules" Subdirectory "scripts" contains Scheme modules that are packaged to also be executable as scripts. At this time, these scripts are available: display-commentary doc-snarf generate-autoload punify read-scheme-source use2dot See README there for more info. These scripts can be invoked from the shell with the new program "guile-tools", which keeps track of installation directory for you. For example: $ guile-tools display-commentary srfi/*.scm guile-tools is copied to the standard $bindir on "make install". ** New module (ice-9 stack-catch): stack-catch is like catch, but saves the current state of the stack in the fluid the-last-stack. This fluid can be useful when using the debugger and when re-throwing an error. ** The module (ice-9 and-let*) has been renamed to (ice-9 and-let-star) This has been done to prevent problems on lesser operating systems that can't tolerate `*'s in file names. The exported macro continues to be named `and-let*', of course. On systems that support it, there is also a compatibility module named (ice-9 and-let*). It will go away in the next release. ** New modules (oop goops) etc.: (oop goops) (oop goops describe) (oop goops save) (oop goops active-slot) (oop goops composite-slot) The Guile Object Oriented Programming System (GOOPS) has been integrated into Guile. For further information, consult the GOOPS manual and tutorial in the `doc' directory. ** New module (ice-9 rdelim). This exports the following procedures which were previously defined in the default environment: read-line read-line! read-delimited read-delimited! %read-delimited! %read-line write-line For backwards compatibility the definitions are still imported into the default environment in this version of Guile. However you should add: (use-modules (ice-9 rdelim)) to any program which uses the definitions, since this may change in future. Alternatively, if guile-scsh is installed, the (scsh rdelim) module can be used for similar functionality. ** New module (ice-9 rw) This is a subset of the (scsh rw) module from guile-scsh. Currently it defines two procedures: *** New function: read-string!/partial str [port_or_fdes [start [end]]] Read characters from a port or file descriptor into a string STR. A port must have an underlying file descriptor -- a so-called fport. This procedure is scsh-compatible and can efficiently read large strings. *** New function: write-string/partial str [port_or_fdes [start [end]]] Write characters from a string STR to a port or file descriptor. A port must have an underlying file descriptor -- a so-called fport. This procedure is mostly compatible and can efficiently write large strings. ** New module (ice-9 match) This module includes Andrew K. Wright's pattern matcher. See ice-9/match.scm for brief description or http://www.star-lab.com/wright/code.html for complete documentation. ** New module (ice-9 buffered-input) This module provides procedures to construct an input port from an underlying source of input that reads and returns its input in chunks. The underlying input source is a Scheme procedure, specified by the caller, which the port invokes whenever it needs more input. This is useful when building an input port whose back end is Readline or a UI element such as the GtkEntry widget. ** Documentation The reference and tutorial documentation that was previously distributed separately, as `guile-doc', is now included in the core Guile distribution. The documentation consists of the following manuals. - The Guile Tutorial (guile-tut.texi) contains a tutorial introduction to using Guile. - The Guile Reference Manual (guile.texi) contains (or is intended to contain) reference documentation on all aspects of Guile. - The GOOPS Manual (goops.texi) contains both tutorial-style and reference documentation for using GOOPS, Guile's Object Oriented Programming System. - The Revised^5 Report on the Algorithmic Language Scheme (r5rs.texi). See the README file in the `doc' directory for more details. ** There are a couple of examples in the examples/ directory now. * Changes to the stand-alone interpreter ** New command line option `--use-srfi' Using this option, SRFI modules can be loaded on startup and be available right from the beginning. This makes programming portable Scheme programs easier. The option `--use-srfi' expects a comma-separated list of numbers, each representing a SRFI number to be loaded into the interpreter before starting evaluating a script file or the REPL. Additionally, the feature identifier for the loaded SRFIs is recognized by `cond-expand' when using this option. Example: $ guile --use-srfi=8,13 guile> (receive (x z) (values 1 2) (+ 1 2)) 3 guile> (string-pad "bla" 20) " bla" ** Guile now always starts up in the `(guile-user)' module. Previously, scripts executed via the `-s' option would run in the `(guile)' module and the repl would run in the `(guile-user)' module. Now every user action takes place in the `(guile-user)' module by default. * Changes to Scheme functions and syntax ** Character classifiers work for non-ASCII characters. The predicates `char-alphabetic?', `char-numeric?', `char-whitespace?', `char-lower?', `char-upper?' and `char-is-both?' no longer check whether their arguments are ASCII characters. Previously, a character would only be considered alphabetic when it was also ASCII, for example. ** Previously deprecated Scheme functions have been removed: tag - no replacement. fseek - replaced by seek. list* - replaced by cons*. ** It's now possible to create modules with controlled environments Example: (use-modules (ice-9 safe)) (define m (make-safe-module)) ;;; m will now be a module containing only a safe subset of R5RS (eval '(+ 1 2) m) --> 3 (eval 'load m) --> ERROR: Unbound variable: load ** Evaluation of "()", the empty list, is now an error. Previously, the expression "()" evaluated to the empty list. This has been changed to signal a "missing expression" error. The correct way to write the empty list as a literal constant is to use quote: "'()". ** New concept of `Guile Extensions'. A Guile Extension is just a ordinary shared library that can be linked at run-time. We found it advantageous to give this simple concept a dedicated name to distinguish the issues related to shared libraries from the issues related to the module system. *** New function: load-extension Executing (load-extension lib init) is mostly equivalent to (dynamic-call init (dynamic-link lib)) except when scm_register_extension has been called previously. Whenever appropriate, you should use `load-extension' instead of dynamic-link and dynamic-call. *** New C function: scm_c_register_extension This function registers a initialization function for use by `load-extension'. Use it when you don't want specific extensions to be loaded as shared libraries (for example on platforms that don't support dynamic linking). ** Auto-loading of compiled-code modules is deprecated. Guile used to be able to automatically find and link a shared library to satisfy requests for a module. For example, the module `(foo bar)' could be implemented by placing a shared library named "foo/libbar.so" (or with a different extension) in a directory on the load path of Guile. This has been found to be too tricky, and is no longer supported. The shared libraries are now called "extensions". You should now write a small Scheme file that calls `load-extension' to load the shared library and initialize it explicitly. The shared libraries themselves should be installed in the usual places for shared libraries, with names like "libguile-foo-bar". For example, place this into a file "foo/bar.scm" (define-module (foo bar)) (load-extension "libguile-foo-bar" "foobar_init") ** Backward incompatible change: eval EXP ENVIRONMENT-SPECIFIER `eval' is now R5RS, that is it takes two arguments. The second argument is an environment specifier, i.e. either (scheme-report-environment 5) (null-environment 5) (interaction-environment) or any module. ** The module system has been made more disciplined. The function `eval' will save and restore the current module around the evaluation of the specified expression. While this expression is evaluated, `(current-module)' will now return the right module, which is the module specified as the second argument to `eval'. A consequence of this change is that `eval' is not particularly useful when you want allow the evaluated code to change what module is designated as the current module and have this change persist from one call to `eval' to the next. The read-eval-print-loop is an example where `eval' is now inadequate. To compensate, there is a new function `primitive-eval' that does not take a module specifier and that does not save/restore the current module. You should use this function together with `set-current-module', `current-module', etc when you want to have more control over the state that is carried from one eval to the next. Additionally, it has been made sure that forms that are evaluated at the top level are always evaluated with respect to the current module. Previously, subforms of top-level forms such as `begin', `case', etc. did not respect changes to the current module although these subforms are at the top-level as well. To prevent strange behavior, the forms `define-module', `use-modules', `use-syntax', and `export' have been restricted to only work on the top level. The forms `define-public' and `defmacro-public' only export the new binding on the top level. They behave just like `define' and `defmacro', respectively, when they are used in a lexical environment. Also, `export' will no longer silently re-export bindings imported from a used module. It will emit a `deprecation' warning and will cease to perform any re-export in the next version. If you actually want to re-export bindings, use the new `re-export' in place of `export'. The new `re-export' will not make copies of variables when rexporting them, as `export' did wrongly. ** Module system now allows selection and renaming of imported bindings Previously, when using `use-modules' or the `#:use-module' clause in the `define-module' form, all the bindings (association of symbols to values) for imported modules were added to the "current module" on an as-is basis. This has been changed to allow finer control through two new facilities: selection and renaming. You can now select which of the imported module's bindings are to be visible in the current module by using the `:select' clause. This clause also can be used to rename individual bindings. For example: ;; import all bindings no questions asked (use-modules (ice-9 common-list)) ;; import four bindings, renaming two of them; ;; the current module sees: every some zonk-y zonk-n (use-modules ((ice-9 common-list) :select (every some (remove-if . zonk-y) (remove-if-not . zonk-n)))) You can also programmatically rename all selected bindings using the `:renamer' clause, which specifies a proc that takes a symbol and returns another symbol. Because it is common practice to use a prefix, we now provide the convenience procedure `symbol-prefix-proc'. For example: ;; import four bindings, renaming two of them specifically, ;; and all four w/ prefix "CL:"; ;; the current module sees: CL:every CL:some CL:zonk-y CL:zonk-n (use-modules ((ice-9 common-list) :select (every some (remove-if . zonk-y) (remove-if-not . zonk-n)) :renamer (symbol-prefix-proc 'CL:))) ;; import four bindings, renaming two of them specifically, ;; and all four by upcasing. ;; the current module sees: EVERY SOME ZONK-Y ZONK-N (define (upcase-symbol sym) (string->symbol (string-upcase (symbol->string sym)))) (use-modules ((ice-9 common-list) :select (every some (remove-if . zonk-y) (remove-if-not . zonk-n)) :renamer upcase-symbol)) Note that programmatic renaming is done *after* individual renaming. Also, the above examples show `use-modules', but the same facilities are available for the `#:use-module' clause of `define-module'. See manual for more info. ** The semantics of guardians have changed. The changes are for the most part compatible. An important criterion was to keep the typical usage of guardians as simple as before, but to make the semantics safer and (as a result) more useful. *** All objects returned from guardians are now properly alive. It is now guaranteed that any object referenced by an object returned from a guardian is alive. It's now impossible for a guardian to return a "contained" object before its "containing" object. One incompatible (but probably not very important) change resulting from this is that it is no longer possible to guard objects that indirectly reference themselves (i.e. are parts of cycles). If you do so accidentally, you'll get a warning. *** There are now two types of guardians: greedy and sharing. If you call (make-guardian #t) or just (make-guardian), you'll get a greedy guardian, and for (make-guardian #f) a sharing guardian. Greedy guardians are the default because they are more "defensive". You can only greedily guard an object once. If you guard an object more than once, once in a greedy guardian and the rest of times in sharing guardians, then it is guaranteed that the object won't be returned from sharing guardians as long as it is greedily guarded and/or alive. Guardians returned by calls to `make-guardian' can now take one more optional parameter, which says whether to throw an error in case an attempt is made to greedily guard an object that is already greedily guarded. The default is true, i.e. throw an error. If the parameter is false, the guardian invocation returns #t if guarding was successful and #f if it wasn't. Also, since greedy guarding is, in effect, a side-effecting operation on objects, a new function is introduced: `destroy-guardian!'. Invoking this function on a guardian renders it unoperative and, if the guardian is greedy, clears the "greedily guarded" property of the objects that were guarded by it, thus undoing the side effect. Note that all this hair is hardly very important, since guardian objects are usually permanent. ** Continuations created by call-with-current-continuation now accept any number of arguments, as required by R5RS. ** New function `issue-deprecation-warning' This function is used to display the deprecation messages that are controlled by GUILE_WARN_DEPRECATION as explained in the README. (define (id x) (issue-deprecation-warning "`id' is deprecated. Use `identity' instead.") (identity x)) guile> (id 1) ;; `id' is deprecated. Use `identity' instead. 1 guile> (id 1) 1 ** New syntax `begin-deprecated' When deprecated features are included (as determined by the configure option --enable-deprecated), `begin-deprecated' is identical to `begin'. When deprecated features are excluded, it always evaluates to `#f', ignoring the body forms. ** New function `make-object-property' This function returns a new `procedure with setter' P that can be used to attach a property to objects. When calling P as (set! (P obj) val) where `obj' is any kind of object, it attaches `val' to `obj' in such a way that it can be retrieved by calling P as (P obj) This function will replace procedure properties, symbol properties and source properties eventually. ** Module (ice-9 optargs) now uses keywords instead of `#&'. Instead of #&optional, #&key, etc you should now use #:optional, #:key, etc. Since #:optional is a keyword, you can write it as just :optional when (read-set! keywords 'prefix) is active. The old reader syntax `#&' is still supported, but deprecated. It will be removed in the next release. ** New define-module option: pure Tells the module system not to include any bindings from the root module. Example: (define-module (totally-empty-module) :pure) ** New define-module option: export NAME1 ... Export names NAME1 ... This option is required if you want to be able to export bindings from a module which doesn't import one of `define-public' or `export'. Example: (define-module (foo) :pure :use-module (ice-9 r5rs) :export (bar)) ;;; Note that we're pure R5RS below this point! (define (bar) ...) ** New function: object->string OBJ Return a Scheme string obtained by printing a given object. ** New function: port? X Returns a boolean indicating whether X is a port. Equivalent to `(or (input-port? X) (output-port? X))'. ** New function: file-port? Determines whether a given object is a port that is related to a file. ** New function: port-for-each proc Apply PROC to each port in the Guile port table in turn. The return value is unspecified. More specifically, PROC is applied exactly once to every port that exists in the system at the time PORT-FOR-EACH is invoked. Changes to the port table while PORT-FOR-EACH is running have no effect as far as PORT-FOR-EACH is concerned. ** New function: dup2 oldfd newfd A simple wrapper for the `dup2' system call. Copies the file descriptor OLDFD to descriptor number NEWFD, replacing the previous meaning of NEWFD. Both OLDFD and NEWFD must be integers. Unlike for dup->fdes or primitive-move->fdes, no attempt is made to move away ports which are using NEWFD. The return value is unspecified. ** New function: close-fdes fd A simple wrapper for the `close' system call. Close file descriptor FD, which must be an integer. Unlike close (*note close: Ports and File Descriptors.), the file descriptor will be closed even if a port is using it. The return value is unspecified. ** New function: crypt password salt Encrypts `password' using the standard unix password encryption algorithm. ** New function: chroot path Change the root directory of the running process to `path'. ** New functions: getlogin, cuserid Return the login name or the user name of the current effective user id, respectively. ** New functions: getpriority which who, setpriority which who prio Get or set the priority of the running process. ** New function: getpass prompt Read a password from the terminal, first displaying `prompt' and disabling echoing. ** New function: flock file operation Set/remove an advisory shared or exclusive lock on `file'. ** New functions: sethostname name, gethostname Set or get the hostname of the machine the current process is running on. ** New function: mkstemp! tmpl mkstemp creates a new unique file in the file system and returns a new buffered port open for reading and writing to the file. TMPL is a string specifying where the file should be created: it must end with `XXXXXX' and will be changed in place to return the name of the temporary file. ** New function: open-input-string string Return an input string port which delivers the characters from `string'. This procedure, together with `open-output-string' and `get-output-string' implements SRFI-6. ** New function: open-output-string Return an output string port which collects all data written to it. The data can then be retrieved by `get-output-string'. ** New function: get-output-string Return the contents of an output string port. ** New function: identity Return the argument. ** socket, connect, accept etc., now have support for IPv6. IPv6 addresses are represented in Scheme as integers with normal host byte ordering. ** New function: inet-pton family address Convert a printable string network address into an integer. Note that unlike the C version of this function, the result is an integer with normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'. e.g., (inet-pton AF_INET "127.0.0.1") => 2130706433 (inet-pton AF_INET6 "::1") => 1 ** New function: inet-ntop family address Convert an integer network address into a printable string. Note that unlike the C version of this function, the input is an integer with normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'. e.g., (inet-ntop AF_INET 2130706433) => "127.0.0.1" (inet-ntop AF_INET6 (- (expt 2 128) 1)) => ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ** Deprecated: id Use `identity' instead. ** Deprecated: -1+ Use `1-' instead. ** Deprecated: return-it Do without it. ** Deprecated: string-character-length Use `string-length' instead. ** Deprecated: flags Use `logior' instead. ** Deprecated: close-all-ports-except. This was intended for closing ports in a child process after a fork, but it has the undesirable side effect of flushing buffers. port-for-each is more flexible. ** The (ice-9 popen) module now attempts to set up file descriptors in the child process from the current Scheme ports, instead of using the current values of file descriptors 0, 1, and 2 in the parent process. ** Removed function: builtin-weak-bindings There is no such concept as a weak binding any more. ** Removed constants: bignum-radix, scm-line-incrementors ** define-method: New syntax mandatory. The new method syntax is now mandatory: (define-method (NAME ARG-SPEC ...) BODY ...) (define-method (NAME ARG-SPEC ... . REST-ARG) BODY ...) ARG-SPEC ::= ARG-NAME | (ARG-NAME TYPE) REST-ARG ::= ARG-NAME If you have old code using the old syntax, import (oop goops old-define-method) before (oop goops) as in: (use-modules (oop goops old-define-method) (oop goops)) ** Deprecated function: builtin-variable Removed function: builtin-bindings There is no longer a distinction between builtin or other variables. Use module system operations for all variables. ** Lazy-catch handlers are no longer allowed to return. That is, a call to `throw', `error', etc is now guaranteed to not return. ** Bugfixes for (ice-9 getopt-long) This module is now tested using test-suite/tests/getopt-long.test. The following bugs have been fixed: *** Parsing for options that are specified to have `optional' args now checks if the next element is an option instead of unconditionally taking it as the option arg. *** An error is now thrown for `--opt=val' when the option description does not specify `(value #t)' or `(value optional)'. This condition used to be accepted w/o error, contrary to the documentation. *** The error message for unrecognized options is now more informative. It used to be "not a record", an artifact of the implementation. *** The error message for `--opt' terminating the arg list (no value), when `(value #t)' is specified, is now more informative. It used to be "not enough args". *** "Clumped" single-char args now preserve trailing string, use it as arg. The expansion used to be like so: ("-abc5d" "--xyz") => ("-a" "-b" "-c" "--xyz") Note that the "5d" is dropped. Now it is like so: ("-abc5d" "--xyz") => ("-a" "-b" "-c" "5d" "--xyz") This enables single-char options to have adjoining arguments as long as their constituent characters are not potential single-char options. ** (ice-9 session) procedure `arity' now works with (ice-9 optargs) `lambda*' The `lambda*' and derivative forms in (ice-9 optargs) now set a procedure property `arglist', which can be retrieved by `arity'. The result is that `arity' can give more detailed information than before: Before: guile> (use-modules (ice-9 optargs)) guile> (define* (foo #:optional a b c) a) guile> (arity foo) 0 or more arguments in `lambda*:G0'. After: guile> (arity foo) 3 optional arguments: `a', `b' and `c'. guile> (define* (bar a b #:key c d #:allow-other-keys) a) guile> (arity bar) 2 required arguments: `a' and `b', 2 keyword arguments: `c' and `d', other keywords allowed. guile> (define* (baz a b #:optional c #:rest r) a) guile> (arity baz) 2 required arguments: `a' and `b', 1 optional argument: `c', the rest in `r'. * Changes to the C interface ** Types have been renamed from scm_*_t to scm_t_*. This has been done for POSIX sake. It reserves identifiers ending with "_t". What a concept. The old names are still available with status `deprecated'. ** scm_t_bits (former scm_bits_t) is now a unsigned type. ** Deprecated features have been removed. *** Macros removed SCM_INPORTP, SCM_OUTPORTP SCM_ICHRP, SCM_ICHR, SCM_MAKICHR SCM_SETJMPBUF SCM_NSTRINGP SCM_NRWSTRINGP SCM_NVECTORP SCM_DOUBLE_CELLP *** C Functions removed scm_sysmissing scm_tag scm_tc16_flo scm_tc_flo scm_fseek - replaced by scm_seek. gc-thunk - replaced by after-gc-hook. gh_int2scmb - replaced by gh_bool2scm. scm_tc_dblr - replaced by scm_tc16_real. scm_tc_dblc - replaced by scm_tc16_complex. scm_list_star - replaced by scm_cons_star. ** Deprecated: scm_makfromstr Use scm_mem2string instead. ** Deprecated: scm_make_shared_substring Explicit shared substrings will disappear from Guile. Instead, "normal" strings will be implemented using sharing internally, combined with a copy-on-write strategy. ** Deprecated: scm_read_only_string_p The concept of read-only strings will disappear in next release of Guile. ** Deprecated: scm_sloppy_memq, scm_sloppy_memv, scm_sloppy_member Instead, use scm_c_memq or scm_memq, scm_memv, scm_member. ** New functions: scm_call_0, scm_call_1, scm_call_2, scm_call_3 Call a procedure with the indicated number of arguments. See "Fly Evaluation" in the manual. ** New functions: scm_apply_0, scm_apply_1, scm_apply_2, scm_apply_3 Call a procedure with the indicated number of arguments and a list of further arguments. See "Fly Evaluation" in the manual. ** New functions: scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5 Create a list of the given number of elements. See "List Constructors" in the manual. ** Renamed function: scm_listify has been replaced by scm_list_n. ** Deprecated macros: SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5, SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9. Use functions scm_list_N instead. ** New function: scm_c_read (SCM port, void *buffer, scm_sizet size) Used by an application to read arbitrary number of bytes from a port. Same semantics as libc read, except that scm_c_read only returns less than SIZE bytes if at end-of-file. Warning: Doesn't update port line and column counts! ** New function: scm_c_write (SCM port, const void *ptr, scm_sizet size) Used by an application to write arbitrary number of bytes to an SCM port. Similar semantics as libc write. However, unlike libc write, scm_c_write writes the requested number of bytes and has no return value. Warning: Doesn't update port line and column counts! ** New function: scm_init_guile () In contrast to scm_boot_guile, scm_init_guile will return normally after initializing Guile. It is not available on all systems, tho. ** New functions: scm_str2symbol, scm_mem2symbol The function scm_str2symbol takes a const char* pointing to a zero-terminated field of characters and creates a scheme symbol object from that C string. The function scm_mem2symbol takes a const char* and a number of characters and creates a symbol from the characters in that memory area. ** New functions: scm_primitive_make_property scm_primitive_property_ref scm_primitive_property_set_x scm_primitive_property_del_x These functions implement a new way to deal with object properties. See libguile/properties.c for their documentation. ** New function: scm_done_free (long size) This function is the inverse of scm_done_malloc. Use it to report the amount of smob memory you free. The previous method, which involved calling scm_done_malloc with negative argument, was somewhat unintuitive (and is still available, of course). ** New function: scm_c_memq (SCM obj, SCM list) This function provides a fast C level alternative for scm_memq for the case that the list parameter is known to be a proper list. The function is a replacement for scm_sloppy_memq, but is stricter in its requirements on its list input parameter, since for anything else but a proper list the function's behaviour is undefined - it may even crash or loop endlessly. Further, for the case that the object is not found in the list, scm_c_memq returns #f which is similar to scm_memq, but different from scm_sloppy_memq's behaviour. ** New functions: scm_remember_upto_here_1, scm_remember_upto_here_2, scm_remember_upto_here These functions replace the function scm_remember. ** Deprecated function: scm_remember Use one of the new functions scm_remember_upto_here_1, scm_remember_upto_here_2 or scm_remember_upto_here instead. ** New function: scm_allocate_string This function replaces the function scm_makstr. ** Deprecated function: scm_makstr Use the new function scm_allocate_string instead. ** New global variable scm_gc_running_p introduced. Use this variable to find out if garbage collection is being executed. Up to now applications have used scm_gc_heap_lock to test if garbage collection was running, which also works because of the fact that up to know only the garbage collector has set this variable. But, this is an implementation detail that may change. Further, scm_gc_heap_lock is not set throughout gc, thus the use of this variable is (and has been) not fully safe anyway. ** New macros: SCM_BITVECTOR_MAX_LENGTH, SCM_UVECTOR_MAX_LENGTH Use these instead of SCM_LENGTH_MAX. ** New macros: SCM_CONTINUATION_LENGTH, SCM_CCLO_LENGTH, SCM_STACK_LENGTH, SCM_STRING_LENGTH, SCM_SYMBOL_LENGTH, SCM_UVECTOR_LENGTH, SCM_BITVECTOR_LENGTH, SCM_VECTOR_LENGTH. Use these instead of SCM_LENGTH. ** New macros: SCM_SET_CONTINUATION_LENGTH, SCM_SET_STRING_LENGTH, SCM_SET_SYMBOL_LENGTH, SCM_SET_VECTOR_LENGTH, SCM_SET_UVECTOR_LENGTH, SCM_SET_BITVECTOR_LENGTH Use these instead of SCM_SETLENGTH ** New macros: SCM_STRING_CHARS, SCM_SYMBOL_CHARS, SCM_CCLO_BASE, SCM_VECTOR_BASE, SCM_UVECTOR_BASE, SCM_BITVECTOR_BASE, SCM_COMPLEX_MEM, SCM_ARRAY_MEM Use these instead of SCM_CHARS, SCM_UCHARS, SCM_ROCHARS, SCM_ROUCHARS or SCM_VELTS. ** New macros: SCM_SET_BIGNUM_BASE, SCM_SET_STRING_CHARS, SCM_SET_SYMBOL_CHARS, SCM_SET_UVECTOR_BASE, SCM_SET_BITVECTOR_BASE, SCM_SET_VECTOR_BASE Use these instead of SCM_SETCHARS. ** New macro: SCM_BITVECTOR_P ** New macro: SCM_STRING_COERCE_0TERMINATION_X Use instead of SCM_COERCE_SUBSTR. ** New macros: SCM_DIR_OPEN_P, SCM_DIR_FLAG_OPEN For directory objects, use these instead of SCM_OPDIRP and SCM_OPN. ** Deprecated macros: SCM_OUTOFRANGE, SCM_NALLOC, SCM_HUP_SIGNAL, SCM_INT_SIGNAL, SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, SCM_ALRM_SIGNAL, SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, SCM_ORD_SIG, SCM_NUM_SIGS, SCM_SYMBOL_SLOTS, SCM_SLOTS, SCM_SLOPPY_STRINGP, SCM_VALIDATE_STRINGORSUBSTR, SCM_FREEP, SCM_NFREEP, SCM_CHARS, SCM_UCHARS, SCM_VALIDATE_ROSTRING, SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY, SCM_ROLENGTH, SCM_LENGTH, SCM_HUGE_LENGTH, SCM_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_COERCE_SUBSTR, SCM_ROSTRINGP, SCM_RWSTRINGP, SCM_VALIDATE_RWSTRING, SCM_ROCHARS, SCM_ROUCHARS, SCM_SETLENGTH, SCM_SETCHARS, SCM_LENGTH_MAX, SCM_GC8MARKP, SCM_SETGC8MARK, SCM_CLRGC8MARK, SCM_GCTYP16, SCM_GCCDR, SCM_SUBR_DOC, SCM_OPDIRP, SCM_VALIDATE_OPDIR, SCM_WTA, RETURN_SCM_WTA, SCM_CONST_LONG, SCM_WNA, SCM_FUNC_NAME, SCM_VALIDATE_NUMBER_COPY, SCM_VALIDATE_NUMBER_DEF_COPY, SCM_SLOPPY_CONSP, SCM_SLOPPY_NCONSP, SCM_SETAND_CDR, SCM_SETOR_CDR, SCM_SETAND_CAR, SCM_SETOR_CAR Use SCM_ASSERT_RANGE or SCM_VALIDATE_XXX_RANGE instead of SCM_OUTOFRANGE. Use scm_memory_error instead of SCM_NALLOC. Use SCM_STRINGP instead of SCM_SLOPPY_STRINGP. Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_STRINGORSUBSTR. Use SCM_FREE_CELL_P instead of SCM_FREEP/SCM_NFREEP Use a type specific accessor macro instead of SCM_CHARS/SCM_UCHARS. Use a type specific accessor instead of SCM(_|_RO|_HUGE_)LENGTH. Use SCM_VALIDATE_(SYMBOL|STRING) instead of SCM_VALIDATE_ROSTRING. Use SCM_STRING_COERCE_0TERMINATION_X instead of SCM_COERCE_SUBSTR. Use SCM_STRINGP or SCM_SYMBOLP instead of SCM_ROSTRINGP. Use SCM_STRINGP instead of SCM_RWSTRINGP. Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_RWSTRING. Use SCM_STRING_CHARS instead of SCM_ROCHARS. Use SCM_STRING_UCHARS instead of SCM_ROUCHARS. Use a type specific setter macro instead of SCM_SETLENGTH. Use a type specific setter macro instead of SCM_SETCHARS. Use a type specific length macro instead of SCM_LENGTH_MAX. Use SCM_GCMARKP instead of SCM_GC8MARKP. Use SCM_SETGCMARK instead of SCM_SETGC8MARK. Use SCM_CLRGCMARK instead of SCM_CLRGC8MARK. Use SCM_TYP16 instead of SCM_GCTYP16. Use SCM_CDR instead of SCM_GCCDR. Use SCM_DIR_OPEN_P instead of SCM_OPDIRP. Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of SCM_WTA. Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of RETURN_SCM_WTA. Use SCM_VCELL_INIT instead of SCM_CONST_LONG. Use SCM_WRONG_NUM_ARGS instead of SCM_WNA. Use SCM_CONSP instead of SCM_SLOPPY_CONSP. Use !SCM_CONSP instead of SCM_SLOPPY_NCONSP. ** Removed function: scm_struct_init ** Removed variable: scm_symhash_dim ** Renamed function: scm_make_cont has been replaced by scm_make_continuation, which has a different interface. ** Deprecated function: scm_call_catching_errors Use scm_catch or scm_lazy_catch from throw.[ch] instead. ** Deprecated function: scm_strhash Use scm_string_hash instead. ** Deprecated function: scm_vector_set_length_x Instead, create a fresh vector of the desired size and copy the contents. ** scm_gensym has changed prototype scm_gensym now only takes one argument. ** Deprecated type tags: scm_tc7_ssymbol, scm_tc7_msymbol, scm_tcs_symbols, scm_tc7_lvector There is now only a single symbol type scm_tc7_symbol. The tag scm_tc7_lvector was not used anyway. ** Deprecated function: scm_make_smob_type_mfpe, scm_set_smob_mfpe. Use scm_make_smob_type and scm_set_smob_XXX instead. ** New function scm_set_smob_apply. This can be used to set an apply function to a smob type. ** Deprecated function: scm_strprint_obj Use scm_object_to_string instead. ** Deprecated function: scm_wta Use scm_wrong_type_arg, or another appropriate error signalling function instead. ** Explicit support for obarrays has been deprecated. Use `scm_str2symbol' and the generic hashtable functions instead. ** The concept of `vcells' has been deprecated. The data type `variable' is now used exclusively. `Vcells' have been a low-level concept so you are likely not affected by this change. *** Deprecated functions: scm_sym2vcell, scm_sysintern, scm_sysintern0, scm_symbol_value0, scm_intern, scm_intern0. Use scm_c_define or scm_c_lookup instead, as appropriate. *** New functions: scm_c_module_lookup, scm_c_lookup, scm_c_module_define, scm_c_define, scm_module_lookup, scm_lookup, scm_module_define, scm_define. These functions work with variables instead of with vcells. ** New functions for creating and defining `subr's and `gsubr's. The new functions more clearly distinguish between creating a subr (or gsubr) object and adding it to the current module. These new functions are available: scm_c_make_subr, scm_c_define_subr, scm_c_make_subr_with_generic, scm_c_define_subr_with_generic, scm_c_make_gsubr, scm_c_define_gsubr, scm_c_make_gsubr_with_generic, scm_c_define_gsubr_with_generic. ** Deprecated functions: scm_make_subr, scm_make_subr_opt, scm_make_subr_with_generic, scm_make_gsubr, scm_make_gsubr_with_generic. Use the new ones from above instead. ** C interface to the module system has changed. While we suggest that you avoid as many explicit module system operations from C as possible for the time being, the C interface has been made more similar to the high-level Scheme module system. *** New functions: scm_c_define_module, scm_c_use_module, scm_c_export, scm_c_resolve_module. They mostly work like their Scheme namesakes. scm_c_define_module takes a function that is called a context where the new module is current. *** Deprecated functions: scm_the_root_module, scm_make_module, scm_ensure_user_module, scm_load_scheme_module. Use the new functions instead. ** Renamed function: scm_internal_with_fluids becomes scm_c_with_fluids. scm_internal_with_fluids is available as a deprecated function. ** New function: scm_c_with_fluid. Just like scm_c_with_fluids, but takes one fluid and one value instead of lists of same. ** Deprecated typedefs: long_long, ulong_long. They are of questionable utility and they pollute the global namespace. ** Deprecated typedef: scm_sizet It is of questionable utility now that Guile requires ANSI C, and is oddly named. ** Deprecated typedefs: scm_port_rw_active, scm_port, scm_ptob_descriptor, scm_debug_info, scm_debug_frame, scm_fport, scm_option, scm_rstate, scm_rng, scm_array, scm_array_dim. Made more compliant with the naming policy by adding a _t at the end. ** Deprecated functions: scm_mkbig, scm_big2num, scm_adjbig, scm_normbig, scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl With the exception of the mysterious scm_2ulong2big, they are still available under new names (scm_i_mkbig etc). These functions are not intended to be used in user code. You should avoid dealing with bignums directly, and should deal with numbers in general (which can be bignums). ** Change in behavior: scm_num2long, scm_num2ulong The scm_num2[u]long functions don't any longer accept an inexact argument. This change in behavior is motivated by concordance with R5RS: It is more common that a primitive doesn't want to accept an inexact for an exact. ** New functions: scm_short2num, scm_ushort2num, scm_int2num, scm_uint2num, scm_size2num, scm_ptrdiff2num, scm_num2short, scm_num2ushort, scm_num2int, scm_num2uint, scm_num2ptrdiff, scm_num2size. These are conversion functions between the various ANSI C integral types and Scheme numbers. NOTE: The scm_num2xxx functions don't accept an inexact argument. ** New functions: scm_float2num, scm_double2num, scm_num2float, scm_num2double. These are conversion functions between the two ANSI C float types and Scheme numbers. ** New number validation macros: SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,INT,UINT}[_DEF] See above. ** New functions: scm_gc_protect_object, scm_gc_unprotect_object These are just nicer-named old scm_protect_object and scm_unprotect_object. ** Deprecated functions: scm_protect_object, scm_unprotect_object ** New functions: scm_gc_[un]register_root, scm_gc_[un]register_roots These functions can be used to register pointers to locations that hold SCM values. ** Deprecated function: scm_create_hook. Its sins are: misleading name, non-modularity and lack of general usefulness. Changes since Guile 1.3.4: * Changes to the distribution ** Trees from nightly snapshots and CVS now require you to run autogen.sh. We've changed the way we handle generated files in the Guile source repository. As a result, the procedure for building trees obtained from the nightly FTP snapshots or via CVS has changed: - You must have appropriate versions of autoconf, automake, and libtool installed on your system. See README for info on how to obtain these programs. - Before configuring the tree, you must first run the script `autogen.sh' at the top of the source tree. The Guile repository used to contain not only source files, written by humans, but also some generated files, like configure scripts and Makefile.in files. Even though the contents of these files could be derived mechanically from other files present, we thought it would make the tree easier to build if we checked them into CVS. However, this approach means that minor differences between developer's installed tools and habits affected the whole team. So we have removed the generated files from the repository, and added the autogen.sh script, which will reconstruct them appropriately. ** configure now has experimental options to remove support for certain features: --disable-arrays omit array and uniform array support --disable-posix omit posix interfaces --disable-networking omit networking interfaces --disable-regex omit regular expression interfaces These are likely to become separate modules some day. ** New configure option --enable-debug-freelist This enables a debugging version of SCM_NEWCELL(), and also registers an extra primitive, the setter `gc-set-debug-check-freelist!'. Configure with the --enable-debug-freelist option to enable the gc-set-debug-check-freelist! primitive, and then use: (gc-set-debug-check-freelist! #t) # turn on checking of the freelist (gc-set-debug-check-freelist! #f) # turn off checking Checking of the freelist forces a traversal of the freelist and a garbage collection before each allocation of a cell. This can slow down the interpreter dramatically, so the setter should be used to turn on this extra processing only when necessary. ** New configure option --enable-debug-malloc Include code for debugging of calls to scm_must_malloc/realloc/free. Checks that 1. objects freed by scm_must_free has been mallocated by scm_must_malloc 2. objects reallocated by scm_must_realloc has been allocated by scm_must_malloc 3. reallocated objects are reallocated with the same what string But, most importantly, it records the number of allocated objects of each kind. This is useful when searching for memory leaks. A Guile compiled with this option provides the primitive `malloc-stats' which returns an alist with pairs of kind and the number of objects of that kind. ** All includes are now referenced relative to the root directory Since some users have had problems with mixups between Guile and system headers, we have decided to always refer to Guile headers via their parent directories. This essentially creates a "private name space" for Guile headers. This means that the compiler only is given -I options for the root build and root source directory. ** Header files kw.h and genio.h have been removed. ** The module (ice-9 getopt-gnu-style) has been removed. ** New module (ice-9 documentation) Implements the interface to documentation strings associated with objects. ** New module (ice-9 time) Provides a macro `time', which displays execution time of a given form. ** New module (ice-9 history) Loading this module enables value history in the repl. * Changes to the stand-alone interpreter ** New command line option --debug Start Guile with debugging evaluator and backtraces enabled. This is useful when debugging your .guile init file or scripts. ** New help facility Usage: (help NAME) gives documentation about objects named NAME (a symbol) (help REGEXP) ditto for objects with names matching REGEXP (a string) (help 'NAME) gives documentation for NAME, even if it is not an object (help ,EXPR) gives documentation for object returned by EXPR (help (my module)) gives module commentary for `(my module)' (help) gives this text `help' searches among bindings exported from loaded modules, while `apropos' searches among bindings visible from the "current" module. Examples: (help help) (help cons) (help "output-string") ** `help' and `apropos' now prints full module names ** Dynamic linking now uses libltdl from the libtool package. The old system dependent code for doing dynamic linking has been replaced with calls to the libltdl functions which do all the hairy details for us. The major improvement is that you can now directly pass libtool library names like "libfoo.la" to `dynamic-link' and `dynamic-link' will be able to do the best shared library job you can get, via libltdl. The way dynamic libraries are found has changed and is not really portable across platforms, probably. It is therefore recommended to use absolute filenames when possible. If you pass a filename without an extension to `dynamic-link', it will try a few appropriate ones. Thus, the most platform ignorant way is to specify a name like "libfoo", without any directories and extensions. ** Guile COOP threads are now compatible with LinuxThreads Previously, COOP threading wasn't possible in applications linked with Linux POSIX threads due to their use of the stack pointer to find the thread context. This has now been fixed with a workaround which uses the pthreads to allocate the stack. ** New primitives: `pkgdata-dir', `site-dir', `library-dir' ** Positions of erring expression in scripts With version 1.3.4, the location of the erring expression in Guile scipts is no longer automatically reported. (This should have been documented before the 1.3.4 release.) You can get this information by enabling recording of positions of source expressions and running the debugging evaluator. Put this at the top of your script (or in your "site" file): (read-enable 'positions) (debug-enable 'debug) ** Backtraces in scripts It is now possible to get backtraces in scripts. Put (debug-enable 'debug 'backtrace) at the top of the script. (The first options enables the debugging evaluator. The second enables backtraces.) ** Part of module system symbol lookup now implemented in C The eval closure of most modules is now implemented in C. Since this was one of the bottlenecks for loading speed, Guile now loads code substantially faster than before. ** Attempting to get the value of an unbound variable now produces an exception with a key of 'unbound-variable instead of 'misc-error. ** The initial default output port is now unbuffered if it's using a tty device. Previously in this situation it was line-buffered. ** New hook: after-gc-hook after-gc-hook takes over the role of gc-thunk. This hook is run at the first SCM_TICK after a GC. (Thus, the code is run at the same point during evaluation as signal handlers.) Note that this hook should be used only for diagnostic and debugging purposes. It is not certain that it will continue to be well-defined when this hook is run in the future. C programmers: Note the new C level hooks scm_before_gc_c_hook, scm_before_sweep_c_hook, scm_after_gc_c_hook. ** Improvements to garbage collector Guile 1.4 has a new policy for triggering heap allocation and determining the sizes of heap segments. It fixes a number of problems in the old GC. 1. The new policy can handle two separate pools of cells (2-word/4-word) better. (The old policy would run wild, allocating more and more memory for certain programs.) 2. The old code would sometimes allocate far too much heap so that the Guile process became gigantic. The new code avoids this. 3. The old code would sometimes allocate too little so that few cells were freed at GC so that, in turn, too much time was spent in GC. 4. The old code would often trigger heap allocation several times in a row. (The new scheme predicts how large the segments needs to be in order not to need further allocation.) All in all, the new GC policy will make larger applications more efficient. The new GC scheme also is prepared for POSIX threading. Threads can allocate private pools of cells ("clusters") with just a single function call. Allocation of single cells from such a cluster can then proceed without any need of inter-thread synchronization. ** New environment variables controlling GC parameters GUILE_MAX_SEGMENT_SIZE Maximal segment size (default = 2097000) Allocation of 2-word cell heaps: GUILE_INIT_SEGMENT_SIZE_1 Size of initial heap segment in bytes (default = 360000) GUILE_MIN_YIELD_1 Minimum number of freed cells at each GC in percent of total heap size (default = 40) Allocation of 4-word cell heaps (used for real numbers and misc other objects): GUILE_INIT_SEGMENT_SIZE_2, GUILE_MIN_YIELD_2 (See entry "Way for application to customize GC parameters" under section "Changes to the scm_ interface" below.) ** Guile now implements reals using 4-word cells This speeds up computation with reals. (They were earlier allocated with `malloc'.) There is still some room for optimizations, however. ** Some further steps toward POSIX thread support have been taken *** Guile's critical sections (SCM_DEFER/ALLOW_INTS) don't have much effect any longer, and many of them will be removed in next release. *** Signals are only handled at the top of the evaluator loop, immediately after I/O, and in scm_equalp. *** The GC can allocate thread private pools of pairs. * Changes to Scheme functions and syntax ** close-input-port and close-output-port are now R5RS These procedures have been turned into primitives and have R5RS behaviour. ** New procedure: simple-format PORT MESSAGE ARG1 ... (ice-9 boot) makes `format' an alias for `simple-format' until possibly extended by the more sophisticated version in (ice-9 format) (simple-format port message . args) Write MESSAGE to DESTINATION, defaulting to `current-output-port'. MESSAGE can contain ~A (was %s) and ~S (was %S) escapes. When printed, the escapes are replaced with corresponding members of ARGS: ~A formats using `display' and ~S formats using `write'. If DESTINATION is #t, then use the `current-output-port', if DESTINATION is #f, then return a string containing the formatted text. Does not add a trailing newline." ** string-ref: the second argument is no longer optional. ** string, list->string: no longer accept strings in their arguments, only characters, for compatibility with R5RS. ** New procedure: port-closed? PORT Returns #t if PORT is closed or #f if it is open. ** Deprecated: list* The list* functionality is now provided by cons* (SRFI-1 compliant) ** New procedure: cons* ARG1 ARG2 ... ARGn Like `list', but the last arg provides the tail of the constructed list, returning (cons ARG1 (cons ARG2 (cons ... ARGn))). Requires at least one argument. If given one argument, that argument is returned as result. This function is called `list*' in some other Schemes and in Common LISP. ** Removed deprecated: serial-map, serial-array-copy!, serial-array-map! ** New procedure: object-documentation OBJECT Returns the documentation string associated with OBJECT. The procedure uses a caching mechanism so that subsequent lookups are faster. Exported by (ice-9 documentation). ** module-name now returns full names of modules Previously, only the last part of the name was returned (`session' for `(ice-9 session)'). Ex: `(ice-9 session)'. * Changes to the gh_ interface ** Deprecated: gh_int2scmb Use gh_bool2scm instead. * Changes to the scm_ interface ** Guile primitives now carry docstrings! Thanks to Greg Badros! ** Guile primitives are defined in a new way: SCM_DEFINE/SCM_DEFINE1/SCM_PROC Now Guile primitives are defined using the SCM_DEFINE/SCM_DEFINE1/SCM_PROC macros and must contain a docstring that is extracted into foo.doc using a new guile-doc-snarf script (that uses guile-doc-snarf.awk). However, a major overhaul of these macros is scheduled for the next release of guile. ** Guile primitives use a new technique for validation of arguments SCM_VALIDATE_* macros are defined to ease the redundancy and improve the readability of argument checking. ** All (nearly?) K&R prototypes for functions replaced with ANSI C equivalents. ** New macros: SCM_PACK, SCM_UNPACK Compose/decompose an SCM value. The SCM type is now treated as an abstract data type and may be defined as a long, a void* or as a struct, depending on the architecture and compile time options. This makes it easier to find several types of bugs, for example when SCM values are treated as integers without conversion. Values of the SCM type should be treated as "atomic" values. These macros are used when composing/decomposing an SCM value, either because you want to access individual bits, or because you want to treat it as an integer value. E.g., in order to set bit 7 in an SCM value x, use the expression SCM_PACK (SCM_UNPACK (x) | 0x80) ** The name property of hooks is deprecated. Thus, the use of SCM_HOOK_NAME and scm_make_hook_with_name is deprecated. You can emulate this feature by using object properties. ** Deprecated macros: SCM_INPORTP, SCM_OUTPORTP, SCM_CRDY, SCM_ICHRP, SCM_ICHR, SCM_MAKICHR, SCM_SETJMPBUF, SCM_NSTRINGP, SCM_NRWSTRINGP, SCM_NVECTORP These macros will be removed in a future release of Guile. ** The following types, functions and macros from numbers.h are deprecated: scm_dblproc, SCM_UNEGFIXABLE, SCM_FLOBUFLEN, SCM_INEXP, SCM_CPLXP, SCM_REAL, SCM_IMAG, SCM_REALPART, scm_makdbl, SCM_SINGP, SCM_NUM2DBL, SCM_NO_BIGDIG ** Port internals: the rw_random variable in the scm_port structure must be set to non-zero in any random access port. In recent Guile releases it was only set for bidirectional random-access ports. ** Port internals: the seek ptob procedure is now responsible for resetting the buffers if required. The change was made so that in the special case of reading the current position (i.e., seek p 0 SEEK_CUR) the fport and strport ptobs can avoid resetting the buffers, in particular to avoid discarding unread chars. An existing port type can be fixed by adding something like the following to the beginning of the ptob seek procedure: if (pt->rw_active == SCM_PORT_READ) scm_end_input (object); else if (pt->rw_active == SCM_PORT_WRITE) ptob->flush (object); although to actually avoid resetting the buffers and discard unread chars requires further hacking that depends on the characteristics of the ptob. ** Deprecated functions: scm_fseek, scm_tag These functions are no longer used and will be removed in a future version. ** The scm_sysmissing procedure is no longer used in libguile. Unless it turns out to be unexpectedly useful to somebody, it will be removed in a future version. ** The format of error message strings has changed The two C procedures: scm_display_error and scm_error, as well as the primitive `scm-error', now use scm_simple_format to do their work. This means that the message strings of all code must be updated to use ~A where %s was used before, and ~S where %S was used before. During the period when there still are a lot of old Guiles out there, you might want to support both old and new versions of Guile. There are basically two methods to achieve this. Both methods use autoconf. Put AC_CHECK_FUNCS(scm_simple_format) in your configure.in. Method 1: Use the string concatenation features of ANSI C's preprocessor. In C: #ifdef HAVE_SCM_SIMPLE_FORMAT #define FMT_S "~S" #else #define FMT_S "%S" #endif Then represent each of your error messages using a preprocessor macro: #define E_SPIDER_ERROR "There's a spider in your " ## FMT_S ## "!!!" In Scheme: (define fmt-s (if (defined? 'simple-format) "~S" "%S")) (define make-message string-append) (define e-spider-error (make-message "There's a spider in your " fmt-s "!!!")) Method 2: Use the oldfmt function found in doc/oldfmt.c. In C: scm_misc_error ("picnic", scm_c_oldfmt0 ("There's a spider in your ~S!!!"), ...); In Scheme: (scm-error 'misc-error "picnic" (oldfmt "There's a spider in your ~S!!!") ...) ** Deprecated: coop_mutex_init, coop_condition_variable_init Don't use the functions coop_mutex_init and coop_condition_variable_init. They will change. Use scm_mutex_init and scm_cond_init instead. ** New function: int scm_cond_timedwait (scm_cond_t *COND, scm_mutex_t *MUTEX, const struct timespec *ABSTIME) `scm_cond_timedwait' atomically unlocks MUTEX and waits on COND, as `scm_cond_wait' does, but it also bounds the duration of the wait. If COND has not been signaled before time ABSTIME, the mutex MUTEX is re-acquired and `scm_cond_timedwait' returns the error code `ETIMEDOUT'. The ABSTIME parameter specifies an absolute time, with the same origin as `time' and `gettimeofday': an ABSTIME of 0 corresponds to 00:00:00 GMT, January 1, 1970. ** New function: scm_cond_broadcast (scm_cond_t *COND) `scm_cond_broadcast' restarts all the threads that are waiting on the condition variable COND. Nothing happens if no threads are waiting on COND. ** New function: scm_key_create (scm_key_t *KEY, void (*destr_function) (void *)) `scm_key_create' allocates a new TSD key. The key is stored in the location pointed to by KEY. There is no limit on the number of keys allocated at a given time. The value initially associated with the returned key is `NULL' in all currently executing threads. The DESTR_FUNCTION argument, if not `NULL', specifies a destructor function associated with the key. When a thread terminates, DESTR_FUNCTION is called on the value associated with the key in that thread. The DESTR_FUNCTION is not called if a key is deleted with `scm_key_delete' or a value is changed with `scm_setspecific'. The order in which destructor functions are called at thread termination time is unspecified. Destructors are not yet implemented. ** New function: scm_setspecific (scm_key_t KEY, const void *POINTER) `scm_setspecific' changes the value associated with KEY in the calling thread, storing the given POINTER instead. ** New function: scm_getspecific (scm_key_t KEY) `scm_getspecific' returns the value currently associated with KEY in the calling thread. ** New function: scm_key_delete (scm_key_t KEY) `scm_key_delete' deallocates a TSD key. It does not check whether non-`NULL' values are associated with that key in the currently executing threads, nor call the destructor function associated with the key. ** New function: scm_c_hook_init (scm_c_hook_t *HOOK, void *HOOK_DATA, scm_c_hook_type_t TYPE) Initialize a C level hook HOOK with associated HOOK_DATA and type TYPE. (See scm_c_hook_run ().) ** New function: scm_c_hook_add (scm_c_hook_t *HOOK, scm_c_hook_function_t FUNC, void *FUNC_DATA, int APPENDP) Add hook function FUNC with associated FUNC_DATA to HOOK. If APPENDP is true, add it last, otherwise first. The same FUNC can be added multiple times if FUNC_DATA differ and vice versa. ** New function: scm_c_hook_remove (scm_c_hook_t *HOOK, scm_c_hook_function_t FUNC, void *FUNC_DATA) Remove hook function FUNC with associated FUNC_DATA from HOOK. A function is only removed if both FUNC and FUNC_DATA matches. ** New function: void *scm_c_hook_run (scm_c_hook_t *HOOK, void *DATA) Run hook HOOK passing DATA to the hook functions. If TYPE is SCM_C_HOOK_NORMAL, all hook functions are run. The value returned is undefined. If TYPE is SCM_C_HOOK_OR, hook functions are run until a function returns a non-NULL value. This value is returned as the result of scm_c_hook_run. If all functions return NULL, NULL is returned. If TYPE is SCM_C_HOOK_AND, hook functions are run until a function returns a NULL value, and NULL is returned. If all functions returns a non-NULL value, the last value is returned. ** New C level GC hooks Five new C level hooks has been added to the garbage collector. scm_before_gc_c_hook scm_after_gc_c_hook are run before locking and after unlocking the heap. The system is thus in a mode where evaluation can take place. (Except that scm_before_gc_c_hook must not allocate new cells.) scm_before_mark_c_hook scm_before_sweep_c_hook scm_after_sweep_c_hook are run when the heap is locked. These are intended for extension of the GC in a modular fashion. Examples are the weaks and guardians modules. ** Way for application to customize GC parameters The application can set up other default values for the GC heap allocation parameters GUILE_INIT_HEAP_SIZE_1, GUILE_MIN_YIELD_1, GUILE_INIT_HEAP_SIZE_2, GUILE_MIN_YIELD_2, GUILE_MAX_SEGMENT_SIZE, by setting scm_default_init_heap_size_1, scm_default_min_yield_1, scm_default_init_heap_size_2, scm_default_min_yield_2, scm_default_max_segment_size respectively before callong scm_boot_guile. (See entry "New environment variables ..." in section "Changes to the stand-alone interpreter" above.) ** scm_protect_object/scm_unprotect_object now nest This means that you can call scm_protect_object multiple times on an object and count on the object being protected until scm_unprotect_object has been call the same number of times. The functions also have better time complexity. Still, it is usually possible to structure the application in a way that you don't need to use these functions. For example, if you use a protected standard Guile list to keep track of live objects rather than some custom data type, objects will die a natural death when they are no longer needed. ** Deprecated type tags: scm_tc16_flo, scm_tc_flo, scm_tc_dblr, scm_tc_dblc Guile does not provide the float representation for inexact real numbers any more. Now, only doubles are used to represent inexact real numbers. Further, the tag names scm_tc_dblr and scm_tc_dblc have been changed to scm_tc16_real and scm_tc16_complex, respectively. ** Removed deprecated type scm_smobfuns ** Removed deprecated function scm_newsmob ** Warning: scm_make_smob_type_mfpe might become deprecated in a future release There is an ongoing discussion among the developers whether to deprecate `scm_make_smob_type_mfpe' or not. Please use the current standard interface (scm_make_smob_type, scm_set_smob_XXX) in new code until this issue has been settled. ** Removed deprecated type tag scm_tc16_kw ** Added type tag scm_tc16_keyword (This was introduced already in release 1.3.4 but was not documented until now.) ** gdb_print now prints "*** Guile not initialized ***" until Guile initialized * Changes to system call interfaces: ** The "select" procedure now tests port buffers for the ability to provide input or accept output. Previously only the underlying file descriptors were checked. ** New variable PIPE_BUF: the maximum number of bytes that can be atomically written to a pipe. ** If a facility is not available on the system when Guile is compiled, the corresponding primitive procedure will not be defined. Previously it would have been defined but would throw a system-error exception if called. Exception handlers which catch this case may need minor modification: an error will be thrown with key 'unbound-variable instead of 'system-error. Alternatively it's now possible to use `defined?' to check whether the facility is available. ** Procedures which depend on the timezone should now give the correct result on systems which cache the TZ environment variable, even if TZ is changed without calling tzset. * Changes to the networking interfaces: ** New functions: htons, ntohs, htonl, ntohl: for converting short and long integers between network and host format. For now, it's not particularly convenient to do this kind of thing, but consider: (define write-network-long (lambda (value port) (let ((v (make-uniform-vector 1 1 0))) (uniform-vector-set! v 0 (htonl value)) (uniform-vector-write v port)))) (define read-network-long (lambda (port) (let ((v (make-uniform-vector 1 1 0))) (uniform-vector-read! v port) (ntohl (uniform-vector-ref v 0))))) ** If inet-aton fails, it now throws an error with key 'misc-error instead of 'system-error, since errno is not relevant. ** Certain gethostbyname/gethostbyaddr failures now throw errors with specific keys instead of 'system-error. The latter is inappropriate since errno will not have been set. The keys are: 'host-not-found, 'try-again, 'no-recovery and 'no-data. ** sethostent, setnetent, setprotoent, setservent: now take an optional argument STAYOPEN, which specifies whether the database remains open after a database entry is accessed randomly (e.g., using gethostbyname for the hosts database.) The default is #f. Previously #t was always used. Changes since Guile 1.3.2: * Changes to the stand-alone interpreter ** Debugger An initial version of the Guile debugger written by Chris Hanson has been added. The debugger is still under development but is included in the distribution anyway since it is already quite useful. Type (debug) after an error to enter the debugger. Type `help' inside the debugger for a description of available commands. If you prefer to have stack frames numbered and printed in anti-chronological order and prefer up in the stack to be down on the screen as is the case in gdb, you can put (debug-enable 'backwards) in your .guile startup file. (However, this means that Guile can't use indentation to indicate stack level.) The debugger is autoloaded into Guile at the first use. ** Further enhancements to backtraces There is a new debug option `width' which controls the maximum width on the screen of printed stack frames. Fancy printing parameters ("level" and "length" as in Common LISP) are adaptively adjusted for each stack frame to give maximum information while still fitting within the bounds. If the stack frame can't be made to fit by adjusting parameters, it is simply cut off at the end. This is marked with a `$'. ** Some modules are now only loaded when the repl is started The modules (ice-9 debug), (ice-9 session), (ice-9 threads) and (ice-9 regex) are now loaded into (guile-user) only if the repl has been started. The effect is that the startup time for scripts has been reduced to 30% of what it was previously. Correctly written scripts load the modules they require at the top of the file and should not be affected by this change. ** Hooks are now represented as smobs * Changes to Scheme functions and syntax ** Readline support has changed again. The old (readline-activator) module is gone. Use (ice-9 readline) instead, which now contains all readline functionality. So the code to activate readline is now (use-modules (ice-9 readline)) (activate-readline) This should work at any time, including from the guile prompt. To avoid confusion about the terms of Guile's license, please only enable readline for your personal use; please don't make it the default for others. Here is why we make this rather odd-sounding request: Guile is normally licensed under a weakened form of the GNU General Public License, which allows you to link code with Guile without placing that code under the GPL. This exception is important to some people. However, since readline is distributed under the GNU General Public License, when you link Guile with readline, either statically or dynamically, you effectively change Guile's license to the strict GPL. Whenever you link any strictly GPL'd code into Guile, uses of Guile which are normally permitted become forbidden. This is a rather non-obvious consequence of the licensing terms. So, to make sure things remain clear, please let people choose for themselves whether to link GPL'd libraries like readline with Guile. ** regexp-substitute/global has changed slightly, but incompatibly. If you include a function in the item list, the string of the match object it receives is the same string passed to regexp-substitute/global, not some suffix of that string. Correspondingly, the match's positions are relative to the entire string, not the suffix. If the regexp can match the empty string, the way matches are chosen from the string has changed. regexp-substitute/global recognizes the same set of matches that list-matches does; see below. ** New function: list-matches REGEXP STRING [FLAGS] Return a list of match objects, one for every non-overlapping, maximal match of REGEXP in STRING. The matches appear in left-to-right order. list-matches only reports matches of the empty string if there are no other matches which begin on, end at, or include the empty match's position. If present, FLAGS is passed as the FLAGS argument to regexp-exec. ** New function: fold-matches REGEXP STRING INIT PROC [FLAGS] For each match of REGEXP in STRING, apply PROC to the match object, and the last value PROC returned, or INIT for the first call. Return the last value returned by PROC. We apply PROC to the matches as they appear from left to right. This function recognizes matches according to the same criteria as list-matches. Thus, you could define list-matches like this: (define (list-matches regexp string . flags) (reverse! (apply fold-matches regexp string '() cons flags))) If present, FLAGS is passed as the FLAGS argument to regexp-exec. ** Hooks *** New function: hook? OBJ Return #t if OBJ is a hook, otherwise #f. *** New function: make-hook-with-name NAME [ARITY] Return a hook with name NAME and arity ARITY. The default value for ARITY is 0. The only effect of NAME is that it will appear when the hook object is printed to ease debugging. *** New function: hook-empty? HOOK Return #t if HOOK doesn't contain any procedures, otherwise #f. *** New function: hook->list HOOK Return a list of the procedures that are called when run-hook is applied to HOOK. ** `map' signals an error if its argument lists are not all the same length. This is the behavior required by R5RS, so this change is really a bug fix. But it seems to affect a lot of people's code, so we're mentioning it here anyway. ** Print-state handling has been made more transparent Under certain circumstances, ports are represented as a port with an associated print state. Earlier, this pair was represented as a pair (see "Some magic has been added to the printer" below). It is now indistinguishable (almost; see `get-print-state') from a port on the user level. *** New function: port-with-print-state OUTPUT-PORT PRINT-STATE Return a new port with the associated print state PRINT-STATE. *** New function: get-print-state OUTPUT-PORT Return the print state associated with this port if it exists, otherwise return #f. *** New function: directory-stream? OBJECT Returns true iff OBJECT is a directory stream --- the sort of object returned by `opendir'. ** New function: using-readline? Return #t if readline is in use in the current repl. ** structs will be removed in 1.4 Structs will be replaced in Guile 1.4. We will merge GOOPS into Guile and use GOOPS objects as the fundamental record type. * Changes to the scm_ interface ** structs will be removed in 1.4 The entire current struct interface (struct.c, struct.h) will be replaced in Guile 1.4. We will merge GOOPS into libguile and use GOOPS objects as the fundamental record type. ** The internal representation of subr's has changed Instead of giving a hint to the subr name, the CAR field of the subr now contains an index to a subr entry in scm_subr_table. *** New variable: scm_subr_table An array of subr entries. A subr entry contains the name, properties and documentation associated with the subr. The properties and documentation slots are not yet used. ** A new scheme for "forwarding" calls to a builtin to a generic function It is now possible to extend the functionality of some Guile primitives by letting them defer a call to a GOOPS generic function on argument mismatch. This means that there is no loss of efficiency in normal evaluation. Example: (use-modules (oop goops)) ; Must be GOOPS version 0.2. (define-method + ((x ) (y )) (string-append x y)) + will still be as efficient as usual in numerical calculations, but can also be used for concatenating strings. Who will be the first one to extend Guile's numerical tower to rationals? :) [OK, there a few other things to fix before this can be made in a clean way.] *** New snarf macros for defining primitives: SCM_GPROC, SCM_GPROC1 New macro: SCM_GPROC (CNAME, SNAME, REQ, OPT, VAR, CFUNC, GENERIC) New macro: SCM_GPROC1 (CNAME, SNAME, TYPE, CFUNC, GENERIC) These do the same job as SCM_PROC and SCM_PROC1, but they also define a variable GENERIC which can be used by the dispatch macros below. [This is experimental code which may change soon.] *** New macros for forwarding control to a generic on arg type error New macro: SCM_WTA_DISPATCH_1 (GENERIC, ARG1, POS, SUBR) New macro: SCM_WTA_DISPATCH_2 (GENERIC, ARG1, ARG2, POS, SUBR) These correspond to the scm_wta function call, and have the same behaviour until the user has called the GOOPS primitive `enable-primitive-generic!'. After that, these macros will apply the generic function GENERIC to the argument(s) instead of calling scm_wta. [This is experimental code which may change soon.] *** New macros for argument testing with generic dispatch New macro: SCM_GASSERT1 (COND, GENERIC, ARG1, POS, SUBR) New macro: SCM_GASSERT2 (COND, GENERIC, ARG1, ARG2, POS, SUBR) These correspond to the SCM_ASSERT macro, but will defer control to GENERIC on error after `enable-primitive-generic!' has been called. [This is experimental code which may change soon.] ** New function: SCM scm_eval_body (SCM body, SCM env) Evaluates the body of a special form. ** The internal representation of struct's has changed Previously, four slots were allocated for the procedure(s) of entities and operators. The motivation for this representation had to do with the structure of the evaluator, the wish to support tail-recursive generic functions, and efficiency. Since the generic function dispatch mechanism has changed, there is no longer a need for such an expensive representation, and the representation has been simplified. This should not make any difference for most users. ** GOOPS support has been cleaned up. Some code has been moved from eval.c to objects.c and code in both of these compilation units has been cleaned up and better structured. *** New functions for applying generic functions New function: SCM scm_apply_generic (GENERIC, ARGS) New function: SCM scm_call_generic_0 (GENERIC) New function: SCM scm_call_generic_1 (GENERIC, ARG1) New function: SCM scm_call_generic_2 (GENERIC, ARG1, ARG2) New function: SCM scm_call_generic_3 (GENERIC, ARG1, ARG2, ARG3) ** Deprecated function: scm_make_named_hook It is now replaced by: ** New function: SCM scm_create_hook (const char *name, int arity) Creates a hook in the same way as make-hook above but also binds a variable named NAME to it. This is the typical way of creating a hook from C code. Currently, the variable is created in the "current" module. This might change when we get the new module system. [The behaviour is identical to scm_make_named_hook.] Changes since Guile 1.3: * Changes to mailing lists ** Some of the Guile mailing lists have moved to sourceware.cygnus.com. See the README file to find current addresses for all the Guile mailing lists. * Changes to the distribution ** Readline support is no longer included with Guile by default. Based on the different license terms of Guile and Readline, we concluded that Guile should not *by default* cause the linking of Readline into an application program. Readline support is now offered as a separate module, which is linked into an application only when you explicitly specify it. Although Guile is GNU software, its distribution terms add a special exception to the usual GNU General Public License (GPL). Guile's license includes a clause that allows you to link Guile with non-free programs. We add this exception so as not to put Guile at a disadvantage vis-a-vis other extensibility packages that support other languages. In contrast, the GNU Readline library is distributed under the GNU General Public License pure and simple. This means that you may not link Readline, even dynamically, into an application unless it is distributed under a free software license that is compatible the GPL. Because of this difference in distribution terms, an application that can use Guile may not be able to use Readline. Now users will be explicitly offered two independent decisions about the use of these two packages. You can activate the readline support by issuing (use-modules (readline-activator)) (activate-readline) from your ".guile" file, for example. * Changes to the stand-alone interpreter ** All builtins now print as primitives. Previously builtin procedures not belonging to the fundamental subr types printed as #>. Now, they print as #. ** Backtraces slightly more intelligible. gsubr-apply and macro transformer application frames no longer appear in backtraces. * Changes to Scheme functions and syntax ** Guile now correctly handles internal defines by rewriting them into their equivalent letrec. Previously, internal defines would incrementally add to the innermost environment, without checking whether the restrictions specified in RnRS were met. This lead to the correct behaviour when these restriction actually were met, but didn't catch all illegal uses. Such an illegal use could lead to crashes of the Guile interpreter or or other unwanted results. An example of incorrect internal defines that made Guile behave erratically: (let () (define a 1) (define (b) a) (define c (1+ (b))) (define d 3) (b)) => 2 The problem with this example is that the definition of `c' uses the value of `b' directly. This confuses the meoization machine of Guile so that the second call of `b' (this time in a larger environment that also contains bindings for `c' and `d') refers to the binding of `c' instead of `a'. You could also make Guile crash with a variation on this theme: (define (foo flag) (define a 1) (define (b flag) (if flag a 1)) (define c (1+ (b flag))) (define d 3) (b #t)) (foo #f) (foo #t) From now on, Guile will issue an `Unbound variable: b' error message for both examples. ** Hooks A hook contains a list of functions which should be called on particular occasions in an existing program. Hooks are used for customization. A window manager might have a hook before-window-map-hook. The window manager uses the function run-hooks to call all functions stored in before-window-map-hook each time a window is mapped. The user can store functions in the hook using add-hook!. In Guile, hooks are first class objects. *** New function: make-hook [N_ARGS] Return a hook for hook functions which can take N_ARGS arguments. The default value for N_ARGS is 0. (See also scm_make_named_hook below.) *** New function: add-hook! HOOK PROC [APPEND_P] Put PROC at the beginning of the list of functions stored in HOOK. If APPEND_P is supplied, and non-false, put PROC at the end instead. PROC must be able to take the number of arguments specified when the hook was created. If PROC already exists in HOOK, then remove it first. *** New function: remove-hook! HOOK PROC Remove PROC from the list of functions in HOOK. *** New function: reset-hook! HOOK Clear the list of hook functions stored in HOOK. *** New function: run-hook HOOK ARG1 ... Run all hook functions stored in HOOK with arguments ARG1 ... . The number of arguments supplied must correspond to the number given when the hook was created. ** The function `dynamic-link' now takes optional keyword arguments. The only keyword argument that is currently defined is `:global BOOL'. With it, you can control whether the shared library will be linked in global mode or not. In global mode, the symbols from the linked library can be used to resolve references from other dynamically linked libraries. In non-global mode, the linked library is essentially invisible and can only be accessed via `dynamic-func', etc. The default is now to link in global mode. Previously, the default has been non-global mode. The `#:global' keyword is only effective on platforms that support the dlopen family of functions. ** New function `provided?' - Function: provided? FEATURE Return true iff FEATURE is supported by this installation of Guile. FEATURE must be a symbol naming a feature; the global variable `*features*' is a list of available features. ** Changes to the module (ice-9 expect): *** The expect-strings macro now matches `$' in a regular expression only at a line-break or end-of-file by default. Previously it would match the end of the string accumulated so far. The old behaviour can be obtained by setting the variable `expect-strings-exec-flags' to 0. *** The expect-strings macro now uses a variable `expect-strings-exec-flags' for the regexp-exec flags. If `regexp/noteol' is included, then `$' in a regular expression will still match before a line-break or end-of-file. The default is `regexp/noteol'. *** The expect-strings macro now uses a variable `expect-strings-compile-flags' for the flags to be supplied to `make-regexp'. The default is `regexp/newline', which was previously hard-coded. *** The expect macro now supplies two arguments to a match procedure: the current accumulated string and a flag to indicate whether end-of-file has been reached. Previously only the string was supplied. If end-of-file is reached, the match procedure will be called an additional time with the same accumulated string as the previous call but with the flag set. ** New module (ice-9 format), implementing the Common Lisp `format' function. This code, and the documentation for it that appears here, was borrowed from SLIB, with minor adaptations for Guile. - Function: format DESTINATION FORMAT-STRING . ARGUMENTS An almost complete implementation of Common LISP format description according to the CL reference book `Common LISP' from Guy L. Steele, Digital Press. Backward compatible to most of the available Scheme format implementations. Returns `#t', `#f' or a string; has side effect of printing according to FORMAT-STRING. If DESTINATION is `#t', the output is to the current output port and `#t' is returned. If DESTINATION is `#f', a formatted string is returned as the result of the call. NEW: If DESTINATION is a string, DESTINATION is regarded as the format string; FORMAT-STRING is then the first argument and the output is returned as a string. If DESTINATION is a number, the output is to the current error port if available by the implementation. Otherwise DESTINATION must be an output port and `#t' is returned. FORMAT-STRING must be a string. In case of a formatting error format returns `#f' and prints a message on the current output or error port. Characters are output as if the string were output by the `display' function with the exception of those prefixed by a tilde (~). For a detailed description of the FORMAT-STRING syntax please consult a Common LISP format reference manual. For a test suite to verify this format implementation load `formatst.scm'. Please send bug reports to `lutzeb@cs.tu-berlin.de'. Note: `format' is not reentrant, i.e. only one `format'-call may be executed at a time. *** Format Specification (Format version 3.0) Please consult a Common LISP format reference manual for a detailed description of the format string syntax. For a demonstration of the implemented directives see `formatst.scm'. This implementation supports directive parameters and modifiers (`:' and `@' characters). Multiple parameters must be separated by a comma (`,'). Parameters can be numerical parameters (positive or negative), character parameters (prefixed by a quote character (`''), variable parameters (`v'), number of rest arguments parameter (`#'), empty and default parameters. Directive characters are case independent. The general form of a directive is: DIRECTIVE ::= ~{DIRECTIVE-PARAMETER,}[:][@]DIRECTIVE-CHARACTER DIRECTIVE-PARAMETER ::= [ [-|+]{0-9}+ | 'CHARACTER | v | # ] *** Implemented CL Format Control Directives Documentation syntax: Uppercase characters represent the corresponding control directive characters. Lowercase characters represent control directive parameter descriptions. `~A' Any (print as `display' does). `~@A' left pad. `~MINCOL,COLINC,MINPAD,PADCHARA' full padding. `~S' S-expression (print as `write' does). `~@S' left pad. `~MINCOL,COLINC,MINPAD,PADCHARS' full padding. `~D' Decimal. `~@D' print number sign always. `~:D' print comma separated. `~MINCOL,PADCHAR,COMMACHARD' padding. `~X' Hexadecimal. `~@X' print number sign always. `~:X' print comma separated. `~MINCOL,PADCHAR,COMMACHARX' padding. `~O' Octal. `~@O' print number sign always. `~:O' print comma separated. `~MINCOL,PADCHAR,COMMACHARO' padding. `~B' Binary. `~@B' print number sign always. `~:B' print comma separated. `~MINCOL,PADCHAR,COMMACHARB' padding. `~NR' Radix N. `~N,MINCOL,PADCHAR,COMMACHARR' padding. `~@R' print a number as a Roman numeral. `~:@R' print a number as an "old fashioned" Roman numeral. `~:R' print a number as an ordinal English number. `~:@R' print a number as a cardinal English number. `~P' Plural. `~@P' prints `y' and `ies'. `~:P' as `~P but jumps 1 argument backward.' `~:@P' as `~@P but jumps 1 argument backward.' `~C' Character. `~@C' prints a character as the reader can understand it (i.e. `#\' prefixing). `~:C' prints a character as emacs does (eg. `^C' for ASCII 03). `~F' Fixed-format floating-point (prints a flonum like MMM.NNN). `~WIDTH,DIGITS,SCALE,OVERFLOWCHAR,PADCHARF' `~@F' If the number is positive a plus sign is printed. `~E' Exponential floating-point (prints a flonum like MMM.NNN`E'EE). `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARE' `~@E' If the number is positive a plus sign is printed. `~G' General floating-point (prints a flonum either fixed or exponential). `~WIDTH,DIGITS,EXPONENTDIGITS,SCALE,OVERFLOWCHAR,PADCHAR,EXPONENTCHARG' `~@G' If the number is positive a plus sign is printed. `~$' Dollars floating-point (prints a flonum in fixed with signs separated). `~DIGITS,SCALE,WIDTH,PADCHAR$' `~@$' If the number is positive a plus sign is printed. `~:@$' A sign is always printed and appears before the padding. `~:$' The sign appears before the padding. `~%' Newline. `~N%' print N newlines. `~&' print newline if not at the beginning of the output line. `~N&' prints `~&' and then N-1 newlines. `~|' Page Separator. `~N|' print N page separators. `~~' Tilde. `~N~' print N tildes. `~' Continuation Line. `~:' newline is ignored, white space left. `~@' newline is left, white space ignored. `~T' Tabulation. `~@T' relative tabulation. `~COLNUM,COLINCT' full tabulation. `~?' Indirection (expects indirect arguments as a list). `~@?' extracts indirect arguments from format arguments. `~(STR~)' Case conversion (converts by `string-downcase'). `~:(STR~)' converts by `string-capitalize'. `~@(STR~)' converts by `string-capitalize-first'. `~:@(STR~)' converts by `string-upcase'. `~*' Argument Jumping (jumps 1 argument forward). `~N*' jumps N arguments forward. `~:*' jumps 1 argument backward. `~N:*' jumps N arguments backward. `~@*' jumps to the 0th argument. `~N@*' jumps to the Nth argument (beginning from 0) `~[STR0~;STR1~;...~;STRN~]' Conditional Expression (numerical clause conditional). `~N[' take argument from N. `~@[' true test conditional. `~:[' if-else-then conditional. `~;' clause separator. `~:;' default clause follows. `~{STR~}' Iteration (args come from the next argument (a list)). `~N{' at most N iterations. `~:{' args from next arg (a list of lists). `~@{' args from the rest of arguments. `~:@{' args from the rest args (lists). `~^' Up and out. `~N^' aborts if N = 0 `~N,M^' aborts if N = M `~N,M,K^' aborts if N <= M <= K *** Not Implemented CL Format Control Directives `~:A' print `#f' as an empty list (see below). `~:S' print `#f' as an empty list (see below). `~<~>' Justification. `~:^' (sorry I don't understand its semantics completely) *** Extended, Replaced and Additional Control Directives `~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHD' `~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHX' `~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHO' `~MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHB' `~N,MINCOL,PADCHAR,COMMACHAR,COMMAWIDTHR' COMMAWIDTH is the number of characters between two comma characters. `~I' print a R4RS complex number as `~F~@Fi' with passed parameters for `~F'. `~Y' Pretty print formatting of an argument for scheme code lists. `~K' Same as `~?.' `~!' Flushes the output if format DESTINATION is a port. `~_' Print a `#\space' character `~N_' print N `#\space' characters. `~/' Print a `#\tab' character `~N/' print N `#\tab' characters. `~NC' Takes N as an integer representation for a character. No arguments are consumed. N is converted to a character by `integer->char'. N must be a positive decimal number. `~:S' Print out readproof. Prints out internal objects represented as `#<...>' as strings `"#<...>"' so that the format output can always be processed by `read'. `~:A' Print out readproof. Prints out internal objects represented as `#<...>' as strings `"#<...>"' so that the format output can always be processed by `read'. `~Q' Prints information and a copyright notice on the format implementation. `~:Q' prints format version. `~F, ~E, ~G, ~$' may also print number strings, i.e. passing a number as a string and format it accordingly. *** Configuration Variables The format module exports some configuration variables to suit the systems and users needs. There should be no modification necessary for the configuration that comes with Guile. Format detects automatically if the running scheme system implements floating point numbers and complex numbers. format:symbol-case-conv Symbols are converted by `symbol->string' so the case type of the printed symbols is implementation dependent. `format:symbol-case-conv' is a one arg closure which is either `#f' (no conversion), `string-upcase', `string-downcase' or `string-capitalize'. (default `#f') format:iobj-case-conv As FORMAT:SYMBOL-CASE-CONV but applies for the representation of implementation internal objects. (default `#f') format:expch The character prefixing the exponent value in `~E' printing. (default `#\E') *** Compatibility With Other Format Implementations SLIB format 2.x: See `format.doc'. SLIB format 1.4: Downward compatible except for padding support and `~A', `~S', `~P', `~X' uppercase printing. SLIB format 1.4 uses C-style `printf' padding support which is completely replaced by the CL `format' padding style. MIT C-Scheme 7.1: Downward compatible except for `~', which is not documented (ignores all characters inside the format string up to a newline character). (7.1 implements `~a', `~s', ~NEWLINE, `~~', `~%', numerical and variable parameters and `:/@' modifiers in the CL sense). Elk 1.5/2.0: Downward compatible except for `~A' and `~S' which print in uppercase. (Elk implements `~a', `~s', `~~', and `~%' (no directive parameters or modifiers)). Scheme->C 01nov91: Downward compatible except for an optional destination parameter: S2C accepts a format call without a destination which returns a formatted string. This is equivalent to a #f destination in S2C. (S2C implements `~a', `~s', `~c', `~%', and `~~' (no directive parameters or modifiers)). ** Changes to string-handling functions. These functions were added to support the (ice-9 format) module, above. *** New function: string-upcase STRING *** New function: string-downcase STRING These are non-destructive versions of the existing string-upcase! and string-downcase! functions. *** New function: string-capitalize! STRING *** New function: string-capitalize STRING These functions convert the first letter of each word in the string to upper case. Thus: (string-capitalize "howdy there") => "Howdy There" As with the other functions, string-capitalize! modifies the string in place, while string-capitalize returns a modified copy of its argument. *** New function: string-ci->symbol STRING Return a symbol whose name is STRING, but having the same case as if the symbol had be read by `read'. Guile can be configured to be sensitive or insensitive to case differences in Scheme identifiers. If Guile is case-insensitive, all symbols are converted to lower case on input. The `string-ci->symbol' function returns a symbol whose name in STRING, transformed as Guile would if STRING were input. *** New function: substring-move! STRING1 START END STRING2 START Copy the substring of STRING1 from START (inclusive) to END (exclusive) to STRING2 at START. STRING1 and STRING2 may be the same string, and the source and destination areas may overlap; in all cases, the function behaves as if all the characters were copied simultanously. *** Extended functions: substring-move-left! substring-move-right! These functions now correctly copy arbitrarily overlapping substrings; they are both synonyms for substring-move!. ** New module (ice-9 getopt-long), with the function `getopt-long'. getopt-long is a function for parsing command-line arguments in a manner consistent with other GNU programs. (getopt-long ARGS GRAMMAR) Parse the arguments ARGS according to the argument list grammar GRAMMAR. ARGS should be a list of strings. Its first element should be the name of the program; subsequent elements should be the arguments that were passed to the program on the command line. The `program-arguments' procedure returns a list of this form. GRAMMAR is a list of the form: ((OPTION (PROPERTY VALUE) ...) ...) Each OPTION should be a symbol. `getopt-long' will accept a command-line option named `--OPTION'. Each option can have the following (PROPERTY VALUE) pairs: (single-char CHAR) --- Accept `-CHAR' as a single-character equivalent to `--OPTION'. This is how to specify traditional Unix-style flags. (required? BOOL) --- If BOOL is true, the option is required. getopt-long will raise an error if it is not found in ARGS. (value BOOL) --- If BOOL is #t, the option accepts a value; if it is #f, it does not; and if it is the symbol `optional', the option may appear in ARGS with or without a value. (predicate FUNC) --- If the option accepts a value (i.e. you specified `(value #t)' for this option), then getopt will apply FUNC to the value, and throw an exception if it returns #f. FUNC should be a procedure which accepts a string and returns a boolean value; you may need to use quasiquotes to get it into GRAMMAR. The (PROPERTY VALUE) pairs may occur in any order, but each property may occur only once. By default, options do not have single-character equivalents, are not required, and do not take values. In ARGS, single-character options may be combined, in the usual Unix fashion: ("-x" "-y") is equivalent to ("-xy"). If an option accepts values, then it must be the last option in the combination; the value is the next argument. So, for example, using the following grammar: ((apples (single-char #\a)) (blimps (single-char #\b) (value #t)) (catalexis (single-char #\c) (value #t))) the following argument lists would be acceptable: ("-a" "-b" "bang" "-c" "couth") ("bang" and "couth" are the values for "blimps" and "catalexis") ("-ab" "bang" "-c" "couth") (same) ("-ac" "couth" "-b" "bang") (same) ("-abc" "couth" "bang") (an error, since `-b' is not the last option in its combination) If an option's value is optional, then `getopt-long' decides whether it has a value by looking at what follows it in ARGS. If the next element is a string, and it does not appear to be an option itself, then that string is the option's value. The value of a long option can appear as the next element in ARGS, or it can follow the option name, separated by an `=' character. Thus, using the same grammar as above, the following argument lists are equivalent: ("--apples" "Braeburn" "--blimps" "Goodyear") ("--apples=Braeburn" "--blimps" "Goodyear") ("--blimps" "Goodyear" "--apples=Braeburn") If the option "--" appears in ARGS, argument parsing stops there; subsequent arguments are returned as ordinary arguments, even if they resemble options. So, in the argument list: ("--apples" "Granny Smith" "--" "--blimp" "Goodyear") `getopt-long' will recognize the `apples' option as having the value "Granny Smith", but it will not recognize the `blimp' option; it will return the strings "--blimp" and "Goodyear" as ordinary argument strings. The `getopt-long' function returns the parsed argument list as an assocation list, mapping option names --- the symbols from GRAMMAR --- onto their values, or #t if the option does not accept a value. Unused options do not appear in the alist. All arguments that are not the value of any option are returned as a list, associated with the empty list. `getopt-long' throws an exception if: - it finds an unrecognized option in ARGS - a required option is omitted - an option that requires an argument doesn't get one - an option that doesn't accept an argument does get one (this can only happen using the long option `--opt=value' syntax) - an option predicate fails So, for example: (define grammar `((lockfile-dir (required? #t) (value #t) (single-char #\k) (predicate ,file-is-directory?)) (verbose (required? #f) (single-char #\v) (value #f)) (x-includes (single-char #\x)) (rnet-server (single-char #\y) (predicate ,string?)))) (getopt-long '("my-prog" "-vk" "/tmp" "foo1" "--x-includes=/usr/include" "--rnet-server=lamprod" "--" "-fred" "foo2" "foo3") grammar) => ((() "foo1" "-fred" "foo2" "foo3") (rnet-server . "lamprod") (x-includes . "/usr/include") (lockfile-dir . "/tmp") (verbose . #t)) ** The (ice-9 getopt-gnu-style) module is obsolete; use (ice-9 getopt-long). It will be removed in a few releases. ** New syntax: lambda* ** New syntax: define* ** New syntax: define*-public ** New syntax: defmacro* ** New syntax: defmacro*-public Guile now supports optional arguments. `lambda*', `define*', `define*-public', `defmacro*' and `defmacro*-public' are identical to the non-* versions except that they use an extended type of parameter list that has the following BNF syntax (parentheses are literal, square brackets indicate grouping, and `*', `+' and `?' have the usual meaning): ext-param-list ::= ( [identifier]* [#&optional [ext-var-decl]+]? [#&key [ext-var-decl]+ [#&allow-other-keys]?]? [[#&rest identifier]|[. identifier]]? ) | [identifier] ext-var-decl ::= identifier | ( identifier expression ) The semantics are best illustrated with the following documentation and examples for `lambda*': lambda* args . body lambda extended for optional and keyword arguments lambda* creates a procedure that takes optional arguments. These are specified by putting them inside brackets at the end of the paramater list, but before any dotted rest argument. For example, (lambda* (a b #&optional c d . e) '()) creates a procedure with fixed arguments a and b, optional arguments c and d, and rest argument e. If the optional arguments are omitted in a call, the variables for them are unbound in the procedure. This can be checked with the bound? macro. lambda* can also take keyword arguments. For example, a procedure defined like this: (lambda* (#&key xyzzy larch) '()) can be called with any of the argument lists (#:xyzzy 11) (#:larch 13) (#:larch 42 #:xyzzy 19) (). Whichever arguments are given as keywords are bound to values. Optional and keyword arguments can also be given default values which they take on when they are not present in a call, by giving a two-item list in place of an optional argument, for example in: (lambda* (foo #&optional (bar 42) #&key (baz 73)) (list foo bar baz)) foo is a fixed argument, bar is an optional argument with default value 42, and baz is a keyword argument with default value 73. Default value expressions are not evaluated unless they are needed and until the procedure is called. lambda* now supports two more special parameter list keywords. lambda*-defined procedures now throw an error by default if a keyword other than one of those specified is found in the actual passed arguments. However, specifying #&allow-other-keys immediately after the kyword argument declarations restores the previous behavior of ignoring unknown keywords. lambda* also now guarantees that if the same keyword is passed more than once, the last one passed is the one that takes effect. For example, ((lambda* (#&key (heads 0) (tails 0)) (display (list heads tails))) #:heads 37 #:tails 42 #:heads 99) would result in (99 47) being displayed. #&rest is also now provided as a synonym for the dotted syntax rest argument. The argument lists (a . b) and (a #&rest b) are equivalent in all respects to lambda*. This is provided for more similarity to DSSSL, MIT-Scheme and Kawa among others, as well as for refugees from other Lisp dialects. Further documentation may be found in the optargs.scm file itself. The optional argument module also exports the macros `let-optional', `let-optional*', `let-keywords', `let-keywords*' and `bound?'. These are not documented here because they may be removed in the future, but full documentation is still available in optargs.scm. ** New syntax: and-let* Guile now supports the `and-let*' form, described in the draft SRFI-2. Syntax: (land* ( ...) ...) Each should have one of the following forms: ( ) () Each or should be an identifier. Each should be a valid expression. The should be a possibly empty sequence of expressions, like the of a lambda form. Semantics: A LAND* expression is evaluated by evaluating the or of each of the s from left to right. The value of the first or that evaluates to a false value is returned; the remaining s and s are not evaluated. The forms are evaluated iff all the s and s evaluate to true values. The s and the are evaluated in an environment binding each of the preceding ( ) clauses to the value of the . Later bindings shadow earlier bindings. Guile's and-let* macro was contributed by Michael Livshin. ** New sorting functions *** New function: sorted? SEQUENCE LESS? Returns `#t' when the sequence argument is in non-decreasing order according to LESS? (that is, there is no adjacent pair `... x y ...' for which `(less? y x)'). Returns `#f' when the sequence contains at least one out-of-order pair. It is an error if the sequence is neither a list nor a vector. *** New function: merge LIST1 LIST2 LESS? LIST1 and LIST2 are sorted lists. Returns the sorted list of all elements in LIST1 and LIST2. Assume that the elements a and b1 in LIST1 and b2 in LIST2 are "equal" in the sense that (LESS? x y) --> #f for x, y in {a, b1, b2}, and that a < b1 in LIST1. Then a < b1 < b2 in the result. (Here "<" should read "comes before".) *** New procedure: merge! LIST1 LIST2 LESS? Merges two lists, re-using the pairs of LIST1 and LIST2 to build the result. If the code is compiled, and LESS? constructs no new pairs, no pairs at all will be allocated. The first pair of the result will be either the first pair of LIST1 or the first pair of LIST2. *** New function: sort SEQUENCE LESS? Accepts either a list or a vector, and returns a new sequence which is sorted. The new sequence is the same type as the input. Always `(sorted? (sort sequence less?) less?)'. The original sequence is not altered in any way. The new sequence shares its elements with the old one; no elements are copied. *** New procedure: sort! SEQUENCE LESS Returns its sorted result in the original boxes. No new storage is allocated at all. Proper usage: (set! slist (sort! slist <)) *** New function: stable-sort SEQUENCE LESS? Similar to `sort' but stable. That is, if "equal" elements are ordered a < b in the original sequence, they will have the same order in the result. *** New function: stable-sort! SEQUENCE LESS? Similar to `sort!' but stable. Uses temporary storage when sorting vectors. *** New functions: sort-list, sort-list! Added for compatibility with scsh. ** New built-in random number support *** New function: random N [STATE] Accepts a positive integer or real N and returns a number of the same type between zero (inclusive) and N (exclusive). The values returned have a uniform distribution. The optional argument STATE must be of the type produced by `copy-random-state' or `seed->random-state'. It defaults to the value of the variable `*random-state*'. This object is used to maintain the state of the pseudo-random-number generator and is altered as a side effect of the `random' operation. *** New variable: *random-state* Holds a data structure that encodes the internal state of the random-number generator that `random' uses by default. The nature of this data structure is implementation-dependent. It may be printed out and successfully read back in, but may or may not function correctly as a random-number state object in another implementation. *** New function: copy-random-state [STATE] Returns a new object of type suitable for use as the value of the variable `*random-state*' and as a second argument to `random'. If argument STATE is given, a copy of it is returned. Otherwise a copy of `*random-state*' is returned. *** New function: seed->random-state SEED Returns a new object of type suitable for use as the value of the variable `*random-state*' and as a second argument to `random'. SEED is a string or a number. A new state is generated and initialized using SEED. *** New function: random:uniform [STATE] Returns an uniformly distributed inexact real random number in the range between 0 and 1. *** New procedure: random:solid-sphere! VECT [STATE] Fills VECT with inexact real random numbers the sum of whose squares is less than 1.0. Thinking of VECT as coordinates in space of dimension N = `(vector-length VECT)', the coordinates are uniformly distributed within the unit N-shere. The sum of the squares of the numbers is returned. VECT can be either a vector or a uniform vector of doubles. *** New procedure: random:hollow-sphere! VECT [STATE] Fills VECT with inexact real random numbers the sum of whose squares is equal to 1.0. Thinking of VECT as coordinates in space of dimension n = `(vector-length VECT)', the coordinates are uniformly distributed over the surface of the unit n-shere. VECT can be either a vector or a uniform vector of doubles. *** New function: random:normal [STATE] Returns an inexact real in a normal distribution with mean 0 and standard deviation 1. For a normal distribution with mean M and standard deviation D use `(+ M (* D (random:normal)))'. *** New procedure: random:normal-vector! VECT [STATE] Fills VECT with inexact real random numbers which are independent and standard normally distributed (i.e., with mean 0 and variance 1). VECT can be either a vector or a uniform vector of doubles. *** New function: random:exp STATE Returns an inexact real in an exponential distribution with mean 1. For an exponential distribution with mean U use (* U (random:exp)). ** The range of logand, logior, logxor, logtest, and logbit? have changed. These functions now operate on numbers in the range of a C unsigned long. These functions used to operate on numbers in the range of a C signed long; however, this seems inappropriate, because Guile integers don't overflow. ** New function: make-guardian This is an implementation of guardians as described in R. Kent Dybvig, Carl Bruggeman, and David Eby (1993) "Guardians in a Generation-Based Garbage Collector" ACM SIGPLAN Conference on Programming Language Design and Implementation, June 1993 ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/guardians.ps.gz ** New functions: delq1!, delv1!, delete1! These procedures behave similar to delq! and friends but delete only one object if at all. ** New function: unread-string STRING PORT Unread STRING to PORT, that is, push it back onto the port so that next read operation will work on the pushed back characters. ** unread-char can now be called multiple times If unread-char is called multiple times, the unread characters will be read again in last-in first-out order. ** the procedures uniform-array-read! and uniform-array-write! now work on any kind of port, not just ports which are open on a file. ** Now 'l' in a port mode requests line buffering. ** The procedure truncate-file now works on string ports as well as file ports. If the size argument is omitted, the current file position is used. ** new procedure: seek PORT/FDES OFFSET WHENCE The arguments are the same as for the old fseek procedure, but it works on string ports as well as random-access file ports. ** the fseek procedure now works on string ports, since it has been redefined using seek. ** the setvbuf procedure now uses a default size if mode is _IOFBF and size is not supplied. ** the newline procedure no longer flushes the port if it's not line-buffered: previously it did if it was the current output port. ** open-pipe and close-pipe are no longer primitive procedures, but an emulation can be obtained using `(use-modules (ice-9 popen))'. ** the freopen procedure has been removed. ** new procedure: drain-input PORT Drains PORT's read buffers (including any pushed-back characters) and returns the contents as a single string. ** New function: map-in-order PROC LIST1 LIST2 ... Version of `map' which guarantees that the procedure is applied to the lists in serial order. ** Renamed `serial-array-copy!' and `serial-array-map!' to `array-copy-in-order!' and `array-map-in-order!'. The old names are now obsolete and will go away in release 1.5. ** New syntax: collect BODY1 ... Version of `begin' which returns a list of the results of the body forms instead of the result of the last body form. In contrast to `begin', `collect' allows an empty body. ** New functions: read-history FILENAME, write-history FILENAME Read/write command line history from/to file. Returns #t on success and #f if an error occured. ** `ls' and `lls' in module (ice-9 ls) now handle no arguments. These procedures return a list of definitions available in the specified argument, a relative module reference. In the case of no argument, `(current-module)' is now consulted for definitions to return, instead of simply returning #f, the former behavior. ** The #/ syntax for lists is no longer supported. Earlier versions of Scheme accepted this syntax, but printed a warning. ** Guile no longer consults the SCHEME_LOAD_PATH environment variable. Instead, you should set GUILE_LOAD_PATH to tell Guile where to find modules. * Changes to the gh_ interface ** gh_scm2doubles Now takes a second argument which is the result array. If this pointer is NULL, a new array is malloced (the old behaviour). ** gh_chars2byvect, gh_shorts2svect, gh_floats2fvect, gh_scm2chars, gh_scm2shorts, gh_scm2longs, gh_scm2floats New functions. * Changes to the scm_ interface ** Function: scm_make_named_hook (char* name, int n_args) Creates a hook in the same way as make-hook above but also binds a variable named NAME to it. This is the typical way of creating a hook from C code. Currently, the variable is created in the "current" module. This might change when we get the new module system. ** The smob interface The interface for creating smobs has changed. For documentation, see data-rep.info (made from guile-core/doc/data-rep.texi). *** Deprecated function: SCM scm_newsmob (scm_smobfuns *) >>> This function will be removed in 1.3.4. <<< It is replaced by: *** Function: SCM scm_make_smob_type (const char *name, scm_sizet size) This function adds a new smob type, named NAME, with instance size SIZE to the system. The return value is a tag that is used in creating instances of the type. If SIZE is 0, then no memory will be allocated when instances of the smob are created, and nothing will be freed by the default free function. *** Function: void scm_set_smob_mark (long tc, SCM (*mark) (SCM)) This function sets the smob marking procedure for the smob type specified by the tag TC. TC is the tag returned by `scm_make_smob_type'. *** Function: void scm_set_smob_free (long tc, SCM (*mark) (SCM)) This function sets the smob freeing procedure for the smob type specified by the tag TC. TC is the tag returned by `scm_make_smob_type'. *** Function: void scm_set_smob_print (tc, print) - Function: void scm_set_smob_print (long tc, scm_sizet (*print) (SCM, SCM, scm_print_state *)) This function sets the smob printing procedure for the smob type specified by the tag TC. TC is the tag returned by `scm_make_smob_type'. *** Function: void scm_set_smob_equalp (long tc, SCM (*equalp) (SCM, SCM)) This function sets the smob equality-testing predicate for the smob type specified by the tag TC. TC is the tag returned by `scm_make_smob_type'. *** Macro: void SCM_NEWSMOB (SCM var, long tc, void *data) Make VALUE contain a smob instance of the type with type code TC and smob data DATA. VALUE must be previously declared as C type `SCM'. *** Macro: fn_returns SCM_RETURN_NEWSMOB (long tc, void *data) This macro expands to a block of code that creates a smob instance of the type with type code TC and smob data DATA, and returns that `SCM' value. It should be the last piece of code in a block. ** The interfaces for using I/O ports and implementing port types (ptobs) have changed significantly. The new interface is based on shared access to buffers and a new set of ptob procedures. *** scm_newptob has been removed It is replaced by: *** Function: SCM scm_make_port_type (type_name, fill_buffer, write_flush) - Function: SCM scm_make_port_type (char *type_name, int (*fill_buffer) (SCM port), void (*write_flush) (SCM port)); Similarly to the new smob interface, there is a set of function setters by which the user can customize the behaviour of his port type. See ports.h (scm_set_port_XXX). ** scm_strport_to_string: New function: creates a new string from a string port's buffer. ** Plug in interface for random number generators The variable `scm_the_rng' in random.c contains a value and three function pointers which together define the current random number generator being used by the Scheme level interface and the random number library functions. The user is free to replace the default generator with the generator of his own choice. *** Variable: size_t scm_the_rng.rstate_size The size of the random state type used by the current RNG measured in chars. *** Function: unsigned long scm_the_rng.random_bits (scm_rstate *STATE) Given the random STATE, return 32 random bits. *** Function: void scm_the_rng.init_rstate (scm_rstate *STATE, chars *S, int N) Seed random state STATE using string S of length N. *** Function: scm_rstate *scm_the_rng.copy_rstate (scm_rstate *STATE) Given random state STATE, return a malloced copy. ** Default RNG The default RNG is the MWC (Multiply With Carry) random number generator described by George Marsaglia at the Department of Statistics and Supercomputer Computations Research Institute, The Florida State University (http://stat.fsu.edu/~geo). It uses 64 bits, has a period of 4578426017172946943 (4.6e18), and passes all tests in the DIEHARD test suite (http://stat.fsu.edu/~geo/diehard.html). The generation of 32 bits costs one multiply and one add on platforms which either supports long longs (gcc does this on most systems) or have 64 bit longs. The cost is four multiply on other systems but this can be optimized by writing scm_i_uniform32 in assembler. These functions are provided through the scm_the_rng interface for use by libguile and the application. *** Function: unsigned long scm_i_uniform32 (scm_i_rstate *STATE) Given the random STATE, return 32 random bits. Don't use this function directly. Instead go through the plugin interface (see "Plug in interface" above). *** Function: void scm_i_init_rstate (scm_i_rstate *STATE, char *SEED, int N) Initialize STATE using SEED of length N. *** Function: scm_i_rstate *scm_i_copy_rstate (scm_i_rstate *STATE) Return a malloc:ed copy of STATE. This function can easily be re-used in the interfaces to other RNGs. ** Random number library functions These functions use the current RNG through the scm_the_rng interface. It might be a good idea to use these functions from your C code so that only one random generator is used by all code in your program. The default random state is stored in: *** Variable: SCM scm_var_random_state Contains the vcell of the Scheme variable "*random-state*" which is used as default state by all random number functions in the Scheme level interface. Example: double x = scm_c_uniform01 (SCM_RSTATE (SCM_CDR (scm_var_random_state))); *** Function: scm_rstate *scm_c_default_rstate (void) This is a convenience function which returns the value of scm_var_random_state. An error message is generated if this value isn't a random state. *** Function: scm_rstate *scm_c_make_rstate (char *SEED, int LENGTH) Make a new random state from the string SEED of length LENGTH. It is generally not a good idea to use multiple random states in a program. While subsequent random numbers generated from one random state are guaranteed to be reasonably independent, there is no such guarantee for numbers generated from different random states. *** Macro: unsigned long scm_c_uniform32 (scm_rstate *STATE) Return 32 random bits. *** Function: double scm_c_uniform01 (scm_rstate *STATE) Return a sample from the uniform(0,1) distribution. *** Function: double scm_c_normal01 (scm_rstate *STATE) Return a sample from the normal(0,1) distribution. *** Function: double scm_c_exp1 (scm_rstate *STATE) Return a sample from the exp(1) distribution. *** Function: unsigned long scm_c_random (scm_rstate *STATE, unsigned long M) Return a sample from the discrete uniform(0,M) distribution. *** Function: SCM scm_c_random_bignum (scm_rstate *STATE, SCM M) Return a sample from the discrete uniform(0,M) distribution. M must be a bignum object. The returned value may be an INUM. Changes in Guile 1.3 (released Monday, October 19, 1998): * Changes to the distribution ** We renamed the SCHEME_LOAD_PATH environment variable to GUILE_LOAD_PATH. To avoid conflicts, programs should name environment variables after themselves, except when there's a common practice establishing some other convention. For now, Guile supports both GUILE_LOAD_PATH and SCHEME_LOAD_PATH, giving the former precedence, and printing a warning message if the latter is set. Guile 1.4 will not recognize SCHEME_LOAD_PATH at all. ** The header files related to multi-byte characters have been removed. They were: libguile/extchrs.h and libguile/mbstrings.h. Any C code which referred to these explicitly will probably need to be rewritten, since the support for the variant string types has been removed; see below. ** The header files append.h and sequences.h have been removed. These files implemented non-R4RS operations which would encourage non-portable programming style and less easy-to-read code. * Changes to the stand-alone interpreter ** New procedures have been added to implement a "batch mode": *** Function: batch-mode? Returns a boolean indicating whether the interpreter is in batch mode. *** Function: set-batch-mode?! ARG If ARG is true, switches the interpreter to batch mode. The `#f' case has not been implemented. ** Guile now provides full command-line editing, when run interactively. To use this feature, you must have the readline library installed. The Guile build process will notice it, and automatically include support for it. The readline library is available via anonymous FTP from any GNU mirror site; the canonical location is "ftp://prep.ai.mit.edu/pub/gnu". ** the-last-stack is now a fluid. * Changes to the procedure for linking libguile with your programs ** You can now use the `guile-config' utility to build programs that use Guile. Guile now includes a command-line utility called `guile-config', which can provide information about how to compile and link programs that use Guile. *** `guile-config compile' prints any C compiler flags needed to use Guile. You should include this command's output on the command line you use to compile C or C++ code that #includes the Guile header files. It's usually just a `-I' flag to help the compiler find the Guile headers. *** `guile-config link' prints any linker flags necessary to link with Guile. This command writes to its standard output a list of flags which you must pass to the linker to link your code against the Guile library. The flags include '-lguile' itself, any other libraries the Guile library depends upon, and any `-L' flags needed to help the linker find those libraries. For example, here is a Makefile rule that builds a program named 'foo' from the object files ${FOO_OBJECTS}, and links them against Guile: foo: ${FOO_OBJECTS} ${CC} ${CFLAGS} ${FOO_OBJECTS} `guile-config link` -o foo Previous Guile releases recommended that you use autoconf to detect which of a predefined set of libraries were present on your system. It is more robust to use `guile-config', since it records exactly which libraries the installed Guile library requires. This was originally called `build-guile', but was renamed to `guile-config' before Guile 1.3 was released, to be consistent with the analogous script for the GTK+ GUI toolkit, which is called `gtk-config'. ** Use the GUILE_FLAGS macro in your configure.in file to find Guile. If you are using the GNU autoconf package to configure your program, you can use the GUILE_FLAGS autoconf macro to call `guile-config' (described above) and gather the necessary values for use in your Makefiles. The GUILE_FLAGS macro expands to configure script code which runs the `guile-config' script, to find out where Guile's header files and libraries are installed. It sets two variables, marked for substitution, as by AC_SUBST. GUILE_CFLAGS --- flags to pass to a C or C++ compiler to build code that uses Guile header files. This is almost always just a -I flag. GUILE_LDFLAGS --- flags to pass to the linker to link a program against Guile. This includes `-lguile' for the Guile library itself, any libraries that Guile itself requires (like -lqthreads), and so on. It may also include a -L flag to tell the compiler where to find the libraries. GUILE_FLAGS is defined in the file guile.m4, in the top-level directory of the Guile distribution. You can copy it into your package's aclocal.m4 file, and then use it in your configure.in file. If you are using the `aclocal' program, distributed with GNU automake, to maintain your aclocal.m4 file, the Guile installation process installs guile.m4 where aclocal will find it. All you need to do is use GUILE_FLAGS in your configure.in file, and then run `aclocal'; this will copy the definition of GUILE_FLAGS into your aclocal.m4 file. * Changes to Scheme functions and syntax ** Multi-byte strings have been removed, as have multi-byte and wide ports. We felt that these were the wrong approach to internationalization support. ** New function: readline [PROMPT] Read a line from the terminal, and allow the user to edit it, prompting with PROMPT. READLINE provides a large set of Emacs-like editing commands, lets the user recall previously typed lines, and works on almost every kind of terminal, including dumb terminals. READLINE assumes that the cursor is at the beginning of the line when it is invoked. Thus, you can't print a prompt yourself, and then call READLINE; you need to package up your prompt as a string, pass it to the function, and let READLINE print the prompt itself. This is because READLINE needs to know the prompt's screen width. For Guile to provide this function, you must have the readline library, version 2.1 or later, installed on your system. Readline is available via anonymous FTP from prep.ai.mit.edu in pub/gnu, or from any GNU mirror site. See also ADD-HISTORY function. ** New function: add-history STRING Add STRING as the most recent line in the history used by the READLINE command. READLINE does not add lines to the history itself; you must call ADD-HISTORY to make previous input available to the user. ** The behavior of the read-line function has changed. This function now uses standard C library functions to read the line, for speed. This means that it doesn not respect the value of scm-line-incrementors; it assumes that lines are delimited with #\newline. (Note that this is read-line, the function that reads a line of text from a port, not readline, the function that reads a line from a terminal, providing full editing capabilities.) ** New module (ice-9 getopt-gnu-style): Parse command-line arguments. This module provides some simple argument parsing. It exports one function: Function: getopt-gnu-style ARG-LS Parse a list of program arguments into an alist of option descriptions. Each item in the list of program arguments is examined to see if it meets the syntax of a GNU long-named option. An argument like `--MUMBLE' produces an element of the form (MUMBLE . #t) in the returned alist, where MUMBLE is a keyword object with the same name as the argument. An argument like `--MUMBLE=FROB' produces an element of the form (MUMBLE . FROB), where FROB is a string. As a special case, the returned alist also contains a pair whose car is the symbol `rest'. The cdr of this pair is a list containing all the items in the argument list that are not options of the form mentioned above. The argument `--' is treated specially: all items in the argument list appearing after such an argument are not examined, and are returned in the special `rest' list. This function does not parse normal single-character switches. You will need to parse them out of the `rest' list yourself. ** The read syntax for byte vectors and short vectors has changed. Instead of #bytes(...), write #y(...). Instead of #short(...), write #h(...). This may seem nutty, but, like the other uniform vectors, byte vectors and short vectors want to have the same print and read syntax (and, more basic, want to have read syntax!). Changing the read syntax to use multiple characters after the hash sign breaks with the conventions used in R5RS and the conventions used for the other uniform vectors. It also introduces complexity in the current reader, both on the C and Scheme levels. (The Right solution is probably to change the syntax and prototypes for uniform vectors entirely.) ** The new module (ice-9 session) provides useful interactive functions. *** New procedure: (apropos REGEXP OPTION ...) Display a list of top-level variables whose names match REGEXP, and the modules they are imported from. Each OPTION should be one of the following symbols: value --- Show the value of each matching variable. shadow --- Show bindings shadowed by subsequently imported modules. full --- Same as both `shadow' and `value'. For example: guile> (apropos "trace" 'full) debug: trace # debug: untrace # the-scm-module: display-backtrace #> the-scm-module: before-backtrace-hook () the-scm-module: backtrace # the-scm-module: after-backtrace-hook () the-scm-module: has-shown-backtrace-hint? #f guile> ** There are new functions and syntax for working with macros. Guile implements macros as a special object type. Any variable whose top-level binding is a macro object acts as a macro. The macro object specifies how the expression should be transformed before evaluation. *** Macro objects now print in a reasonable way, resembling procedures. *** New function: (macro? OBJ) True iff OBJ is a macro object. *** New function: (primitive-macro? OBJ) Like (macro? OBJ), but true only if OBJ is one of the Guile primitive macro transformers, implemented in eval.c rather than Scheme code. Why do we have this function? - For symmetry with procedure? and primitive-procedure?, - to allow custom print procedures to tell whether a macro is primitive, and display it differently, and - to allow compilers and user-written evaluators to distinguish builtin special forms from user-defined ones, which could be compiled. *** New function: (macro-type OBJ) Return a value indicating what kind of macro OBJ is. Possible return values are: The symbol `syntax' --- a macro created by procedure->syntax. The symbol `macro' --- a macro created by procedure->macro. The symbol `macro!' --- a macro created by procedure->memoizing-macro. The boolean #f --- if OBJ is not a macro object. *** New function: (macro-name MACRO) Return the name of the macro object MACRO's procedure, as returned by procedure-name. *** New function: (macro-transformer MACRO) Return the transformer procedure for MACRO. *** New syntax: (use-syntax MODULE ... TRANSFORMER) Specify a new macro expander to use in the current module. Each MODULE is a module name, with the same meaning as in the `use-modules' form; each named module's exported bindings are added to the current top-level environment. TRANSFORMER is an expression evaluated in the resulting environment which must yield a procedure to use as the module's eval transformer: every expression evaluated in this module is passed to this function, and the result passed to the Guile interpreter. *** macro-eval! is removed. Use local-eval instead. ** Some magic has been added to the printer to better handle user written printing routines (like record printers, closure printers). The problem is that these user written routines must have access to the current `print-state' to be able to handle fancy things like detection of circular references. These print-states have to be passed to the builtin printing routines (display, write, etc) to properly continue the print chain. We didn't want to change all existing print code so that it explicitly passes thru a print state in addition to a port. Instead, we extented the possible values that the builtin printing routines accept as a `port'. In addition to a normal port, they now also take a pair of a normal port and a print-state. Printing will go to the port and the print-state will be used to control the detection of circular references, etc. If the builtin function does not care for a print-state, it is simply ignored. User written callbacks are now called with such a pair as their `port', but because every function now accepts this pair as a PORT argument, you don't have to worry about that. In fact, it is probably safest to not check for these pairs. However, it is sometimes necessary to continue a print chain on a different port, for example to get a intermediate string representation of the printed value, mangle that string somehow, and then to finally print the mangled string. Use the new function inherit-print-state OLD-PORT NEW-PORT for this. It constructs a new `port' that prints to NEW-PORT but inherits the print-state of OLD-PORT. ** struct-vtable-offset renamed to vtable-offset-user ** New constants: vtable-index-layout, vtable-index-vtable, vtable-index-printer ** There is now a third optional argument to make-vtable-vtable (and fourth to make-struct) when constructing new types (vtables). This argument initializes field vtable-index-printer of the vtable. ** The detection of circular references has been extended to structs. That is, a structure that -- in the process of being printed -- prints itself does not lead to infinite recursion. ** There is now some basic support for fluids. Please read "libguile/fluid.h" to find out more. It is accessible from Scheme with the following functions and macros: Function: make-fluid Create a new fluid object. Fluids are not special variables or some other extension to the semantics of Scheme, but rather ordinary Scheme objects. You can store them into variables (that are still lexically scoped, of course) or into any other place you like. Every fluid has a initial value of `#f'. Function: fluid? OBJ Test whether OBJ is a fluid. Function: fluid-ref FLUID Function: fluid-set! FLUID VAL Access/modify the fluid FLUID. Modifications are only visible within the current dynamic root (that includes threads). Function: with-fluids* FLUIDS VALUES THUNK FLUIDS is a list of fluids and VALUES a corresponding list of values for these fluids. Before THUNK gets called the values are installed in the fluids and the old values of the fluids are saved in the VALUES list. When the flow of control leaves THUNK or reenters it, the values get swapped again. You might think of this as a `safe-fluid-excursion'. Note that the VALUES list is modified by `with-fluids*'. Macro: with-fluids ((FLUID VALUE) ...) FORM ... The same as `with-fluids*' but with a different syntax. It looks just like `let', but both FLUID and VALUE are evaluated. Remember, fluids are not special variables but ordinary objects. FLUID should evaluate to a fluid. ** Changes to system call interfaces: *** close-port, close-input-port and close-output-port now return a boolean instead of an `unspecified' object. #t means that the port was successfully closed, while #f means it was already closed. It is also now possible for these procedures to raise an exception if an error occurs (some errors from write can be delayed until close.) *** the first argument to chmod, fcntl, ftell and fseek can now be a file descriptor. *** the third argument to fcntl is now optional. *** the first argument to chown can now be a file descriptor or a port. *** the argument to stat can now be a port. *** The following new procedures have been added (most use scsh interfaces): *** procedure: close PORT/FD Similar to close-port (*note close-port: Closing Ports.), but also works on file descriptors. A side effect of closing a file descriptor is that any ports using that file descriptor are moved to a different file descriptor and have their revealed counts set to zero. *** procedure: port->fdes PORT Returns the integer file descriptor underlying PORT. As a side effect the revealed count of PORT is incremented. *** procedure: fdes->ports FDES Returns a list of existing ports which have FDES as an underlying file descriptor, without changing their revealed counts. *** procedure: fdes->inport FDES Returns an existing input port which has FDES as its underlying file descriptor, if one exists, and increments its revealed count. Otherwise, returns a new input port with a revealed count of 1. *** procedure: fdes->outport FDES Returns an existing output port which has FDES as its underlying file descriptor, if one exists, and increments its revealed count. Otherwise, returns a new output port with a revealed count of 1. The next group of procedures perform a `dup2' system call, if NEWFD (an integer) is supplied, otherwise a `dup'. The file descriptor to be duplicated can be supplied as an integer or contained in a port. The type of value returned varies depending on which procedure is used. All procedures also have the side effect when performing `dup2' that any ports using NEWFD are moved to a different file descriptor and have their revealed counts set to zero. *** procedure: dup->fdes PORT/FD [NEWFD] Returns an integer file descriptor. *** procedure: dup->inport PORT/FD [NEWFD] Returns a new input port using the new file descriptor. *** procedure: dup->outport PORT/FD [NEWFD] Returns a new output port using the new file descriptor. *** procedure: dup PORT/FD [NEWFD] Returns a new port if PORT/FD is a port, with the same mode as the supplied port, otherwise returns an integer file descriptor. *** procedure: dup->port PORT/FD MODE [NEWFD] Returns a new port using the new file descriptor. MODE supplies a mode string for the port (*note open-file: File Ports.). *** procedure: setenv NAME VALUE Modifies the environment of the current process, which is also the default environment inherited by child processes. If VALUE is `#f', then NAME is removed from the environment. Otherwise, the string NAME=VALUE is added to the environment, replacing any existing string with name matching NAME. The return value is unspecified. *** procedure: truncate-file OBJ SIZE Truncates the file referred to by OBJ to at most SIZE bytes. OBJ can be a string containing a file name or an integer file descriptor or port open for output on the file. The underlying system calls are `truncate' and `ftruncate'. The return value is unspecified. *** procedure: setvbuf PORT MODE [SIZE] Set the buffering mode for PORT. MODE can be: `_IONBF' non-buffered `_IOLBF' line buffered `_IOFBF' block buffered, using a newly allocated buffer of SIZE bytes. However if SIZE is zero or unspecified, the port will be made non-buffered. This procedure should not be used after I/O has been performed with the port. Ports are usually block buffered by default, with a default buffer size. Procedures e.g., *Note open-file: File Ports, which accept a mode string allow `0' to be added to request an unbuffered port. *** procedure: fsync PORT/FD Copies any unwritten data for the specified output file descriptor to disk. If PORT/FD is a port, its buffer is flushed before the underlying file descriptor is fsync'd. The return value is unspecified. *** procedure: open-fdes PATH FLAGS [MODES] Similar to `open' but returns a file descriptor instead of a port. *** procedure: execle PATH ENV [ARG] ... Similar to `execl', but the environment of the new process is specified by ENV, which must be a list of strings as returned by the `environ' procedure. This procedure is currently implemented using the `execve' system call, but we call it `execle' because of its Scheme calling interface. *** procedure: strerror ERRNO Returns the Unix error message corresponding to ERRNO, an integer. *** procedure: primitive-exit [STATUS] Terminate the current process without unwinding the Scheme stack. This is would typically be useful after a fork. The exit status is STATUS if supplied, otherwise zero. *** procedure: times Returns an object with information about real and processor time. The following procedures accept such an object as an argument and return a selected component: `tms:clock' The current real time, expressed as time units relative to an arbitrary base. `tms:utime' The CPU time units used by the calling process. `tms:stime' The CPU time units used by the system on behalf of the calling process. `tms:cutime' The CPU time units used by terminated child processes of the calling process, whose status has been collected (e.g., using `waitpid'). `tms:cstime' Similarly, the CPU times units used by the system on behalf of terminated child processes. ** Removed: list-length ** Removed: list-append, list-append! ** Removed: list-reverse, list-reverse! ** array-map renamed to array-map! ** serial-array-map renamed to serial-array-map! ** catch doesn't take #f as first argument any longer Previously, it was possible to pass #f instead of a key to `catch'. That would cause `catch' to pass a jump buffer object to the procedure passed as second argument. The procedure could then use this jump buffer objekt as an argument to throw. This mechanism has been removed since its utility doesn't motivate the extra complexity it introduces. ** The `#/' notation for lists now provokes a warning message from Guile. This syntax will be removed from Guile in the near future. To disable the warning message, set the GUILE_HUSH environment variable to any non-empty value. ** The newline character now prints as `#\newline', following the normal Scheme notation, not `#\nl'. * Changes to the gh_ interface ** The gh_enter function now takes care of loading the Guile startup files. gh_enter works by calling scm_boot_guile; see the remarks below. ** Function: void gh_write (SCM x) Write the printed representation of the scheme object x to the current output port. Corresponds to the scheme level `write'. ** gh_list_length renamed to gh_length. ** vector handling routines Several major changes. In particular, gh_vector() now resembles (vector ...) (with a caveat -- see manual), and gh_make_vector() now exists and behaves like (make-vector ...). gh_vset() and gh_vref() have been renamed gh_vector_set_x() and gh_vector_ref(). Some missing vector-related gh_ functions have been implemented. ** pair and list routines Implemented several of the R4RS pair and list functions that were missing. ** gh_scm2doubles, gh_doubles2scm, gh_doubles2dvect New function. Converts double arrays back and forth between Scheme and C. * Changes to the scm_ interface ** The function scm_boot_guile now takes care of loading the startup files. Guile's primary initialization function, scm_boot_guile, now takes care of loading `boot-9.scm', in the `ice-9' module, to initialize Guile, define the module system, and put together some standard bindings. It also loads `init.scm', which is intended to hold site-specific initialization code. Since Guile cannot operate properly until boot-9.scm is loaded, there is no reason to separate loading boot-9.scm from Guile's other initialization processes. This job used to be done by scm_compile_shell_switches, which didn't make much sense; in particular, it meant that people using Guile for non-shell-like applications had to jump through hoops to get Guile initialized properly. ** The function scm_compile_shell_switches no longer loads the startup files. Now, Guile always loads the startup files, whenever it is initialized; see the notes above for scm_boot_guile and scm_load_startup_files. ** Function: scm_load_startup_files This new function takes care of loading Guile's initialization file (`boot-9.scm'), and the site initialization file, `init.scm'. Since this is always called by the Guile initialization process, it's probably not too useful to call this yourself, but it's there anyway. ** The semantics of smob marking have changed slightly. The smob marking function (the `mark' member of the scm_smobfuns structure) is no longer responsible for setting the mark bit on the smob. The generic smob handling code in the garbage collector will set this bit. The mark function need only ensure that any other objects the smob refers to get marked. Note that this change means that the smob's GC8MARK bit is typically already set upon entry to the mark function. Thus, marking functions which look like this: { if (SCM_GC8MARKP (ptr)) return SCM_BOOL_F; SCM_SETGC8MARK (ptr); ... mark objects to which the smob refers ... } are now incorrect, since they will return early, and fail to mark any other objects the smob refers to. Some code in the Guile library used to work this way. ** The semantics of the I/O port functions in scm_ptobfuns have changed. If you have implemented your own I/O port type, by writing the functions required by the scm_ptobfuns and then calling scm_newptob, you will need to change your functions slightly. The functions in a scm_ptobfuns structure now expect the port itself as their argument; they used to expect the `stream' member of the port's scm_port_table structure. This allows functions in an scm_ptobfuns structure to easily access the port's cell (and any flags it its CAR), and the port's scm_port_table structure. Guile now passes the I/O port itself as the `port' argument in the following scm_ptobfuns functions: int (*free) (SCM port); int (*fputc) (int, SCM port); int (*fputs) (char *, SCM port); scm_sizet (*fwrite) SCM_P ((char *ptr, scm_sizet size, scm_sizet nitems, SCM port)); int (*fflush) (SCM port); int (*fgetc) (SCM port); int (*fclose) (SCM port); The interfaces to the `mark', `print', `equalp', and `fgets' methods are unchanged. If you have existing code which defines its own port types, it is easy to convert your code to the new interface; simply apply SCM_STREAM to the port argument to yield the value you code used to expect. Note that since both the port and the stream have the same type in the C code --- they are both SCM values --- the C compiler will not remind you if you forget to update your scm_ptobfuns functions. ** Function: int scm_internal_select (int fds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, struct timeval *timeout); This is a replacement for the `select' function provided by the OS. It enables I/O blocking and sleeping to happen for one cooperative thread without blocking other threads. It also avoids busy-loops in these situations. It is intended that all I/O blocking and sleeping will finally go through this function. Currently, this function is only available on systems providing `gettimeofday' and `select'. ** Function: SCM scm_internal_stack_catch (SCM tag, scm_catch_body_t body, void *body_data, scm_catch_handler_t handler, void *handler_data) A new sibling to the other two C level `catch' functions scm_internal_catch and scm_internal_lazy_catch. Use it if you want the stack to be saved automatically into the variable `the-last-stack' (scm_the_last_stack_var) on error. This is necessary if you want to use advanced error reporting, such as calling scm_display_error and scm_display_backtrace. (They both take a stack object as argument.) ** Function: SCM scm_spawn_thread (scm_catch_body_t body, void *body_data, scm_catch_handler_t handler, void *handler_data) Spawns a new thread. It does a job similar to scm_call_with_new_thread but takes arguments more suitable when spawning threads from application C code. ** The hook scm_error_callback has been removed. It was originally intended as a way for the user to install his own error handler. But that method works badly since it intervenes between throw and catch, thereby changing the semantics of expressions like (catch #t ...). The correct way to do it is to use one of the C level catch functions in throw.c: scm_internal_catch/lazy_catch/stack_catch. ** Removed functions: scm_obj_length, scm_list_length, scm_list_append, scm_list_append_x, scm_list_reverse, scm_list_reverse_x ** New macros: SCM_LISTn where n is one of the integers 0-9. These can be used for pretty list creation from C. The idea is taken from Erick Gallesio's STk. ** scm_array_map renamed to scm_array_map_x ** mbstrings are now removed This means that the type codes scm_tc7_mb_string and scm_tc7_mb_substring has been removed. ** scm_gen_putc, scm_gen_puts, scm_gen_write, and scm_gen_getc have changed. Since we no longer support multi-byte strings, these I/O functions have been simplified, and renamed. Here are their old names, and their new names and arguments: scm_gen_putc -> void scm_putc (int c, SCM port); scm_gen_puts -> void scm_puts (char *s, SCM port); scm_gen_write -> void scm_lfwrite (char *ptr, scm_sizet size, SCM port); scm_gen_getc -> void scm_getc (SCM port); ** The macros SCM_TYP7D and SCM_TYP7SD has been removed. ** The macro SCM_TYP7S has taken the role of the old SCM_TYP7D SCM_TYP7S now masks away the bit which distinguishes substrings from strings. ** scm_catch_body_t: Backward incompatible change! Body functions to scm_internal_catch and friends do not any longer take a second argument. This is because it is no longer possible to pass a #f arg to catch. ** Calls to scm_protect_object and scm_unprotect now nest properly. The function scm_protect_object protects its argument from being freed by the garbage collector. scm_unprotect_object removes that protection. These functions now nest properly. That is, for every object O, there is a counter which scm_protect_object(O) increments and scm_unprotect_object(O) decrements, if the counter is greater than zero. Every object's counter is zero when it is first created. If an object's counter is greater than zero, the garbage collector will not reclaim its storage. This allows you to use scm_protect_object in your code without worrying that some other function you call will call scm_unprotect_object, and allow it to be freed. Assuming that the functions you call are well-behaved, and unprotect only those objects they protect, you can follow the same rule and have confidence that objects will be freed only at appropriate times. Changes in Guile 1.2 (released Tuesday, June 24 1997): * Changes to the distribution ** Nightly snapshots are now available from ftp.red-bean.com. The old server, ftp.cyclic.com, has been relinquished to its rightful owner. Nightly snapshots of the Guile development sources are now available via anonymous FTP from ftp.red-bean.com, as /pub/guile/guile-snap.tar.gz. Via the web, that's: ftp://ftp.red-bean.com/pub/guile/guile-snap.tar.gz For getit, that's: ftp.red-bean.com:/pub/guile/guile-snap.tar.gz ** To run Guile without installing it, the procedure has changed a bit. If you used a separate build directory to compile Guile, you'll need to include the build directory in SCHEME_LOAD_PATH, as well as the source directory. See the `INSTALL' file for examples. * Changes to the procedure for linking libguile with your programs ** The standard Guile load path for Scheme code now includes $(datadir)/guile (usually /usr/local/share/guile). This means that you can install your own Scheme files there, and Guile will find them. (Previous versions of Guile only checked a directory whose name contained the Guile version number, so you had to re-install or move your Scheme sources each time you installed a fresh version of Guile.) The load path also includes $(datadir)/guile/site; we recommend putting individual Scheme files there. If you want to install a package with multiple source files, create a directory for them under $(datadir)/guile. ** Guile 1.2 will now use the Rx regular expression library, if it is installed on your system. When you are linking libguile into your own programs, this means you will have to link against -lguile, -lqt (if you configured Guile with thread support), and -lrx. If you are using autoconf to generate configuration scripts for your application, the following lines should suffice to add the appropriate libraries to your link command: ### Find Rx, quickthreads and libguile. AC_CHECK_LIB(rx, main) AC_CHECK_LIB(qt, main) AC_CHECK_LIB(guile, scm_shell) The Guile 1.2 distribution does not contain sources for the Rx library, as Guile 1.0 did. If you want to use Rx, you'll need to retrieve it from a GNU FTP site and install it separately. * Changes to Scheme functions and syntax ** The dynamic linking features of Guile are now enabled by default. You can disable them by giving the `--disable-dynamic-linking' option to configure. (dynamic-link FILENAME) Find the object file denoted by FILENAME (a string) and link it into the running Guile application. When everything works out, return a Scheme object suitable for representing the linked object file. Otherwise an error is thrown. How object files are searched is system dependent. (dynamic-object? VAL) Determine whether VAL represents a dynamically linked object file. (dynamic-unlink DYNOBJ) Unlink the indicated object file from the application. DYNOBJ should be one of the values returned by `dynamic-link'. (dynamic-func FUNCTION DYNOBJ) Search the C function indicated by FUNCTION (a string or symbol) in DYNOBJ and return some Scheme object that can later be used with `dynamic-call' to actually call this function. Right now, these Scheme objects are formed by casting the address of the function to `long' and converting this number to its Scheme representation. (dynamic-call FUNCTION DYNOBJ) Call the C function indicated by FUNCTION and DYNOBJ. The function is passed no arguments and its return value is ignored. When FUNCTION is something returned by `dynamic-func', call that function and ignore DYNOBJ. When FUNCTION is a string (or symbol, etc.), look it up in DYNOBJ; this is equivalent to (dynamic-call (dynamic-func FUNCTION DYNOBJ) #f) Interrupts are deferred while the C function is executing (with SCM_DEFER_INTS/SCM_ALLOW_INTS). (dynamic-args-call FUNCTION DYNOBJ ARGS) Call the C function indicated by FUNCTION and DYNOBJ, but pass it some arguments and return its return value. The C function is expected to take two arguments and return an `int', just like `main': int c_func (int argc, char **argv); ARGS must be a list of strings and is converted into an array of `char *'. The array is passed in ARGV and its size in ARGC. The return value is converted to a Scheme number and returned from the call to `dynamic-args-call'. When dynamic linking is disabled or not supported on your system, the above functions throw errors, but they are still available. Here is a small example that works on GNU/Linux: (define libc-obj (dynamic-link "libc.so")) (dynamic-args-call 'rand libc-obj '()) See the file `libguile/DYNAMIC-LINKING' for additional comments. ** The #/ syntax for module names is depreciated, and will be removed in a future version of Guile. Instead of #/foo/bar/baz instead write (foo bar baz) The latter syntax is more consistent with existing Lisp practice. ** Guile now does fancier printing of structures. Structures are the underlying implementation for records, which in turn are used to implement modules, so all of these object now print differently and in a more informative way. The Scheme printer will examine the builtin variable *struct-printer* whenever it needs to print a structure object. When this variable is not `#f' it is deemed to be a procedure and will be applied to the structure object and the output port. When *struct-printer* is `#f' or the procedure return `#f' the structure object will be printed in the boring # form. This hook is used by some routines in ice-9/boot-9.scm to implement type specific printing routines. Please read the comments there about "printing structs". One of the more specific uses of structs are records. The printing procedure that could be passed to MAKE-RECORD-TYPE is now actually called. It should behave like a *struct-printer* procedure (described above). ** Guile now supports a new R4RS-compliant syntax for keywords. A token of the form #:NAME, where NAME has the same syntax as a Scheme symbol, is the external representation of the keyword named NAME. Keyword objects print using this syntax as well, so values containing keyword objects can be read back into Guile. When used in an expression, keywords are self-quoting objects. Guile suports this read syntax, and uses this print syntax, regardless of the current setting of the `keyword' read option. The `keyword' read option only controls whether Guile recognizes the `:NAME' syntax, which is incompatible with R4RS. (R4RS says such token represent symbols.) ** Guile has regular expression support again. Guile 1.0 included functions for matching regular expressions, based on the Rx library. In Guile 1.1, the Guile/Rx interface was removed to simplify the distribution, and thus Guile had no regular expression support. Guile 1.2 again supports the most commonly used functions, and supports all of SCSH's regular expression functions. If your system does not include a POSIX regular expression library, and you have not linked Guile with a third-party regexp library such as Rx, these functions will not be available. You can tell whether your Guile installation includes regular expression support by checking whether the `*features*' list includes the `regex' symbol. *** regexp functions By default, Guile supports POSIX extended regular expressions. That means that the characters `(', `)', `+' and `?' are special, and must be escaped if you wish to match the literal characters. This regular expression interface was modeled after that implemented by SCSH, the Scheme Shell. It is intended to be upwardly compatible with SCSH regular expressions. **** Function: string-match PATTERN STR [START] Compile the string PATTERN into a regular expression and compare it with STR. The optional numeric argument START specifies the position of STR at which to begin matching. `string-match' returns a "match structure" which describes what, if anything, was matched by the regular expression. *Note Match Structures::. If STR does not match PATTERN at all, `string-match' returns `#f'. Each time `string-match' is called, it must compile its PATTERN argument into a regular expression structure. This operation is expensive, which makes `string-match' inefficient if the same regular expression is used several times (for example, in a loop). For better performance, you can compile a regular expression in advance and then match strings against the compiled regexp. **** Function: make-regexp STR [FLAGS] Compile the regular expression described by STR, and return the compiled regexp structure. If STR does not describe a legal regular expression, `make-regexp' throws a `regular-expression-syntax' error. FLAGS may be the bitwise-or of one or more of the following: **** Constant: regexp/extended Use POSIX Extended Regular Expression syntax when interpreting STR. If not set, POSIX Basic Regular Expression syntax is used. If the FLAGS argument is omitted, we assume regexp/extended. **** Constant: regexp/icase Do not differentiate case. Subsequent searches using the returned regular expression will be case insensitive. **** Constant: regexp/newline Match-any-character operators don't match a newline. A non-matching list ([^...]) not containing a newline matches a newline. Match-beginning-of-line operator (^) matches the empty string immediately after a newline, regardless of whether the FLAGS passed to regexp-exec contain regexp/notbol. Match-end-of-line operator ($) matches the empty string immediately before a newline, regardless of whether the FLAGS passed to regexp-exec contain regexp/noteol. **** Function: regexp-exec REGEXP STR [START [FLAGS]] Match the compiled regular expression REGEXP against `str'. If the optional integer START argument is provided, begin matching from that position in the string. Return a match structure describing the results of the match, or `#f' if no match could be found. FLAGS may be the bitwise-or of one or more of the following: **** Constant: regexp/notbol The match-beginning-of-line operator always fails to match (but see the compilation flag regexp/newline above) This flag may be used when different portions of a string are passed to regexp-exec and the beginning of the string should not be interpreted as the beginning of the line. **** Constant: regexp/noteol The match-end-of-line operator always fails to match (but see the compilation flag regexp/newline above) **** Function: regexp? OBJ Return `#t' if OBJ is a compiled regular expression, or `#f' otherwise. Regular expressions are commonly used to find patterns in one string and replace them with the contents of another string. **** Function: regexp-substitute PORT MATCH [ITEM...] Write to the output port PORT selected contents of the match structure MATCH. Each ITEM specifies what should be written, and may be one of the following arguments: * A string. String arguments are written out verbatim. * An integer. The submatch with that number is written. * The symbol `pre'. The portion of the matched string preceding the regexp match is written. * The symbol `post'. The portion of the matched string following the regexp match is written. PORT may be `#f', in which case nothing is written; instead, `regexp-substitute' constructs a string from the specified ITEMs and returns that. **** Function: regexp-substitute/global PORT REGEXP TARGET [ITEM...] Similar to `regexp-substitute', but can be used to perform global substitutions on STR. Instead of taking a match structure as an argument, `regexp-substitute/global' takes two string arguments: a REGEXP string describing a regular expression, and a TARGET string which should be matched against this regular expression. Each ITEM behaves as in REGEXP-SUBSTITUTE, with the following exceptions: * A function may be supplied. When this function is called, it will be passed one argument: a match structure for a given regular expression match. It should return a string to be written out to PORT. * The `post' symbol causes `regexp-substitute/global' to recurse on the unmatched portion of STR. This *must* be supplied in order to perform global search-and-replace on STR; if it is not present among the ITEMs, then `regexp-substitute/global' will return after processing a single match. *** Match Structures A "match structure" is the object returned by `string-match' and `regexp-exec'. It describes which portion of a string, if any, matched the given regular expression. Match structures include: a reference to the string that was checked for matches; the starting and ending positions of the regexp match; and, if the regexp included any parenthesized subexpressions, the starting and ending positions of each submatch. In each of the regexp match functions described below, the `match' argument must be a match structure returned by a previous call to `string-match' or `regexp-exec'. Most of these functions return some information about the original target string that was matched against a regular expression; we will call that string TARGET for easy reference. **** Function: regexp-match? OBJ Return `#t' if OBJ is a match structure returned by a previous call to `regexp-exec', or `#f' otherwise. **** Function: match:substring MATCH [N] Return the portion of TARGET matched by subexpression number N. Submatch 0 (the default) represents the entire regexp match. If the regular expression as a whole matched, but the subexpression number N did not match, return `#f'. **** Function: match:start MATCH [N] Return the starting position of submatch number N. **** Function: match:end MATCH [N] Return the ending position of submatch number N. **** Function: match:prefix MATCH Return the unmatched portion of TARGET preceding the regexp match. **** Function: match:suffix MATCH Return the unmatched portion of TARGET following the regexp match. **** Function: match:count MATCH Return the number of parenthesized subexpressions from MATCH. Note that the entire regular expression match itself counts as a subexpression, and failed submatches are included in the count. **** Function: match:string MATCH Return the original TARGET string. *** Backslash Escapes Sometimes you will want a regexp to match characters like `*' or `$' exactly. For example, to check whether a particular string represents a menu entry from an Info node, it would be useful to match it against a regexp like `^* [^:]*::'. However, this won't work; because the asterisk is a metacharacter, it won't match the `*' at the beginning of the string. In this case, we want to make the first asterisk un-magic. You can do this by preceding the metacharacter with a backslash character `\'. (This is also called "quoting" the metacharacter, and is known as a "backslash escape".) When Guile sees a backslash in a regular expression, it considers the following glyph to be an ordinary character, no matter what special meaning it would ordinarily have. Therefore, we can make the above example work by changing the regexp to `^\* [^:]*::'. The `\*' sequence tells the regular expression engine to match only a single asterisk in the target string. Since the backslash is itself a metacharacter, you may force a regexp to match a backslash in the target string by preceding the backslash with itself. For example, to find variable references in a TeX program, you might want to find occurrences of the string `\let\' followed by any number of alphabetic characters. The regular expression `\\let\\[A-Za-z]*' would do this: the double backslashes in the regexp each match a single backslash in the target string. **** Function: regexp-quote STR Quote each special character found in STR with a backslash, and return the resulting string. *Very important:* Using backslash escapes in Guile source code (as in Emacs Lisp or C) can be tricky, because the backslash character has special meaning for the Guile reader. For example, if Guile encounters the character sequence `\n' in the middle of a string while processing Scheme code, it replaces those characters with a newline character. Similarly, the character sequence `\t' is replaced by a horizontal tab. Several of these "escape sequences" are processed by the Guile reader before your code is executed. Unrecognized escape sequences are ignored: if the characters `\*' appear in a string, they will be translated to the single character `*'. This translation is obviously undesirable for regular expressions, since we want to be able to include backslashes in a string in order to escape regexp metacharacters. Therefore, to make sure that a backslash is preserved in a string in your Guile program, you must use *two* consecutive backslashes: (define Info-menu-entry-pattern (make-regexp "^\\* [^:]*")) The string in this example is preprocessed by the Guile reader before any code is executed. The resulting argument to `make-regexp' is the string `^\* [^:]*', which is what we really want. This also means that in order to write a regular expression that matches a single backslash character, the regular expression string in the source code must include *four* backslashes. Each consecutive pair of backslashes gets translated by the Guile reader to a single backslash, and the resulting double-backslash is interpreted by the regexp engine as matching a single backslash character. Hence: (define tex-variable-pattern (make-regexp "\\\\let\\\\=[A-Za-z]*")) The reason for the unwieldiness of this syntax is historical. Both regular expression pattern matchers and Unix string processing systems have traditionally used backslashes with the special meanings described above. The POSIX regular expression specification and ANSI C standard both require these semantics. Attempting to abandon either convention would cause other kinds of compatibility problems, possibly more severe ones. Therefore, without extending the Scheme reader to support strings with different quoting conventions (an ungainly and confusing extension when implemented in other languages), we must adhere to this cumbersome escape syntax. * Changes to the gh_ interface * Changes to the scm_ interface * Changes to system call interfaces: ** The value returned by `raise' is now unspecified. It throws an exception if an error occurs. *** A new procedure `sigaction' can be used to install signal handlers (sigaction signum [action] [flags]) signum is the signal number, which can be specified using the value of SIGINT etc. If action is omitted, sigaction returns a pair: the CAR is the current signal hander, which will be either an integer with the value SIG_DFL (default action) or SIG_IGN (ignore), or the Scheme procedure which handles the signal, or #f if a non-Scheme procedure handles the signal. The CDR contains the current sigaction flags for the handler. If action is provided, it is installed as the new handler for signum. action can be a Scheme procedure taking one argument, or the value of SIG_DFL (default action) or SIG_IGN (ignore), or #f to restore whatever signal handler was installed before sigaction was first used. Flags can optionally be specified for the new handler (SA_RESTART is always used if the system provides it, so need not be specified.) The return value is a pair with information about the old handler as described above. This interface does not provide access to the "signal blocking" facility. Maybe this is not needed, since the thread support may provide solutions to the problem of consistent access to data structures. *** A new procedure `flush-all-ports' is equivalent to running `force-output' on every port open for output. ** Guile now provides information on how it was built, via the new global variable, %guile-build-info. This variable records the values of the standard GNU makefile directory variables as an assocation list, mapping variable names (symbols) onto directory paths (strings). For example, to find out where the Guile link libraries were installed, you can say: guile -c "(display (assq-ref %guile-build-info 'libdir)) (newline)" * Changes to the scm_ interface ** The new function scm_handle_by_message_noexit is just like the existing scm_handle_by_message function, except that it doesn't call exit to terminate the process. Instead, it prints a message and just returns #f. This might be a more appropriate catch-all handler for new dynamic roots and threads. Changes in Guile 1.1 (released Friday, May 16 1997): * Changes to the distribution. The Guile 1.0 distribution has been split up into several smaller pieces: guile-core --- the Guile interpreter itself. guile-tcltk --- the interface between the Guile interpreter and Tcl/Tk; Tcl is an interpreter for a stringy language, and Tk is a toolkit for building graphical user interfaces. guile-rgx-ctax --- the interface between Guile and the Rx regular expression matcher, and the translator for the Ctax programming language. These are packaged together because the Ctax translator uses Rx to parse Ctax source code. This NEWS file describes the changes made to guile-core since the 1.0 release. We no longer distribute the documentation, since it was either out of date, or incomplete. As soon as we have current documentation, we will distribute it. * Changes to the stand-alone interpreter ** guile now accepts command-line arguments compatible with SCSH, Olin Shivers' Scheme Shell. In general, arguments are evaluated from left to right, but there are exceptions. The following switches stop argument processing, and stash all remaining command-line arguments as the value returned by the (command-line) function. -s SCRIPT load Scheme source code from FILE, and exit -c EXPR evalute Scheme expression EXPR, and exit -- stop scanning arguments; run interactively The switches below are processed as they are encountered. -l FILE load Scheme source code from FILE -e FUNCTION after reading script, apply FUNCTION to command line arguments -ds do -s script at this point --emacs enable Emacs protocol (experimental) -h, --help display this help and exit -v, --version display version information and exit \ read arguments from following script lines So, for example, here is a Guile script named `ekko' (thanks, Olin) which re-implements the traditional "echo" command: #!/usr/local/bin/guile -s !# (define (main args) (map (lambda (arg) (display arg) (display " ")) (cdr args)) (newline)) (main (command-line)) Suppose we invoke this script as follows: ekko a speckled gecko Through the magic of Unix script processing (triggered by the `#!' token at the top of the file), /usr/local/bin/guile receives the following list of command-line arguments: ("-s" "./ekko" "a" "speckled" "gecko") Unix inserts the name of the script after the argument specified on the first line of the file (in this case, "-s"), and then follows that with the arguments given to the script. Guile loads the script, which defines the `main' function, and then applies it to the list of remaining command-line arguments, ("a" "speckled" "gecko"). In Unix, the first line of a script file must take the following form: #!INTERPRETER ARGUMENT where INTERPRETER is the absolute filename of the interpreter executable, and ARGUMENT is a single command-line argument to pass to the interpreter. You may only pass one argument to the interpreter, and its length is limited. These restrictions can be annoying to work around, so Guile provides a general mechanism (borrowed from, and compatible with, SCSH) for circumventing them. If the ARGUMENT in a Guile script is a single backslash character, `\', Guile will open the script file, parse arguments from its second and subsequent lines, and replace the `\' with them. So, for example, here is another implementation of the `ekko' script: #!/usr/local/bin/guile \ -e main -s !# (define (main args) (for-each (lambda (arg) (display arg) (display " ")) (cdr args)) (newline)) If the user invokes this script as follows: ekko a speckled gecko Unix expands this into /usr/local/bin/guile \ ekko a speckled gecko When Guile sees the `\' argument, it replaces it with the arguments read from the second line of the script, producing: /usr/local/bin/guile -e main -s ekko a speckled gecko This tells Guile to load the `ekko' script, and apply the function `main' to the argument list ("a" "speckled" "gecko"). Here is how Guile parses the command-line arguments: - Each space character terminates an argument. This means that two spaces in a row introduce an empty-string argument. - The tab character is not permitted (unless you quote it with the backslash character, as described below), to avoid confusion. - The newline character terminates the sequence of arguments, and will also terminate a final non-empty argument. (However, a newline following a space will not introduce a final empty-string argument; it only terminates the argument list.) - The backslash character is the escape character. It escapes backslash, space, tab, and newline. The ANSI C escape sequences like \n and \t are also supported. These produce argument constituents; the two-character combination \n doesn't act like a terminating newline. The escape sequence \NNN for exactly three octal digits reads as the character whose ASCII code is NNN. As above, characters produced this way are argument constituents. Backslash followed by other characters is not allowed. * Changes to the procedure for linking libguile with your programs ** Guile now builds and installs a shared guile library, if your system support shared libraries. (It still builds a static library on all systems.) Guile automatically detects whether your system supports shared libraries. To prevent Guile from buildisg shared libraries, pass the `--disable-shared' flag to the configure script. Guile takes longer to compile when it builds shared libraries, because it must compile every file twice --- once to produce position- independent object code, and once to produce normal object code. ** The libthreads library has been merged into libguile. To link a program against Guile, you now need only link against -lguile and -lqt; -lthreads is no longer needed. If you are using autoconf to generate configuration scripts for your application, the following lines should suffice to add the appropriate libraries to your link command: ### Find quickthreads and libguile. AC_CHECK_LIB(qt, main) AC_CHECK_LIB(guile, scm_shell) * Changes to Scheme functions ** Guile Scheme's special syntax for keyword objects is now optional, and disabled by default. The syntax variation from R4RS made it difficult to port some interesting packages to Guile. The routines which accepted keyword arguments (mostly in the module system) have been modified to also accept symbols whose names begin with `:'. To change the keyword syntax, you must first import the (ice-9 debug) module: (use-modules (ice-9 debug)) Then you can enable the keyword syntax as follows: (read-set! keywords 'prefix) To disable keyword syntax, do this: (read-set! keywords #f) ** Many more primitive functions accept shared substrings as arguments. In the past, these functions required normal, mutable strings as arguments, although they never made use of this restriction. ** The uniform array functions now operate on byte vectors. These functions are `array-fill!', `serial-array-copy!', `array-copy!', `serial-array-map', `array-map', `array-for-each', and `array-index-map!'. ** The new functions `trace' and `untrace' implement simple debugging support for Scheme functions. The `trace' function accepts any number of procedures as arguments, and tells the Guile interpreter to display each procedure's name and arguments each time the procedure is invoked. When invoked with no arguments, `trace' returns the list of procedures currently being traced. The `untrace' function accepts any number of procedures as arguments, and tells the Guile interpreter not to trace them any more. When invoked with no arguments, `untrace' untraces all curretly traced procedures. The tracing in Guile has an advantage over most other systems: we don't create new procedure objects, but mark the procedure objects themselves. This means that anonymous and internal procedures can be traced. ** The function `assert-repl-prompt' has been renamed to `set-repl-prompt!'. It takes one argument, PROMPT. - If PROMPT is #f, the Guile read-eval-print loop will not prompt. - If PROMPT is a string, we use it as a prompt. - If PROMPT is a procedure accepting no arguments, we call it, and display the result as a prompt. - Otherwise, we display "> ". ** The new function `eval-string' reads Scheme expressions from a string and evaluates them, returning the value of the last expression in the string. If the string contains no expressions, it returns an unspecified value. ** The new function `thunk?' returns true iff its argument is a procedure of zero arguments. ** `defined?' is now a builtin function, instead of syntax. This means that its argument should be quoted. It returns #t iff its argument is bound in the current module. ** The new syntax `use-modules' allows you to add new modules to your environment without re-typing a complete `define-module' form. It accepts any number of module names as arguments, and imports their public bindings into the current module. ** The new function (module-defined? NAME MODULE) returns true iff NAME, a symbol, is defined in MODULE, a module object. ** The new function `builtin-bindings' creates and returns a hash table containing copies of all the root module's bindings. ** The new function `builtin-weak-bindings' does the same as `builtin-bindings', but creates a doubly-weak hash table. ** The `equal?' function now considers variable objects to be equivalent if they have the same name and the same value. ** The new function `command-line' returns the command-line arguments given to Guile, as a list of strings. When using guile as a script interpreter, `command-line' returns the script's arguments; those processed by the interpreter (like `-s' or `-c') are omitted. (In other words, you get the normal, expected behavior.) Any application that uses scm_shell to process its command-line arguments gets this behavior as well. ** The new function `load-user-init' looks for a file called `.guile' in the user's home directory, and loads it if it exists. This is mostly for use by the code generated by scm_compile_shell_switches, but we thought it might also be useful in other circumstances. ** The new function `log10' returns the base-10 logarithm of its argument. ** Changes to I/O functions *** The functions `read', `primitive-load', `read-and-eval!', and `primitive-load-path' no longer take optional arguments controlling case insensitivity and a `#' parser. Case sensitivity is now controlled by a read option called `case-insensitive'. The user can add new `#' syntaxes with the `read-hash-extend' function (see below). *** The new function `read-hash-extend' allows the user to change the syntax of Guile Scheme in a somewhat controlled way. (read-hash-extend CHAR PROC) When parsing S-expressions, if we read a `#' character followed by the character CHAR, use PROC to parse an object from the stream. If PROC is #f, remove any parsing procedure registered for CHAR. The reader applies PROC to two arguments: CHAR and an input port. *** The new functions read-delimited and read-delimited! provide a general mechanism for doing delimited input on streams. (read-delimited DELIMS [PORT HANDLE-DELIM]) Read until we encounter one of the characters in DELIMS (a string), or end-of-file. PORT is the input port to read from; it defaults to the current input port. The HANDLE-DELIM parameter determines how the terminating character is handled; it should be one of the following symbols: 'trim omit delimiter from result 'peek leave delimiter character in input stream 'concat append delimiter character to returned value 'split return a pair: (RESULT . TERMINATOR) HANDLE-DELIM defaults to 'peek. (read-delimited! DELIMS BUF [PORT HANDLE-DELIM START END]) A side-effecting variant of `read-delimited'. The data is written into the string BUF at the indices in the half-open interval [START, END); the default interval is the whole string: START = 0 and END = (string-length BUF). The values of START and END must specify a well-defined interval in BUF, i.e. 0 <= START <= END <= (string-length BUF). It returns NBYTES, the number of bytes read. If the buffer filled up without a delimiter character being found, it returns #f. If the port is at EOF when the read starts, it returns the EOF object. If an integer is returned (i.e., the read is successfully terminated by reading a delimiter character), then the HANDLE-DELIM parameter determines how to handle the terminating character. It is described above, and defaults to 'peek. (The descriptions of these functions were borrowed from the SCSH manual, by Olin Shivers and Brian Carlstrom.) *** The `%read-delimited!' function is the primitive used to implement `read-delimited' and `read-delimited!'. (%read-delimited! DELIMS BUF GOBBLE? [PORT START END]) This returns a pair of values: (TERMINATOR . NUM-READ). - TERMINATOR describes why the read was terminated. If it is a character or the eof object, then that is the value that terminated the read. If it is #f, the function filled the buffer without finding a delimiting character. - NUM-READ is the number of characters read into BUF. If the read is successfully terminated by reading a delimiter character, then the gobble? parameter determines what to do with the terminating character. If true, the character is removed from the input stream; if false, the character is left in the input stream where a subsequent read operation will retrieve it. In either case, the character is also the first value returned by the procedure call. (The descriptions of this function was borrowed from the SCSH manual, by Olin Shivers and Brian Carlstrom.) *** The `read-line' and `read-line!' functions have changed; they now trim the terminator by default; previously they appended it to the returned string. For the old behavior, use (read-line PORT 'concat). *** The functions `uniform-array-read!' and `uniform-array-write!' now take new optional START and END arguments, specifying the region of the array to read and write. *** The `ungetc-char-ready?' function has been removed. We feel it's inappropriate for an interface to expose implementation details this way. ** Changes to the Unix library and system call interface *** The new fcntl function provides access to the Unix `fcntl' system call. (fcntl PORT COMMAND VALUE) Apply COMMAND to PORT's file descriptor, with VALUE as an argument. Values for COMMAND are: F_DUPFD duplicate a file descriptor F_GETFD read the descriptor's close-on-exec flag F_SETFD set the descriptor's close-on-exec flag to VALUE F_GETFL read the descriptor's flags, as set on open F_SETFL set the descriptor's flags, as set on open to VALUE F_GETOWN return the process ID of a socket's owner, for SIGIO F_SETOWN set the process that owns a socket to VALUE, for SIGIO FD_CLOEXEC not sure what this is For details, see the documentation for the fcntl system call. *** The arguments to `select' have changed, for compatibility with SCSH. The TIMEOUT parameter may now be non-integral, yielding the expected behavior. The MILLISECONDS parameter has been changed to MICROSECONDS, to more closely resemble the underlying system call. The RVEC, WVEC, and EVEC arguments can now be vectors; the type of the corresponding return set will be the same. *** The arguments to the `mknod' system call have changed. They are now: (mknod PATH TYPE PERMS DEV) Create a new file (`node') in the file system. PATH is the name of the file to create. TYPE is the kind of file to create; it should be 'fifo, 'block-special, or 'char-special. PERMS specifies the permission bits to give the newly created file. If TYPE is 'block-special or 'char-special, DEV specifies which device the special file refers to; its interpretation depends on the kind of special file being created. *** The `fork' function has been renamed to `primitive-fork', to avoid clashing with various SCSH forks. *** The `recv' and `recvfrom' functions have been renamed to `recv!' and `recvfrom!'. They no longer accept a size for a second argument; you must pass a string to hold the received value. They no longer return the buffer. Instead, `recv' returns the length of the message received, and `recvfrom' returns a pair containing the packet's length and originating address. *** The file descriptor datatype has been removed, as have the `read-fd', `write-fd', `close', `lseek', and `dup' functions. We plan to replace these functions with a SCSH-compatible interface. *** The `create' function has been removed; it's just a special case of `open'. *** There are new functions to break down process termination status values. In the descriptions below, STATUS is a value returned by `waitpid'. (status:exit-val STATUS) If the child process exited normally, this function returns the exit code for the child process (i.e., the value passed to exit, or returned from main). If the child process did not exit normally, this function returns #f. (status:stop-sig STATUS) If the child process was suspended by a signal, this function returns the signal that suspended the child. Otherwise, it returns #f. (status:term-sig STATUS) If the child process terminated abnormally, this function returns the signal that terminated the child. Otherwise, this function returns false. POSIX promises that exactly one of these functions will return true on a valid STATUS value. These functions are compatible with SCSH. *** There are new accessors and setters for the broken-out time vectors returned by `localtime', `gmtime', and that ilk. They are: Component Accessor Setter ========================= ============ ============ seconds tm:sec set-tm:sec minutes tm:min set-tm:min hours tm:hour set-tm:hour day of the month tm:mday set-tm:mday month tm:mon set-tm:mon year tm:year set-tm:year day of the week tm:wday set-tm:wday day in the year tm:yday set-tm:yday daylight saving time tm:isdst set-tm:isdst GMT offset, seconds tm:gmtoff set-tm:gmtoff name of time zone tm:zone set-tm:zone *** There are new accessors for the vectors returned by `uname', describing the host system: Component Accessor ============================================== ================ name of the operating system implementation utsname:sysname network name of this machine utsname:nodename release level of the operating system utsname:release version level of the operating system utsname:version machine hardware platform utsname:machine *** There are new accessors for the vectors returned by `getpw', `getpwnam', `getpwuid', and `getpwent', describing entries from the system's user database: Component Accessor ====================== ================= user name passwd:name user password passwd:passwd user id passwd:uid group id passwd:gid real name passwd:gecos home directory passwd:dir shell program passwd:shell *** There are new accessors for the vectors returned by `getgr', `getgrnam', `getgrgid', and `getgrent', describing entries from the system's group database: Component Accessor ======================= ============ group name group:name group password group:passwd group id group:gid group members group:mem *** There are new accessors for the vectors returned by `gethost', `gethostbyaddr', `gethostbyname', and `gethostent', describing internet hosts: Component Accessor ========================= =============== official name of host hostent:name alias list hostent:aliases host address type hostent:addrtype length of address hostent:length list of addresses hostent:addr-list *** There are new accessors for the vectors returned by `getnet', `getnetbyaddr', `getnetbyname', and `getnetent', describing internet networks: Component Accessor ========================= =============== official name of net netent:name alias list netent:aliases net number type netent:addrtype net number netent:net *** There are new accessors for the vectors returned by `getproto', `getprotobyname', `getprotobynumber', and `getprotoent', describing internet protocols: Component Accessor ========================= =============== official protocol name protoent:name alias list protoent:aliases protocol number protoent:proto *** There are new accessors for the vectors returned by `getserv', `getservbyname', `getservbyport', and `getservent', describing internet protocols: Component Accessor ========================= =============== official service name servent:name alias list servent:aliases port number servent:port protocol to use servent:proto *** There are new accessors for the sockaddr structures returned by `accept', `getsockname', `getpeername', `recvfrom!': Component Accessor ======================================== =============== address format (`family') sockaddr:fam path, for file domain addresses sockaddr:path address, for internet domain addresses sockaddr:addr TCP or UDP port, for internet sockaddr:port *** The `getpwent', `getgrent', `gethostent', `getnetent', `getprotoent', and `getservent' functions now return #f at the end of the user database. (They used to throw an exception.) Note that calling MUMBLEent function is equivalent to calling the corresponding MUMBLE function with no arguments. *** The `setpwent', `setgrent', `sethostent', `setnetent', `setprotoent', and `setservent' routines now take no arguments. *** The `gethost', `getproto', `getnet', and `getserv' functions now provide more useful information when they throw an exception. *** The `lnaof' function has been renamed to `inet-lnaof'. *** Guile now claims to have the `current-time' feature. *** The `mktime' function now takes an optional second argument ZONE, giving the time zone to use for the conversion. ZONE should be a string, in the same format as expected for the "TZ" environment variable. *** The `strptime' function now returns a pair (TIME . COUNT), where TIME is the parsed time as a vector, and COUNT is the number of characters from the string left unparsed. This function used to return the remaining characters as a string. *** The `gettimeofday' function has replaced the old `time+ticks' function. The return value is now (SECONDS . MICROSECONDS); the fractional component is no longer expressed in "ticks". *** The `ticks/sec' constant has been removed, in light of the above change. * Changes to the gh_ interface ** gh_eval_str() now returns an SCM object which is the result of the evaluation ** gh_scm2str() now copies the Scheme data to a caller-provided C array ** gh_scm2newstr() now makes a C array, copies the Scheme data to it, and returns the array ** gh_scm2str0() is gone: there is no need to distinguish null-terminated from non-null-terminated, since gh_scm2newstr() allows the user to interpret the data both ways. * Changes to the scm_ interface ** The new function scm_symbol_value0 provides an easy way to get a symbol's value from C code: SCM scm_symbol_value0 (char *NAME) Return the value of the symbol named by the null-terminated string NAME in the current module. If the symbol named NAME is unbound in the current module, return SCM_UNDEFINED. ** The new function scm_sysintern0 creates new top-level variables, without assigning them a value. SCM scm_sysintern0 (char *NAME) Create a new Scheme top-level variable named NAME. NAME is a null-terminated string. Return the variable's value cell. ** The function scm_internal_catch is the guts of catch. It handles all the mechanics of setting up a catch target, invoking the catch body, and perhaps invoking the handler if the body does a throw. The function is designed to be usable from C code, but is general enough to implement all the semantics Guile Scheme expects from throw. TAG is the catch tag. Typically, this is a symbol, but this function doesn't actually care about that. BODY is a pointer to a C function which runs the body of the catch; this is the code you can throw from. We call it like this: BODY (BODY_DATA, JMPBUF) where: BODY_DATA is just the BODY_DATA argument we received; we pass it through to BODY as its first argument. The caller can make BODY_DATA point to anything useful that BODY might need. JMPBUF is the Scheme jmpbuf object corresponding to this catch, which we have just created and initialized. HANDLER is a pointer to a C function to deal with a throw to TAG, should one occur. We call it like this: HANDLER (HANDLER_DATA, THROWN_TAG, THROW_ARGS) where HANDLER_DATA is the HANDLER_DATA argument we recevied; it's the same idea as BODY_DATA above. THROWN_TAG is the tag that the user threw to; usually this is TAG, but it could be something else if TAG was #t (i.e., a catch-all), or the user threw to a jmpbuf. THROW_ARGS is the list of arguments the user passed to the THROW function. BODY_DATA is just a pointer we pass through to BODY. HANDLER_DATA is just a pointer we pass through to HANDLER. We don't actually use either of those pointers otherwise ourselves. The idea is that, if our caller wants to communicate something to BODY or HANDLER, it can pass a pointer to it as MUMBLE_DATA, which BODY and HANDLER can then use. Think of it as a way to make BODY and HANDLER closures, not just functions; MUMBLE_DATA points to the enclosed variables. Of course, it's up to the caller to make sure that any data a MUMBLE_DATA needs is protected from GC. A common way to do this is to make MUMBLE_DATA a pointer to data stored in an automatic structure variable; since the collector must scan the stack for references anyway, this assures that any references in MUMBLE_DATA will be found. ** The new function scm_internal_lazy_catch is exactly like scm_internal_catch, except: - It does not unwind the stack (this is the major difference). - If handler returns, its value is returned from the throw. - BODY always receives #f as its JMPBUF argument (since there's no jmpbuf associated with a lazy catch, because we don't unwind the stack.) ** scm_body_thunk is a new body function you can pass to scm_internal_catch if you want the body to be like Scheme's `catch' --- a thunk, or a function of one argument if the tag is #f. BODY_DATA is a pointer to a scm_body_thunk_data structure, which contains the Scheme procedure to invoke as the body, and the tag we're catching. If the tag is #f, then we pass JMPBUF (created by scm_internal_catch) to the body procedure; otherwise, the body gets no arguments. ** scm_handle_by_proc is a new handler function you can pass to scm_internal_catch if you want the handler to act like Scheme's catch --- call a procedure with the tag and the throw arguments. If the user does a throw to this catch, this function runs a handler procedure written in Scheme. HANDLER_DATA is a pointer to an SCM variable holding the Scheme procedure object to invoke. It ought to be a pointer to an automatic variable (i.e., one living on the stack), or the procedure object should be otherwise protected from GC. ** scm_handle_by_message is a new handler function to use with `scm_internal_catch' if you want Guile to print a message and die. It's useful for dealing with throws to uncaught keys at the top level. HANDLER_DATA, if non-zero, is assumed to be a char * pointing to a message header to print; if zero, we use "guile" instead. That text is followed by a colon, then the message described by ARGS. ** The return type of scm_boot_guile is now void; the function does not return a value, and indeed, never returns at all. ** The new function scm_shell makes it easy for user applications to process command-line arguments in a way that is compatible with the stand-alone guile interpreter (which is in turn compatible with SCSH, the Scheme shell). To use the scm_shell function, first initialize any guile modules linked into your application, and then call scm_shell with the values of ARGC and ARGV your `main' function received. scm_shell will add any SCSH-style meta-arguments from the top of the script file to the argument vector, and then process the command-line arguments. This generally means loading a script file or starting up an interactive command interpreter. For details, see "Changes to the stand-alone interpreter" above. ** The new functions scm_get_meta_args and scm_count_argv help you implement the SCSH-style meta-argument, `\'. char **scm_get_meta_args (int ARGC, char **ARGV) If the second element of ARGV is a string consisting of a single backslash character (i.e. "\\" in Scheme notation), open the file named by the following argument, parse arguments from it, and return the spliced command line. The returned array is terminated by a null pointer. For details of argument parsing, see above, under "guile now accepts command-line arguments compatible with SCSH..." int scm_count_argv (char **ARGV) Count the arguments in ARGV, assuming it is terminated by a null pointer. For an example of how these functions might be used, see the source code for the function scm_shell in libguile/script.c. You will usually want to use scm_shell instead of calling this function yourself. ** The new function scm_compile_shell_switches turns an array of command-line arguments into Scheme code to carry out the actions they describe. Given ARGC and ARGV, it returns a Scheme expression to evaluate, and calls scm_set_program_arguments to make any remaining command-line arguments available to the Scheme code. For example, given the following arguments: -e main -s ekko a speckled gecko scm_set_program_arguments will return the following expression: (begin (load "ekko") (main (command-line)) (quit)) You will usually want to use scm_shell instead of calling this function yourself. ** The function scm_shell_usage prints a usage message appropriate for an interpreter that uses scm_compile_shell_switches to handle its command-line arguments. void scm_shell_usage (int FATAL, char *MESSAGE) Print a usage message to the standard error output. If MESSAGE is non-zero, write it before the usage message, followed by a newline. If FATAL is non-zero, exit the process, using FATAL as the termination status. (If you want to be compatible with Guile, always use 1 as the exit status when terminating due to command-line usage problems.) You will usually want to use scm_shell instead of calling this function yourself. ** scm_eval_0str now returns SCM_UNSPECIFIED if the string contains no expressions. It used to return SCM_EOL. Earth-shattering. ** The macros for declaring scheme objects in C code have been rearranged slightly. They are now: SCM_SYMBOL (C_NAME, SCHEME_NAME) Declare a static SCM variable named C_NAME, and initialize it to point to the Scheme symbol whose name is SCHEME_NAME. C_NAME should be a C identifier, and SCHEME_NAME should be a C string. SCM_GLOBAL_SYMBOL (C_NAME, SCHEME_NAME) Just like SCM_SYMBOL, but make C_NAME globally visible. SCM_VCELL (C_NAME, SCHEME_NAME) Create a global variable at the Scheme level named SCHEME_NAME. Declare a static SCM variable named C_NAME, and initialize it to point to the Scheme variable's value cell. SCM_GLOBAL_VCELL (C_NAME, SCHEME_NAME) Just like SCM_VCELL, but make C_NAME globally visible. The `guile-snarf' script writes initialization code for these macros to its standard output, given C source code as input. The SCM_GLOBAL macro is gone. ** The scm_read_line and scm_read_line_x functions have been replaced by Scheme code based on the %read-delimited! procedure (known to C code as scm_read_delimited_x). See its description above for more information. ** The function scm_sys_open has been renamed to scm_open. It now returns a port instead of an FD object. * The dynamic linking support has changed. For more information, see libguile/DYNAMIC-LINKING. Guile 1.0b3 User-visible changes from Thursday, September 5, 1996 until Guile 1.0 (Sun 5 Jan 1997): * Changes to the 'guile' program: ** Guile now loads some new files when it starts up. Guile first searches the load path for init.scm, and loads it if found. Then, if Guile is not being used to execute a script, and the user's home directory contains a file named `.guile', Guile loads that. ** You can now use Guile as a shell script interpreter. To paraphrase the SCSH manual: When Unix tries to execute an executable file whose first two characters are the `#!', it treats the file not as machine code to be directly executed by the native processor, but as source code to be executed by some interpreter. The interpreter to use is specified immediately after the #! sequence on the first line of the source file. The kernel reads in the name of the interpreter, and executes that instead. It passes the interpreter the source filename as its first argument, with the original arguments following. Consult the Unix man page for the `exec' system call for more information. Now you can use Guile as an interpreter, using a mechanism which is a compatible subset of that provided by SCSH. Guile now recognizes a '-s' command line switch, whose argument is the name of a file of Scheme code to load. It also treats the two characters `#!' as the start of a comment, terminated by `!#'. Thus, to make a file of Scheme code directly executable by Unix, insert the following two lines at the top of the file: #!/usr/local/bin/guile -s !# Guile treats the argument of the `-s' command-line switch as the name of a file of Scheme code to load, and treats the sequence `#!' as the start of a block comment, terminated by `!#'. For example, here's a version of 'echo' written in Scheme: #!/usr/local/bin/guile -s !# (let loop ((args (cdr (program-arguments)))) (if (pair? args) (begin (display (car args)) (if (pair? (cdr args)) (display " ")) (loop (cdr args))))) (newline) Why does `#!' start a block comment terminated by `!#', instead of the end of the line? That is the notation SCSH uses, and although we don't yet support the other SCSH features that motivate that choice, we would like to be backward-compatible with any existing Guile scripts once we do. Furthermore, if the path to Guile on your system is too long for your kernel, you can start the script with this horrible hack: #!/bin/sh exec /really/long/path/to/guile -s "$0" ${1+"$@"} !# Note that some very old Unix systems don't support the `#!' syntax. ** You can now run Guile without installing it. Previous versions of the interactive Guile interpreter (`guile') couldn't start up unless Guile's Scheme library had been installed; they used the value of the environment variable `SCHEME_LOAD_PATH' later on in the startup process, but not to find the startup code itself. Now Guile uses `SCHEME_LOAD_PATH' in all searches for Scheme code. To run Guile without installing it, build it in the normal way, and then set the environment variable `SCHEME_LOAD_PATH' to a colon-separated list of directories, including the top-level directory of the Guile sources. For example, if you unpacked Guile so that the full filename of this NEWS file is /home/jimb/guile-1.0b3/NEWS, then you might say export SCHEME_LOAD_PATH=/home/jimb/my-scheme:/home/jimb/guile-1.0b3 ** Guile's read-eval-print loop no longer prints # results. If the user wants to see this, she can evaluate the expression (assert-repl-print-unspecified #t), perhaps in her startup file. ** Guile no longer shows backtraces by default when an error occurs; however, it does display a message saying how to get one, and how to request that they be displayed by default. After an error, evaluate (backtrace) to see a backtrace, and (debug-enable 'backtrace) to see them by default. * Changes to Guile Scheme: ** Guile now distinguishes between #f and the empty list. This is for compatibility with the IEEE standard, the (possibly) upcoming Revised^5 Report on Scheme, and many extant Scheme implementations. Guile used to have #f and '() denote the same object, to make Scheme's type system more compatible with Emacs Lisp's. However, the change caused too much trouble for Scheme programmers, and we found another way to reconcile Emacs Lisp with Scheme that didn't require this. ** Guile's delq, delv, delete functions, and their destructive counterparts, delq!, delv!, and delete!, now remove all matching elements from the list, not just the first. This matches the behavior of the corresponding Emacs Lisp functions, and (I believe) the Maclisp functions which inspired them. I recognize that this change may break code in subtle ways, but it seems best to make the change before the FSF's first Guile release, rather than after. ** The compiled-library-path function has been deleted from libguile. ** The facilities for loading Scheme source files have changed. *** The variable %load-path now tells Guile which directories to search for Scheme code. Its value is a list of strings, each of which names a directory. *** The variable %load-extensions now tells Guile which extensions to try appending to a filename when searching the load path. Its value is a list of strings. Its default value is ("" ".scm"). *** (%search-load-path FILENAME) searches the directories listed in the value of the %load-path variable for a Scheme file named FILENAME, with all the extensions listed in %load-extensions. If it finds a match, then it returns its full filename. If FILENAME is absolute, it returns it unchanged. Otherwise, it returns #f. %search-load-path will not return matches that refer to directories. *** (primitive-load FILENAME :optional CASE-INSENSITIVE-P SHARP) uses %seach-load-path to find a file named FILENAME, and loads it if it finds it. If it can't read FILENAME for any reason, it throws an error. The arguments CASE-INSENSITIVE-P and SHARP are interpreted as by the `read' function. *** load uses the same searching semantics as primitive-load. *** The functions %try-load, try-load-with-path, %load, load-with-path, basic-try-load-with-path, basic-load-with-path, try-load-module-with- path, and load-module-with-path have been deleted. The functions above should serve their purposes. *** If the value of the variable %load-hook is a procedure, `primitive-load' applies its value to the name of the file being loaded (without the load path directory name prepended). If its value is #f, it is ignored. Otherwise, an error occurs. This is mostly useful for printing load notification messages. ** The function `eval!' is no longer accessible from the scheme level. We can't allow operations which introduce glocs into the scheme level, because Guile's type system can't handle these as data. Use `eval' or `read-and-eval!' (see below) as replacement. ** The new function read-and-eval! reads an expression from PORT, evaluates it, and returns the result. This is more efficient than simply calling `read' and `eval', since it is not necessary to make a copy of the expression for the evaluator to munge. Its optional arguments CASE_INSENSITIVE_P and SHARP are interpreted as for the `read' function. ** The function `int?' has been removed; its definition was identical to that of `integer?'. ** The functions `?', and `>=?'. Code should use the R4RS names for these functions. ** The function object-properties no longer returns the hash handle; it simply returns the object's property list. ** Many functions have been changed to throw errors, instead of returning #f on failure. The point of providing exception handling in the language is to simplify the logic of user code, but this is less useful if Guile's primitives don't throw exceptions. ** The function `fileno' has been renamed from `%fileno'. ** The function primitive-mode->fdes returns #t or #f now, not 1 or 0. * Changes to Guile's C interface: ** The library's initialization procedure has been simplified. scm_boot_guile now has the prototype: void scm_boot_guile (int ARGC, char **ARGV, void (*main_func) (), void *closure); scm_boot_guile calls MAIN_FUNC, passing it CLOSURE, ARGC, and ARGV. MAIN_FUNC should do all the work of the program (initializing other packages, reading user input, etc.) before returning. When MAIN_FUNC returns, call exit (0); this function never returns. If you want some other exit value, MAIN_FUNC may call exit itself. scm_boot_guile arranges for program-arguments to return the strings given by ARGC and ARGV. If MAIN_FUNC modifies ARGC/ARGV, should call scm_set_program_arguments with the final list, so Scheme code will know which arguments have been processed. scm_boot_guile establishes a catch-all catch handler which prints an error message and exits the process. This means that Guile exits in a coherent way when system errors occur and the user isn't prepared to handle it. If the user doesn't like this behavior, they can establish their own universal catcher in MAIN_FUNC to shadow this one. Why must the caller do all the real work from MAIN_FUNC? The garbage collector assumes that all local variables of type SCM will be above scm_boot_guile's stack frame on the stack. If you try to manipulate SCM values after this function returns, it's the luck of the draw whether the GC will be able to find the objects you allocate. So, scm_boot_guile function exits, rather than returning, to discourage people from making that mistake. The IN, OUT, and ERR arguments were removed; there are other convenient ways to override these when desired. The RESULT argument was deleted; this function should never return. The BOOT_CMD argument was deleted; the MAIN_FUNC argument is more general. ** Guile's header files should no longer conflict with your system's header files. In order to compile code which #included , previous versions of Guile required you to add a directory containing all the Guile header files to your #include path. This was a problem, since Guile's header files have names which conflict with many systems' header files. Now only need appear in your #include path; you must refer to all Guile's other header files as . Guile's installation procedure puts libguile.h in $(includedir), and the rest in $(includedir)/libguile. ** Two new C functions, scm_protect_object and scm_unprotect_object, have been added to the Guile library. scm_protect_object (OBJ) protects OBJ from the garbage collector. OBJ will not be freed, even if all other references are dropped, until someone does scm_unprotect_object (OBJ). Both functions return OBJ. Note that calls to scm_protect_object do not nest. You can call scm_protect_object any number of times on a given object, and the next call to scm_unprotect_object will unprotect it completely. Basically, scm_protect_object and scm_unprotect_object just maintain a list of references to things. Since the GC knows about this list, all objects it mentions stay alive. scm_protect_object adds its argument to the list; scm_unprotect_object remove its argument from the list. ** scm_eval_0str now returns the value of the last expression evaluated. ** The new function scm_read_0str reads an s-expression from a null-terminated string, and returns it. ** The new function `scm_stdio_to_port' converts a STDIO file pointer to a Scheme port object. ** The new function `scm_set_program_arguments' allows C code to set the value returned by the Scheme `program-arguments' function. Older changes: * Guile no longer includes sophisticated Tcl/Tk support. The old Tcl/Tk support was unsatisfying to us, because it required the user to link against the Tcl library, as well as Tk and Guile. The interface was also un-lispy, in that it preserved Tcl/Tk's practice of referring to widgets by names, rather than exporting widgets to Scheme code as a special datatype. In the Usenix Tk Developer's Workshop held in July 1996, the Tcl/Tk maintainers described some very interesting changes in progress to the Tcl/Tk internals, which would facilitate clean interfaces between lone Tk and other interpreters --- even for garbage-collected languages like Scheme. They expected the new Tk to be publicly available in the fall of 1996. Since it seems that Guile might soon have a new, cleaner interface to lone Tk, and that the old Guile/Tk glue code would probably need to be completely rewritten, we (Jim Blandy and Richard Stallman) have decided not to support the old code. We'll spend the time instead on a good interface to the newer Tk, as soon as it is available. Until then, gtcltk-lib provides trivial, low-maintenance functionality. Copyright information: Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. Local variables: mode: outline paragraph-separate: "[ ]*$" end: guile-1.8-1.8.8+1.orig/README000066400000000000000000000350151155472604000151240ustar00rootroot00000000000000This is version 1.8.7 of Guile, Project GNU's extension language library. Guile is an interpreter for Scheme, packaged as a library that you can link into your applications to give them their own scripting language. Guile will eventually support other languages as well, giving users of Guile-based applications a choice of languages. Please send bug reports to bug-guile@gnu.org. See the LICENSE file for the specific terms that apply to Guile. Additional INSTALL instructions =========================================== Generic instructions for configuring and compiling Guile can be found in the INSTALL file. Guile specific information and configure options can be found below, including instructions for installing SLIB. Guile requires a few external packages and can optionally use a number of external packages such as `readline' when they are available. Guile expects to be able to find these packages in the default compiler setup, it does not try to make any special arrangements itself. For example, for the `readline' package, Guile expects to be able to find the include file , without passing any special `-I' options to the compiler. If you installed an external package, and you used the --prefix installation option to install it somewhere else than /usr/local, you must arrange for your compiler to find it by default. If that compiler is gcc, one convenient way of making such arrangements is to use the --with-local-prefix option during installation, naming the same directory as you used in the --prefix option of the package. In particular, it is not good enough to use the same --prefix option when you install gcc and the package; you need to use the --with-local-prefix option as well. See the gcc documentation for more details. Required External Packages ================================================ Guile requires the following external packages: - GNU MP, at least version 4.1 GNU MP is used for bignum arithmetic. It is available from http://swox.com/gmp - libltdl from libtool, at least from libtool version 1.5.6 libltdl is used for loading extensions at run-time. It is available from http://www.gnu.org/software/libtool/ Guile specific flags Accepted by Configure ================================= If you run the configure script with no arguments, it should examine your system and set things up appropriately. However, there are a few switches specific to Guile you may find useful in some circumstances. --without-threads --- Build without thread support Build a Guile executable and library that supports multi-threading. The default is to enable threading support when your operating system offsers 'POSIX threads'. When you do not want threading, use `--without-threads'. --enable-deprecated=LEVEL Guile may contain features that are `deprecated'. When a feature is deprecated, it means that it is still there, but that there is a better way of achieving the same thing, and we'd rather have you use this better way. This allows us to eventually remove the old implementation and helps to keep Guile reasonably clean of historic baggage. Deprecated features are considered harmful; using them is likely a bug. See below for the related notion of `discouraged' features, which are OK but have fallen out of favor. See the file NEWS for a list of features that are currently deprecated. Each entry will also tell you what you should replace your code with. To give you some help with this process, and to encourage (OK, nudge) people to switch to the newer methods, Guile can emit warnings or errors when you use a deprecated feature. There is quite a range of possibilities, from being completely silent to giving errors at link time. What exactly happens is determined both by the value of the `--enable-deprecated' configuration option when Guile was built, and by the GUILE_WARN_DEPRECATED environment variable. It works like this: When Guile has been configured with `--enable-deprecated=no' (or, equivalently, with `--disable-deprecated') then all deprecated features are omitted from Guile. You will get "undefined reference", "variable unbound" or similar errors when you try to use them. When `--enable-deprecated=LEVEL' has been specified (for LEVEL not "no"), LEVEL will be used as the default value of the environment variable GUILE_WARN_DEPRECATED. A value of "yes" is changed to "summary" and "shutup" is changed to "no", however. When GUILE_WARN_DEPRECATED has the value "no", nothing special will happen when a deprecated feature is used. When GUILE_WARN_DEPRECATED has the value "summary", and a deprecated feature has been used, Guile will print this message at exit: Some deprecated features have been used. Set the environment variable GUILE_WARN_DEPRECATED to "detailed" and rerun the program to get more information. Set it to "no" to suppress this message. When GUILE_WARN_DEPRECATED has the value "detailed", a detailed warning is emitted immediatly for the first use of a deprecated feature. The default is `--enable-deprecated=yes'. In addition to setting GUILE_WARN_DEPRECATED in the environment, you can also use (debug-enable 'warn-deprecated) and (debug-disable 'warn-deprecated) to enable and disable the detailed messaged at run time. --disable-discouraged In addition to deprecated features, Guile can also contain things that are merely `discouraged'. It is OK to continue to use these features in old code, but new code should avoid them since there are better alternatives. There is nothing wrong with a discouraged feature per se, but they might have strange names, or be non-standard, for example. Avoiding them will make your code better. --disable-shared --- Do not build shared libraries. --disable-static --- Do not build static libraries. Normally, both static and shared libraries will be built if your system supports them. --enable-debug-freelist --- Enable freelist debugging. This enables a debugging version of scm_cell and scm_double_cell, and also registers an extra primitive, the setter `gc-set-debug-check-freelist!'. Configure with the --enable-debug-freelist option to enable the gc-set-debug-check-freelist! primitive, and then use: (gc-set-debug-check-freelist! #t) # turn on checking of the freelist (gc-set-debug-check-freelist! #f) # turn off checking Checking of the freelist forces a traversal of the freelist and a garbage collection before each allocation of a cell. This can slow down the interpreter dramatically, so the setter should be used to turn on this extra processing only when necessary. --enable-debug-malloc --- Enable malloc debugging. Include code for debugging of calls to scm_malloc, scm_realloc, etc. It records the number of allocated objects of each kind. This is useful when searching for memory leaks. A Guile compiled with this option provides the primitive `malloc-stats' which returns an alist with pairs of kind and the number of objects of that kind. --enable-guile-debug --- Include internal debugging functions --disable-posix --- omit posix interfaces --disable-networking --- omit networking interfaces --disable-regex --- omit regular expression interfaces Cross building Guile ===================================================== Guile can be cross-compiled for Windows using the i586-mingw32msvc cross-compiler. To do this, you first need to cross-build Guile's prerequisites - GNU MP and libtool/libltdl (as described above) - and then cross-build Guile itself. For each of these steps, configure using an invocation like this: CPPFLAGS=-I/usr/local/i586-mingw32msvc/include \ LDFLAGS=-L/usr/local/i586-mingw32msvc/lib \ GUILE_FOR_BUILD=/usr/local/bin/guile \ ./configure --prefix=/usr/local/i586-mingw32msvc --host=i586-mingw32msvc Then run `make' - which should complete without any errors - and `sudo make install'. (`make check' doesn't work when cross-compiling, because the built DLLs and program cannot be run on GNU/Linux.) The `GUILE_FOR_BUILD=...' setting is needed because some later steps of the build process use Guile itself. In the non-cross-compiling case this is the version of Guile that has just been built. When cross-compiling, you have to set GUILE_FOR_BUILD to tell the build where it can find a native version of Guile, to use for these steps. Cross-compiling for other hosts may also work, using the following instructions; but this has not been recently tested. To configure Guile for cross building, for example for Cygwin: ./configure --host=i686-pc-cygwin --disable-shared A C compiler for the build system is required. The default is "PATH=/usr/bin:$PATH cc". If that doesn't suit it can be specified with the CC_FOR_BUILD variable in the usual way, for instance ./configure --host=m68k-unknown-linux-gnu CC_FOR_BUILD=/my/local/gcc Guile for the build system can be specified similarly with the GUILE_FOR_BUILD variable, it defaults to just "guile". Using Guile Without Installing It ========================================= The top directory of the Guile sources contains a script called "pre-inst-guile" that can be used to run the Guile that has just been built. Installing SLIB =========================================================== In order to use SLIB from Guile you basically only need to put the `slib' directory _in_ one of the directories on Guile's load path. The standard installation is: 1. Obtain slib from http://www-swiss.ai.mit.edu/~jaffer/SLIB.html 2. Put it in Guile's data directory, that is the directory printed when you type guile-config info pkgdatadir at the shell prompt. This is normally `/usr/local/share/guile', so the directory will normally have full path `/usr/local/share/guile/slib'. 3. Start guile as a user with write access to the data directory and type (use-modules (ice-9 slib)) at the Guile prompt. This will generate the slibcat catalog next to the slib directory. SLIB's `require' is provided by the Guile module (ice-9 slib). Example: (use-modules (ice-9 slib)) (require 'primes) (prime? 7) Guile Documentation ================================================== If you've never used Scheme before, then the Guile Tutorial (guile-tut.info) is a good starting point. The Guile Reference Manual (guile.info) is the primary documentation for Guile. The Goops object system is documented separately (goops.info). A copy of the R5RS Scheme specification is included too (r5rs.info). Info format versions of this documentation are installed as part of the normal build process. The texinfo sources are under the doc directory, and other formats like Postscript, PDF, DVI or HTML can be generated from them with Tex and Texinfo tools. The doc directory also includes an example-smob subdirectory which has the example code from the "Defining New Types (Smobs)" chapter of the reference manual. The Guile WWW page is at http://www.gnu.org/software/guile/guile.html It contains a link to the Guile FAQ. About This Distribution ============================================== Interesting files include: - LICENSE, which contains the exact terms of the Guile license. - COPYING, which contains the terms of the GNU General Public License. - INSTALL, which contains general instructions for building/installing Guile. - NEWS, which describes user-visible changes since the last release of Guile. Files are usually installed according to the prefix specified to configure, /usr/local by default. Building and installing gives you: Executables, in ${prefix}/bin: guile --- a stand-alone interpreter for Guile. With no arguments, this is a simple interactive Scheme interpreter. It can also be used as an interpreter for script files; see the NEWS file for details. guile-config --- a Guile script which provides the information necessary to link your programs against the Guile library. guile-snarf --- a script to parse declarations in your C code for Scheme-visible C functions, Scheme objects to be used by C code, etc. Libraries, in ${prefix}/lib. Depending on the platform and options given to configure, you may get shared libraries in addition to or instead of these static libraries: libguile.a --- an object library containing the Guile interpreter, You can use Guile in your own programs by linking against this. libguilereadline.a --- an object library containing glue code for the GNU readline library. libguile-srfi-*.a --- various SRFI support libraries Header files, in ${prefix}/include: libguile.h, guile/gh.h, libguile/*.h --- for libguile. guile-readline/readline.h --- for guile-readline. Support files, in ${prefix}/share/guile/: ice-9/* --- run-time support for Guile: the module system, read-eval-print loop, some R4RS code and other infrastructure. oop/* --- the Guile Object-Oriented Programming System (GOOPS) scripts/* --- executable modules, i.e., scheme programs that can be both called as an executable from the shell, and loaded and used as a module from scheme code. See scripts/README for more info. srfi/* --- SRFI support modules. See srfi/README for more info. Automake macros, in ${prefix}/share/aclocal: guile.m4 Documentation in Info format, in ${prefix}/info: guile --- Guile reference manual. guile-tut --- Guile tutorial. GOOPS --- GOOPS reference manual. r5rs --- Revised(5) Report on the Algorithmic Language Scheme. The Guile source tree is laid out as follows: libguile: The Guile Scheme interpreter --- both the object library for you to link with your programs, and the executable you can run. ice-9: Guile's module system, initialization code, and other infrastructure. guile-config: Source for the guile-config script. guile-readline: The glue code for using GNU readline with Guile. This will be build when configure can find a recent enough readline library on your system. doc: Documentation (see above). Git Repository Access ================================================ Guile's source code is stored in a Git repository at Savannah. Anyone can access it using `git-clone' from one of the following URLs: git://git.sv.gnu.org/guile.git http://git.sv.gnu.org/r/guile.git Developers with a Savannah SSH account can also access it from: ssh://git.sv.gnu.org/srv/git/guile.git The repository can also be browsed on-line at the following address: http://git.sv.gnu.org/gitweb/?p=guile.git For more information on Git, please see: http://git.or.cz/ Please send problem reports to . guile-1.8-1.8.8+1.orig/THANKS000066400000000000000000000051271155472604000151600ustar00rootroot00000000000000Contributors since the last release: Rob Browning Ludovic Courtès Julian Graham Stefan Jahn Neil Jerram Gregory Marton Antoine Mathys Thien-Thi Nguyen Han-Wen Nienhuys Jose A Ortega Ruiz Kevin Ryde Bill Schottstaedt Richard Todd Sponsors since the last release: The Linux Developers Group For fixes or providing information which led to a fix: David Allouche Martin Baulig Fabrice Bauzac Sylvain Beucler Carlo Bramini Rob Browning Adrian Bunk Michael Carmack Stephen Compall Brian Crowder Christopher Cramer David Diffenbaugh Hyper Division Alexandre Duret-Lutz Nils Durner John W Eaton Clinton Ebadi David Fang Barry Fishman Charles Gagnon Peter Gavin Eric Gillespie, Jr Didier Godefroy Panicz Maciej Godek John Goerzen Mike Gran Szavai Gyula Roland Haeder Sven Hartrumpf Eric Hanchrow Judy Hawkins Sam Hocevar Patrick Horgan Ales Hvezda Peter Ivanyi Wolfgang Jaehrling Aubrey Jaffer Paul Jarc Steve Juranich Richard Kim Bruce Korb René Köcher Matthias Köppe Matt Kraai Daniel Kraft Jay Krell Jeff Long Marco Maggi Gregory Marton Kjetil S. Matheussen Antoine Mathys Dan McMahill Roger Mc Murtrie Scott McPeak Tim Mooney Han-Wen Nienhuys Jan Nieuwenhuizen Hrvoje NikÅ¡ić Stefan Nordhausen Roland Orre Peter O'Gorman Pieter Pareit Jack Pavlovsky Arno Peters Ron Peterson David Pirotte Ken Raeburn Andreas Rottmann Hugh Sasse Werner Scheinast Bill Schottstaedt Frank Schwidom Thiemo Seufer Scott Shedden Alex Shinn Daniel Skarda Cesar Strauss Rainer Tammer Richard Todd Issac Trotts Greg Troxel Aaron M. Ucko Stephen Uitti Momchil Velikov Linas Vepstas Panagiotis Vossos Neil W. Van Dyke Aaron VanDevender Andreas Vögele Michael Talbot-Wilson Michael Tuexen Jon Wilson Andy Wingo Keith Wright ;; Local Variables: ;; coding: utf-8 ;; End: guile-1.8-1.8.8+1.orig/acinclude.m4000066400000000000000000000253611155472604000164400ustar00rootroot00000000000000dnl On the NeXT, #including doesn't give you a definition for dnl struct utime, unless you #define _POSIX_SOURCE. AC_DEFUN([GUILE_STRUCT_UTIMBUF], [ AC_CACHE_CHECK([whether we need POSIX to get struct utimbuf], guile_cv_struct_utimbuf_needs_posix, [AC_TRY_CPP([ #ifdef __EMX__ #include #else #include #endif struct utime blah; ], guile_cv_struct_utimbuf_needs_posix=no, guile_cv_struct_utimbuf_needs_posix=yes)]) if test "$guile_cv_struct_utimbuf_needs_posix" = yes; then AC_DEFINE([UTIMBUF_NEEDS_POSIX], 1, [Define this if doesn't define struct utimbuf unless _POSIX_SOURCE is defined. See GUILE_STRUCT_UTIMBUF in aclocal.m4.]) fi]) dnl dnl Apparently, at CMU they have a weird version of libc.h that is dnl installed in /usr/local/include and conflicts with unistd.h. dnl In these situations, we should not #include libc.h. dnl This test arranges to #define LIBC_H_WITH_UNISTD_H iff libc.h is dnl present on the system, and is safe to #include. dnl AC_DEFUN([GUILE_HEADER_LIBC_WITH_UNISTD], [ AC_CHECK_HEADERS(libc.h unistd.h) AC_CACHE_CHECK( [whether libc.h and unistd.h can be included together], guile_cv_header_libc_with_unistd, [ if test "$ac_cv_header_libc_h" = "no"; then guile_cv_header_libc_with_unistd="no" elif test "$ac_cv_header_unistd_h" = "no"; then guile_cv_header_libc_with_unistd="yes" else AC_TRY_COMPILE( [ # include # include ], [], [guile_cv_header_libc_with_unistd=yes], [guile_cv_header_libc_with_unistd=no] ) fi ] ) if test "$guile_cv_header_libc_with_unistd" = yes; then AC_DEFINE(LIBC_H_WITH_UNISTD_H, 1, [Define this if we should include when we've already included . On some systems, they conflict, and libc.h should be omitted. See GUILE_HEADER_LIBC_WITH_UNISTD in aclocal.m4.]) fi ] ) dnl This is needed when we want to check for the same function repeatedly dnl with other parameters, such as libraries, varying. dnl dnl GUILE_NAMED_CHECK_FUNC(FUNCTION, TESTNAME, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) AC_DEFUN([GUILE_NAMED_CHECK_FUNC], [AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(ac_cv_func_$1_$2, [AC_TRY_LINK( dnl Don't include because on OSF/1 3.0 it includes dnl which includes which contains a prototype for dnl select. Similarly for bzero. [/* System header to define __stub macros and hopefully few prototypes, which can conflict with char $1(); below. */ #include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $1(); ], [ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$1) || defined (__stub___$1) choke me #else $1(); #endif ], eval "ac_cv_func_$1_$2=yes", eval "ac_cv_func_$1_$2=no")]) if eval "test \"`echo '$ac_cv_func_'$1'_'$2`\" = yes"; then AC_MSG_RESULT(yes) ifelse([$3], , :, [$3]) else AC_MSG_RESULT(no) ifelse([$4], , , [$4 ])dnl fi ]) dnl Available from the Autoconf Macro Archive at: dnl http://autoconf-archive.cryp.to/acx_pthread.html dnl AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD guile-1.8-1.8.8+1.orig/am/000077500000000000000000000000001155472604000146355ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/am/ChangeLog-2008000066400000000000000000000007031155472604000167760ustar00rootroot000000000000002002-04-10 Rob Browning * .cvsignore: add Makefile and Makefile.in. 2002-04-01 Thien-Thi Nguyen * maintainer-dirs: Remove "if MAINTAINER_MODE" conditional. 2002-03-30 Thien-Thi Nguyen * maintainer-dirs: New file. * Makefile.am (am_frags): Add "maintainer-dirs". 2002-02-26 Thien-Thi Nguyen * pre-inst-guile, Makefile.am, README: New files. guile-1.8-1.8.8+1.orig/am/Makefile.am000066400000000000000000000020061155472604000166670ustar00rootroot00000000000000## Process this file with Automake to create Makefile.in ## ## Copyright (C) 2002, 2006, 2008 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA AUTOMAKE_OPTIONS = gnu am_frags = pre-inst-guile maintainer-dirs EXTRA_DIST = $(am_frags) ChangeLog-2008 ## Makefile.am ends here guile-1.8-1.8.8+1.orig/am/README000066400000000000000000000001571155472604000155200ustar00rootroot00000000000000data directory: automake frags do not name files using extension ".am", as automake is overzealous sometimes. guile-1.8-1.8.8+1.orig/am/maintainer-dirs000066400000000000000000000023621155472604000176510ustar00rootroot00000000000000## am/maintainer-dirs --- define workbook and mscripts vars ## Copyright (C) 2002, 2006 Free Software Foundation ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA ## Commentary: ## This fragment defines two variables: workbook and mscripts. ## It can be included in any Makefile.am by adding the line: ## include $(top_srcdir)/am/maintainer-dirs ## See $(workbook)/build/maintainer-dirs.text for more info. ## Code: workbook = $(top_srcdir_absolute)/../workbook mscripts = $(top_srcdir_absolute)/../scripts ## am/maintainer-dirs ends here guile-1.8-1.8.8+1.orig/am/pre-inst-guile000066400000000000000000000024511155472604000174260ustar00rootroot00000000000000## am/pre-inst-guile --- define preinstguile and preinstguiletool vars ## Copyright (C) 2002, 2006 Free Software Foundation ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA ## Commentary: ## This fragment defines two variables: preinstguile, preinstguiletool. ## It can be included in any Makefile.am by adding the line: ## include $(top_srcdir)/am/pre-inst-guile ## See devel/build/pre-inst-guile.text (CVS only) for more info. ## Code: preinstguile = $(top_builddir_absolute)/pre-inst-guile preinstguiletool = GUILE="$(preinstguile)" $(top_srcdir)/scripts ## am/pre-inst-guile ends here guile-1.8-1.8.8+1.orig/autogen.sh000077500000000000000000000005001155472604000162340ustar00rootroot00000000000000#!/bin/sh # Usage: sh -x ./autogen.sh set -e [ -f GUILE-VERSION ] || { echo "autogen.sh: run this command only at the top of guile-core." exit 1 } ###################################################################### ### update infrastructure autoreconf -i --force --verbose echo "Now run configure and make." guile-1.8-1.8.8+1.orig/benchmark-guile.in000066400000000000000000000023371155472604000176320ustar00rootroot00000000000000#! /bin/sh # Usage: benchmark-guile [-i GUILE-INTERPRETER] [GUILE-BENCHMARK-ARGS] # If `-i GUILE-INTERPRETER' is omitted, use ${top_builddir}/pre-inst-guile. # See ${top_srcdir}/benchmark-suite/guile-benchmark for documentation on GUILE-BENCHMARK-ARGS. # # Example invocations: # ./benchmark-guile # ./benchmark-guile numbers.bm # ./benchmark-guile -i /usr/local/bin/guile # ./benchmark-guile -i /usr/local/bin/guile numbers.bm set -e top_builddir=@top_builddir_absolute@ top_srcdir=@top_srcdir_absolute@ BENCHMARK_SUITE_DIR=${top_srcdir}/benchmark-suite if [ x"$1" = x-i ] ; then guile=$2 shift shift else guile=${top_builddir}/pre-inst-guile fi GUILE_LOAD_PATH=$BENCHMARK_SUITE_DIR export GUILE_LOAD_PATH if [ -f "$guile" -a -x "$guile" ] ; then echo Benchmarking $guile ... "$@" echo with GUILE_LOAD_PATH=$GUILE_LOAD_PATH else echo ERROR: Cannot execute $guile exit 1 fi # documentation searching ignores GUILE_LOAD_PATH. if [ ! -f guile-procedures.txt ] ; then @LN_S@ libguile/guile-procedures.txt . fi exec $guile \ -e main -s "$BENCHMARK_SUITE_DIR/guile-benchmark" \ --benchmark-suite "$BENCHMARK_SUITE_DIR/benchmarks" \ --log-file benchmark-guile.log "$@" # benchmark-guile ends here guile-1.8-1.8.8+1.orig/benchmark-suite/000077500000000000000000000000001155472604000173215ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/benchmark-suite/ChangeLog-2008000066400000000000000000000055321155472604000214670ustar00rootroot000000000000002008-04-17 Ludovic Courtès * Makefile.am (SCM_BENCHMARKS): Add `benchmarks/read.bm'. * benchmarks/read.bm: New file. 2008-01-22 Neil Jerram * COPYING: Removed. 2006-05-02 Marius Vollmer * Makefile.am (SCM_BENCHMARKS_DIRS, dist-hook): Removed, they are no longer needed and lead to unclean tarballs. 2004-01-23 Dirk Herrmann * lib.scm: Extracted '/i' to toplevel. Print the guile version number before the benchmarks are run. Print the framework-time per iteration as an inexact number. 2004-01-06 Marius Vollmer * lib.scm (print-result, print-user-result): Handle exact fractions. 2003-05-27 Dirk Herrmann * lib.scm: Fix some typos in the documentation. 2002-09-14 Rob Browning * .cvsignore: new file. 2002-07-26 Marius Vollmer * Makefile.am (SCM_BENCHMARKS): List the real benchmarks, not foo and bar. (SCM_BENCHMARKS_DIRS): Uncommented, with an empty value. (dist-hook): Use quotes so that an empty SCM_BENCHMARKS_DIRS works. 2002-07-21 Dirk Herrmann * lib.scm (print-result, print-user-result): Changed the reporter's outputs to use symbols rather than strings to document the individual values. Thanks to Neil Jerram for the suggestion. 2002-07-21 Dirk Herrmann * benchmarks/0-reference.bm: Added as a reference benchmark to be used to calibrate iteration counts. * lib.scm: Added documentation. Added some initialization messages. (benchmark-time-base, benchmark-total-time, benchmark-user-time, benchmark-system-time, benchmark-frame-time, benchmark-core-time, benchmark-user-time\interpreter, benchmark-core-time\interpreter): Exported. (benchmark-time-base, time-base): Renamed time-base to benchmark-time-base and introduced new time-base as a short-cut. (total-time, benchmark-total-time, user-time, benchmark-user-time, system-time, benchmark-system-time, frame-time, benchmark-frame-time, benchmark-time, benchmark-core-time, user-time\interpreter, benchmark-user-time\interpreter, benchmark-time\interpreter, benchmark-core-time\interpreter, print-result, print-user-result): Renamed -time to benchmark--time. Exceptions: benchmark-time and benchmark-time\interpreter were renamed to benchmark-core-time and benchmark-core-time\interpreter, respectively. 2002-07-20 Dirk Herrmann * COPYING, README, Makefile.am, lib.scm, guile-benchmark: Copied from the test-suite directory, renamed and adapted for use with benchmarks. * benchmarks/logand.bm, benchmarks/continuations.bm, benchmarks/if.bm: Added as initial fairly stupid examples for benchmarks. 2002-07-20 Dirk Herrmann * Log begins. guile-1.8-1.8.8+1.orig/benchmark-suite/Makefile.am000066400000000000000000000005171155472604000213600ustar00rootroot00000000000000SCM_BENCHMARKS = benchmarks/0-reference.bm \ benchmarks/continuations.bm \ benchmarks/if.bm \ benchmarks/logand.bm \ benchmarks/read.bm \ benchmarks/subr.bm \ benchmarks/uniform-vector-read.bm EXTRA_DIST = guile-benchmark lib.scm $(SCM_BENCHMARKS) \ ChangeLog-2008 guile-1.8-1.8.8+1.orig/benchmark-suite/README000066400000000000000000000015431155472604000202040ustar00rootroot00000000000000This directory contains some benchmarks for Guile, and some generic benchmarking support code. To run these benchmarks, you will need a version of Guile more recent than 15 Feb 1999 --- the benchmarks use the (ice-9 and-let*) and (ice-9 getopt-long) modules, which were added to Guile around then. For information about how to run the benchmark suite, read the usage instructions in the comments at the top of the guile-benchmark script. You can reference the file `lib.scm' from your own code as the module (benchmark-suite lib); it also has comments at the top and before each function explaining what's going on. Please write more Guile benchmarks, and send them to bug-guile@gnu.org. We'll merge them into the distribution. All benchmark suites must be licensed for our use under the GPL, but I don't think we're going to collect assignment papers for them. guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/000077500000000000000000000000001155472604000214365ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/0-reference.bm000066400000000000000000000001031155472604000240430ustar00rootroot00000000000000(benchmark "reference benchmark for iteration counts" 330000 #t) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/continuations.bm000066400000000000000000000001701155472604000246510ustar00rootroot00000000000000(define (callee continuation) (continuation #t)) (benchmark "call/cc" 300 (call-with-current-continuation callee)) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/if.bm000066400000000000000000000020241155472604000223520ustar00rootroot00000000000000(with-benchmark-prefix "if--then-else" (benchmark "executing then" 330000 (if (quote #t) #t #f)) (benchmark "executing else" 330000 (if (quote #f) #t #f))) (with-benchmark-prefix "if--then" (benchmark "executing then" 330000 (if (quote #t) #t)) (benchmark "executing else" 330000 (if (quote #f) #t))) (with-benchmark-prefix "if--then-else" (let ((x #t)) (benchmark "executing then" 330000 (if x #t #f))) (let ((x #f)) (benchmark "executing else" 330000 (if x #t #f)))) (with-benchmark-prefix "if--then" (let ((x #t)) (benchmark "executing then" 330000 (if x #t))) (let ((x #f)) (benchmark "executing else" 330000 (if x #t)))) (with-benchmark-prefix "if--then-else" (benchmark "executing then" 330000 (if #t #t #f)) (benchmark "executing else" 330000 (if #f #t #f))) (with-benchmark-prefix "if--then" (benchmark "executing then" 330000 (if #t #t)) (benchmark "executing else" 330000 (if #f #t))) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/logand.bm000066400000000000000000000001731155472604000232230ustar00rootroot00000000000000(define bignum (1- (expt 2 128))) (let* ((i 0)) (benchmark "bignum" 130000 (logand i bignum) (set! i (+ i 1)))) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/read.bm000066400000000000000000000037311155472604000226750ustar00rootroot00000000000000;;; read.bm --- Exercise the reader. -*- Scheme -*- ;;; ;;; Copyright (C) 2008 Free Software Foundation, Inc. ;;; ;;; This program is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this software; see the file COPYING. If not, write to ;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;; Boston, MA 02110-1301 USA (define-module (benchmarks read) :use-module (benchmark-suite lib)) (define %files-to-load ;; Various large Scheme files. (map %search-load-path '("ice-9/boot-9.scm" "ice-9/common-list.scm" "ice-9/format.scm" "ice-9/optargs.scm" "ice-9/session.scm" "ice-9/getopt-long.scm" "ice-9/psyntax.pp"))) (define (load-file-with-reader file-name reader buffering) (with-input-from-file file-name (lambda () (apply setvbuf (current-input-port) buffering) (let loop ((sexp (reader))) (if (eof-object? sexp) #t (loop (reader))))))) (define (exercise-read buffering) (for-each (lambda (file) (load-file-with-reader file read buffering)) %files-to-load)) (with-benchmark-prefix "read" (benchmark "_IONBF" 5 ;; this one is very slow (exercise-read (list _IONBF))) (benchmark "_IOLBF" 100 (exercise-read (list _IOLBF))) (benchmark "_IOFBF 4096" 100 (exercise-read (list _IOFBF 4096))) (benchmark "_IOFBF 8192" 100 (exercise-read (list _IOFBF 8192))) (benchmark "_IOFBF 16384" 100 (exercise-read (list _IOFBF 16384)))) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/subr.bm000066400000000000000000000044371155472604000227410ustar00rootroot00000000000000;;; subr.bm --- Measure the subr invocation cost. -*- Scheme -*- ;;; ;;; Copyright (C) 2009 Free Software Foundation, Inc. ;;; ;;; This program is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this software; see the file COPYING. If not, write to ;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;; Boston, MA 02110-1301 USA (define-module (benchmarks subrs) :use-module (benchmark-suite lib)) (define hook1 (make-hook 1)) (define hook3 (make-hook 3)) (with-benchmark-prefix "subr invocation" (benchmark "simple subr" 700000 ;; 1 required argument, 0 optional arguments, no rest. (1+ 0)) (benchmark "generic subr" 700000 ;; 2 required arguments, 4 optional arguments, no rest. ;; In Guile 1.8 and earlier, such subrs are implemented as "compiled ;; closures" (cclos). There, when a cclo/gsubr is called, the evaluator ;; goes through `SCM_APPLY ()' and conses the arguments, which is more ;; costly than the invocation of a "simple subr". (string= "foo" "bar")) (benchmark "generic subr with rest arg" 700000 ;; 1 required argument, 0 optional arguments, 1 rest. (run-hook hook1 1)) (benchmark "generic subr with rest arg and 3+ parameters" 700000 ;; 1 required argument, 0 optional arguments, 1 rest. ;; The evaluator considers calls with 3 and more parameters as a general ;; form and always stores the arguments into a list. (run-hook hook3 1 2 3))) (with-benchmark-prefix "subr application" (benchmark "simple subr" 700000 (apply 1+ '(0))) (benchmark "generic subr" 700000 (apply string= "foo" '("bar"))) (benchmark "generic subr with rest arg" 700000 (apply run-hook hook1 '(1))) (benchmark "generic subr with rest arg and 3+ parameters" 700000 (run-hook hook3 1 2 '(3)))) guile-1.8-1.8.8+1.orig/benchmark-suite/benchmarks/uniform-vector-read.bm000066400000000000000000000032001155472604000256410ustar00rootroot00000000000000;;; uniform-vector-read.bm --- Exercise binary I/O primitives. -*- Scheme -*- ;;; ;;; Copyright (C) 2008 Free Software Foundation, Inc. ;;; ;;; This program is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this software; see the file COPYING. If not, write to ;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;; Boston, MA 02110-1301 USA (define-module (benchmarks uniform-vector-read) :use-module (benchmark-suite lib) :use-module (srfi srfi-4)) (define file-name (tmpnam)) (define %buffer-size 7777) (define buf (make-u8vector %buffer-size)) (define str (make-string %buffer-size)) (with-benchmark-prefix "uniform-vector-read!" (benchmark "uniform-vector-write" 500 (let ((output (open-output-file file-name))) (uniform-vector-write buf output) (close output))) (benchmark "uniform-vector-read!" 500 (let ((input (open-input-file file-name))) (setvbuf input _IONBF) (uniform-vector-read! buf input) (close input))) (benchmark "string port" 5000 (let ((input (open-input-string str))) (uniform-vector-read! buf input) (close input)))) guile-1.8-1.8.8+1.orig/benchmark-suite/guile-benchmark000077500000000000000000000164511155472604000223130ustar00rootroot00000000000000#!../libguile/guile \ -e main -s !# ;;;; guile-benchmark --- run the Guile benchmark suite ;;;; Adapted from code by Jim Blandy --- May 1999 ;;;; ;;;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. ;;;; ;;;; This program is free software; you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by ;;;; the Free Software Foundation; either version 2, or (at your option) ;;;; any later version. ;;;; ;;;; This program is distributed in the hope that it will be useful, ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;;; GNU General Public License for more details. ;;;; ;;;; You should have received a copy of the GNU General Public License ;;;; along with this software; see the file COPYING. If not, write to ;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;;; Boston, MA 02110-1301 USA ;;;; Usage: [guile -e main -s] guile-benchmark [OPTIONS] [BENCHMARK ...] ;;;; ;;;; Run benchmarks from the Guile benchmark suite. Report timing ;;;; results to the standard output, along with a summary of all ;;;; the results. Record each reported benchmark outcome in the log ;;;; file, `benchmarks.log'. ;;;; ;;;; Normally, guile-benchmark scans the benchmark directory, and ;;;; executes all files whose names end in `.bm'. (It assumes they contain ;;;; Scheme code.) However, you can have it execute specific benchmarks by ;;;; listing their filenames on the command line. ;;;; ;;;; The option `--benchmark-suite' can be given to specify the benchmark ;;;; directory. If no such option is given, the benchmark directory is ;;;; taken from the environment variable BENCHMARK_SUITE_DIR (if defined), ;;;; otherwise a default directory that is hardcoded in this file is ;;;; used (see "Installation" below). ;;;; ;;;; If present, the `--iteration-factor FACTOR' option tells ;;;; `guile-benchmark' to multiply the number of iterations given with ;;;; each single benchmark by the value of FACTOR. This allows to ;;;; reduce or increase the total time for benchmarking. ;;;; ;;;; If present, the `--log-file LOG' option tells `guile-benchmark' to put ;;;; the log output in a file named LOG. ;;;; ;;;; If present, the `--debug' option will enable a debugging mode. ;;;; ;;;; ;;;; Installation: ;;;; ;;;; If you change the #! line at the top of this script to point at ;;;; the Guile interpreter you want to run, you can call this script ;;;; as an executable instead of having to pass it as a parameter to ;;;; guile via "guile -e main -s guile-benchmark". Further, you can edit ;;;; the definition of default-benchmark-suite to point to the parent ;;;; directory of the `benchmarks' tree, which makes it unnecessary to set ;;;; the environment variable `BENCHMARK_SUITE_DIR'. ;;;; ;;;; ;;;; Shortcomings: ;;;; ;;;; At the moment, due to a simple-minded implementation, benchmark files ;;;; must live in the benchmark directory, and you must specify their names ;;;; relative to the top of the benchmark directory. If you want to send ;;;; me a patch that fixes this, but still leaves sane benchmark names in ;;;; the log file, that would be great. At the moment, all the benchmarks ;;;; I care about are in the benchmark directory, though. ;;;; ;;;; It would be nice if you could specify the Guile interpreter you ;;;; want to benchmark on the command line. As it stands, if you want to ;;;; change which Guile interpreter you're benchmarking, you need to edit ;;;; the #! line at the top of this file, which is stupid. ;;; User configurable settings: (define default-benchmark-suite (string-append (getenv "HOME") "/bogus-path/benchmark-suite")) (use-modules (benchmark-suite lib) (ice-9 getopt-long) (ice-9 and-let-star) (ice-9 rdelim)) ;;; Variables that will receive their actual values later. (define benchmark-suite default-benchmark-suite) (define tmp-dir #f) ;;; General utilities, that probably should be in a library somewhere. ;;; Enable debugging (define (enable-debug-mode) (write-line %load-path) (set! %load-verbosely #t) (debug-enable 'backtrace 'debug)) ;;; Traverse the directory tree at ROOT, applying F to the name of ;;; each file in the tree, including ROOT itself. For a subdirectory ;;; SUB, if (F SUB) is true, we recurse into SUB. Do not follow ;;; symlinks. (define (for-each-file f root) ;; A "hard directory" is a path that denotes a directory and is not a ;; symlink. (define (file-is-hard-directory? filename) (eq? (stat:type (lstat filename)) 'directory)) (let visit ((root root)) (let ((should-recur (f root))) (if (and should-recur (file-is-hard-directory? root)) (let ((dir (opendir root))) (let loop () (let ((entry (readdir dir))) (cond ((eof-object? entry) #f) ((or (string=? entry ".") (string=? entry "..") (string=? entry "CVS") (string=? entry "RCS")) (loop)) (else (visit (string-append root "/" entry)) (loop)))))))))) ;;; The benchmark driver. ;;; Localizing benchmark files and temporary data files. (define (data-file-name filename) (in-vicinity tmp-dir filename)) (define (benchmark-file-name benchmark) (in-vicinity benchmark-suite benchmark)) ;;; Return a list of all the benchmark files in the benchmark tree. (define (enumerate-benchmarks benchmark-dir) (let ((root-len (+ 1 (string-length benchmark-dir))) (benchmarks '())) (for-each-file (lambda (file) (if (has-suffix? file ".bm") (let ((short-name (substring file root-len))) (set! benchmarks (cons short-name benchmarks)))) #t) benchmark-dir) ;; for-each-file presents the files in whatever order it finds ;; them in the directory. We sort them here, so they'll always ;; appear in the same order. This makes it easier to compare benchmark ;; log files mechanically. (sort benchmarks stringnumber (opt 'iteration-factor "1"))) ;; directory where temporary files are created. (set! tmp-dir (getcwd)) (let* ((benchmarks (let ((foo (opt '() '()))) (if (null? foo) (enumerate-benchmarks benchmark-suite) foo))) (log-file (opt 'log-file "benchmarks.log"))) ;; Open the log file. (let ((log-port (open-output-file log-file))) ;; Register some reporters. (register-reporter (make-log-reporter log-port)) (register-reporter user-reporter) ;; Run the benchmarks. (for-each (lambda (benchmark) (with-benchmark-prefix benchmark (load (benchmark-file-name benchmark)))) benchmarks) (close-port log-port))))) ;;; Local Variables: ;;; mode: scheme ;;; End: guile-1.8-1.8.8+1.orig/benchmark-suite/lib.scm000066400000000000000000000536511155472604000206050ustar00rootroot00000000000000;;;; benchmark-suite/lib.scm --- generic support for benchmarking ;;;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. ;;;; ;;;; This program is free software; you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by ;;;; the Free Software Foundation; either version 2, or (at your option) ;;;; any later version. ;;;; ;;;; This program is distributed in the hope that it will be useful, ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;;; GNU General Public License for more details. ;;;; ;;;; You should have received a copy of the GNU General Public License ;;;; along with this software; see the file COPYING. If not, write to ;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;;; Boston, MA 02110-1301 USA (define-module (benchmark-suite lib) :export ( ;; Controlling the execution. iteration-factor scale-iterations ;; Running benchmarks. run-benchmark benchmark ;; Naming groups of benchmarks in a regular fashion. with-benchmark-prefix with-benchmark-prefix* current-benchmark-prefix format-benchmark-name ;; Computing timing results benchmark-time-base benchmark-total-time benchmark-user-time benchmark-system-time benchmark-frame-time benchmark-core-time benchmark-user-time\interpreter benchmark-core-time\interpreter ;; Reporting results in various ways. register-reporter unregister-reporter reporter-registered? make-log-reporter full-reporter user-reporter)) ;;;; If you're using Emacs's Scheme mode: ;;;; (put 'with-benchmark-prefix 'scheme-indent-function 1) ;;;; (put 'benchmark 'scheme-indent-function 1) ;;;; CORE FUNCTIONS ;;;; ;;;; The function (run-benchmark name iterations thunk) is the heart of the ;;;; benchmarking environment. The first parameter NAME is a unique name for ;;;; the benchmark to be executed (for an explanation of this parameter see ;;;; below under ;;;; NAMES. The second parameter ITERATIONS is a positive ;;;; integer value that indicates how often the thunk shall be executed (for ;;;; an explanation of how iteration counts should be used, see below under ;;;; ;;;; ITERATION COUNTS). For example: ;;;; ;;;; (run-benchmark "small integer addition" 100000 (lambda () (+ 1 1))) ;;;; ;;;; This will run the function (lambda () (+ 1 1)) a 100000 times (the ;;;; iteration count can, however be scaled. See below for details). Some ;;;; different time data for running the thunk for the given number of ;;;; iterations is measured and reported. ;;;; ;;;; Convenience macro ;;;; ;;;; * (benchmark name iterations body) is a short form for ;;;; (run-benchmark name iterations (lambda () body)) ;;;; NAMES ;;;; ;;;; Every benchmark in the benchmark suite has a unique name to be able to ;;;; compare the results of individual benchmarks across several runs of the ;;;; benchmark suite. ;;;; ;;;; A benchmark name is a list of printable objects. For example: ;;;; ("ports.scm" "file" "read and write back list of strings") ;;;; ("ports.scm" "pipe" "read") ;;;; ;;;; Benchmark names may contain arbitrary objects, but they always have ;;;; the following properties: ;;;; - Benchmark names can be compared with EQUAL?. ;;;; - Benchmark names can be reliably stored and retrieved with the standard ;;;; WRITE and READ procedures; doing so preserves their identity. ;;;; ;;;; For example: ;;;; ;;;; (benchmark "simple addition" 100000 (+ 2 2)) ;;;; ;;;; In that case, the benchmark name is the list ("simple addition"). ;;;; ;;;; The WITH-BENCHMARK-PREFIX syntax and WITH-BENCHMARK-PREFIX* procedure ;;;; establish a prefix for the names of all benchmarks whose results are ;;;; reported within their dynamic scope. For example: ;;;; ;;;; (begin ;;;; (with-benchmark-prefix "basic arithmetic" ;;;; (benchmark "addition" 100000 (+ 2 2)) ;;;; (benchmark "subtraction" 100000 (- 4 2))) ;;;; (benchmark "multiplication" 100000 (* 2 2)))) ;;;; ;;;; In that example, the three benchmark names are: ;;;; ("basic arithmetic" "addition"), ;;;; ("basic arithmetic" "subtraction"), and ;;;; ("multiplication"). ;;;; ;;;; WITH-BENCHMARK-PREFIX can be nested. Each WITH-BENCHMARK-PREFIX ;;;; postpends a new element to the current prefix: ;;;; ;;;; (with-benchmark-prefix "arithmetic" ;;;; (with-benchmark-prefix "addition" ;;;; (benchmark "integer" 100000 (+ 2 2)) ;;;; (benchmark "complex" 100000 (+ 2+3i 4+5i))) ;;;; (with-benchmark-prefix "subtraction" ;;;; (benchmark "integer" 100000 (- 2 2)) ;;;; (benchmark "complex" 100000 (- 2+3i 1+2i)))) ;;;; ;;;; The four benchmark names here are: ;;;; ("arithmetic" "addition" "integer") ;;;; ("arithmetic" "addition" "complex") ;;;; ("arithmetic" "subtraction" "integer") ;;;; ("arithmetic" "subtraction" "complex") ;;;; ;;;; To print a name for a human reader, we DISPLAY its elements, ;;;; separated by ": ". So, the last set of benchmark names would be ;;;; reported as: ;;;; ;;;; arithmetic: addition: integer ;;;; arithmetic: addition: complex ;;;; arithmetic: subtraction: integer ;;;; arithmetic: subtraction: complex ;;;; ;;;; The Guile benchmarks use with-benchmark-prefix to include the name of ;;;; the source file containing the benchmark in the benchmark name, to ;;;; provide each file with its own namespace. ;;;; ITERATION COUNTS ;;;; ;;;; Every benchmark has to be given an iteration count that indicates how ;;;; often it should be executed. The reason is, that in most cases a single ;;;; execution of the benchmark code would not deliver usable timing results: ;;;; The resolution of the system time is not arbitrarily fine. Thus, some ;;;; benchmarks would be executed too quickly to be measured at all. A rule ;;;; of thumb is, that the longer a benchmark runs, the more exact is the ;;;; information about the execution time. ;;;; ;;;; However, execution time depends on several influences: First, the ;;;; machine you are running the benchmark on. Second, the compiler you use. ;;;; Third, which compiler options you use. Fourth, which version of guile ;;;; you are using. Fifth, which guile options you are using (for example if ;;;; you are using the debugging evaluator or not). There are even more ;;;; influences. ;;;; ;;;; For this reason, the same number of iterations for a single benchmark may ;;;; lead to completely different execution times in different ;;;; constellations. For someone working on a slow machine, the default ;;;; execution counts may lead to an inacceptable execution time of the ;;;; benchmark suite. For someone on a very fast machine, however, it may be ;;;; desireable to increase the number of iterations in order to increase the ;;;; accuracy of the time data. ;;;; ;;;; For this reason, the benchmark suite allows to scale the number of ;;;; executions by a global factor, stored in the exported variable ;;;; iteration-factor. The default for iteration-factor is 1. A number of 2 ;;;; means, that all benchmarks are executed twice as often, which will also ;;;; roughly double the execution time for the benchmark suite. Similarly, if ;;;; iteration-factor holds a value of 0.5, only about half the execution time ;;;; will be required. ;;;; ;;;; It is probably a good idea to choose the iteration count for each ;;;; benchmark such that all benchmarks will take about the same time, for ;;;; example one second. To achieve this, the benchmark suite holds an empty ;;;; benchmark in the file 0-reference.bm named "reference benchmark for ;;;; iteration counts". It's iteration count is calibrated to make the ;;;; benchmark run about one second on Dirk's laptop :-) If you are adding ;;;; benchmarks to the suite, it would be nice if you could calibrate the ;;;; number of iterations such that each of your added benchmarks takes about ;;;; as long to run as the reference benchmark. But: Don't be too accurate ;;;; to figure out the correct iteration count. ;;;; REPORTERS ;;;; ;;;; A reporter is a function which we apply to each benchmark outcome. ;;;; Reporters can log results, print interesting results to the standard ;;;; output, collect statistics, etc. ;;;; ;;;; A reporter function takes the following arguments: NAME ITERATIONS ;;;; BEFORE AFTER GC-TIME. The argument NAME holds the name of the benchmark, ;;;; ITERATIONS holds the actual number of iterations that were performed. ;;;; BEFORE holds the result of the function (times) at the very beginning of ;;;; the excution of the benchmark, AFTER holds the result of the function ;;;; (times) after the execution of the benchmark. GC-TIME, finally, holds ;;;; the difference of calls to (gc-run-time) before and after the execution ;;;; of the benchmark. ;;;; ;;;; This library provides some standard reporters for logging results ;;;; to a file, reporting interesting results to the user, (FIXME: and ;;;; collecting totals). ;;;; ;;;; You can use the REGISTER-REPORTER function and friends to add whatever ;;;; reporting functions you like. See under ;;;; TIMING DATA to see how the ;;;; library helps you to extract relevant timing information from the values ;;;; ITERATIONS, BEFORE, AFTER and GC-TIME. If you don't register any ;;;; reporters, the library uses USER-REPORTER, which writes the most ;;;; interesting results to the standard output. ;;;; TIME CALCULATION ;;;; ;;;; The library uses the guile functions (times) and (gc-run-time) to ;;;; determine the execution time for a single benchmark. Based on these ;;;; functions, the values of BEFORE, AFTER and GC-TIME are computed, which ;;;; are then passed to the reporter functions. All three values BEFORE, ;;;; AFTER and GC-TIME include the time needed to executed the benchmark code ;;;; itself, but also the surrounding code that implements the loop to run the ;;;; benchmark code for the given number of times. This is undesirable, since ;;;; one would prefer to only get the timing data for the benchmarking code. ;;;; ;;;; To cope with this, the benchmarking framework uses a trick: During ;;;; initialization of the library, the time for executing an empty benchmark ;;;; is measured and stored. This is an estimate for the time needed by the ;;;; benchmarking framework itself. For later benchmarks, this time can then ;;;; be subtracted from the measured execution times. ;;;; ;;;; In order to simplify the time calculation for users who want to write ;;;; their own reporters, benchmarking framework provides the following ;;;; definitions: ;;;; ;;;; benchmark-time-base : This variable holds the number of time units that ;;;; make up a second. By deviding the results of each of the functions ;;;; below by this value, you get the corresponding time in seconds. For ;;;; example (/ (benchmark-total-time before after) benchmark-time-base) ;;;; will give you the total time in seconds. ;;;; benchmark-total-time : this function takes two arguments BEFORE and AFTER ;;;; and computes the total time between the two timestamps. The result ;;;; of this function is what the time command of the unix command line ;;;; would report as real time. ;;;; benchmark-user-time : this function takes two arguments BEFORE and AFTER ;;;; and computes the time spent in the benchmarking process between the ;;;; two timestamps. That means, the time consumed by other processes ;;;; running on the same machine is not part of the resulting time, ;;;; neither is time spent within the operating system. The result of ;;;; this function is what the time command of the unix command line would ;;;; report as user time. ;;;; benchmark-system-time : similar to benchmark-user-time, but here the time ;;;; spent within the operating system is given. The result of this ;;;; function is what the time command of the unix command line would ;;;; report as system time. ;;;; benchmark-frame-time : this function takes the argument ITERATIONS. It ;;;; reports the part of the user time that is consumed by the ;;;; benchmarking framework itself to run some benchmark for the given ;;;; number of iterations. You can think of this as the time that would ;;;; still be consumed, even if the benchmarking code itself was empty. ;;;; This value does not include any time for garbage collection, even if ;;;; it is the benchmarking framework which is responsible for causing a ;;;; garbage collection. ;;;; benchmark-core-time : this function takes three arguments ITERATIONS, ;;;; BEFORE and AFTER. It reports the part of the user time that is ;;;; actually spent within the benchmarking code. That is, the time ;;;; needed for the benchmarking framework is subtracted from the user ;;;; time. This value, however, includes all garbage collection times, ;;;; even if some part of the gc-time had actually to be attributed to the ;;;; benchmarking framework. ;;;; benchmark-user-time\interpreter : this function takes three arguments ;;;; BEFORE AFTER and GC-TIME. It reports the part of the user time that ;;;; is spent in the interpreter (and not in garbage collection). ;;;; benchmark-core-time\interpreter : this function takes four arguments ;;;; ITERATIONS, BEFORE, AFTER. and GC-TIME. It reports the part of the ;;;; benchmark-core-time that is spent in the interpreter (and not in ;;;; garbage collection). This value is most probably the one you are ;;;; interested in, except if you are doing some garbage collection ;;;; checks. ;;;; ;;;; There is no function to calculate the garbage-collection time, since the ;;;; garbage collection time is already passed as an argument GC-TIME to the ;;;; reporter functions. ;;;; MISCELLANEOUS ;;;; ;;; Perform a division and convert the result to inexact. (define (i/ a b) (exact->inexact (/ a b))) ;;; Scale the number of iterations according to the given scaling factor. (define iteration-factor 1) (define (scale-iterations iterations) (let* ((i (inexact->exact (round (* iterations iteration-factor))))) (if (< i 1) 1 i))) ;;;; CORE FUNCTIONS ;;;; ;;; The central routine for executing benchmarks. ;;; The idea is taken from Greg, the GNUstep regression test environment. (define run-benchmark #f) (let ((benchmark-running #f)) (define (local-run-benchmark name iterations thunk) (if benchmark-running (error "Nested calls to run-benchmark are not permitted.") (let ((benchmark-name (full-name name)) (iterations (scale-iterations iterations))) (set! benchmark-running #t) (let ((before #f) (after #f) (gc-time #f)) (gc) (set! gc-time (gc-run-time)) (set! before (times)) (do ((i 0 (+ i 1))) ((= i iterations)) (thunk)) (set! after (times)) (set! gc-time (- (gc-run-time) gc-time)) (report benchmark-name iterations before after gc-time)) (set! benchmark-running #f)))) (set! run-benchmark local-run-benchmark)) ;;; A short form for benchmarks. (defmacro benchmark (name iterations body . rest) `(,run-benchmark ,name ,iterations (lambda () ,body ,@rest))) ;;;; BENCHMARK NAMES ;;;; ;;;; Turn a benchmark name into a nice human-readable string. (define (format-benchmark-name name) (call-with-output-string (lambda (port) (let loop ((name name) (separator "")) (if (pair? name) (begin (display separator port) (display (car name) port) (loop (cdr name) ": "))))))) ;;;; For a given benchmark-name, deliver the full name including all prefixes. (define (full-name name) (append (current-benchmark-prefix) (list name))) ;;; A fluid containing the current benchmark prefix, as a list. (define prefix-fluid (make-fluid)) (fluid-set! prefix-fluid '()) (define (current-benchmark-prefix) (fluid-ref prefix-fluid)) ;;; Postpend PREFIX to the current name prefix while evaluting THUNK. ;;; The name prefix is only changed within the dynamic scope of the ;;; call to with-benchmark-prefix*. Return the value returned by THUNK. (define (with-benchmark-prefix* prefix thunk) (with-fluids ((prefix-fluid (append (fluid-ref prefix-fluid) (list prefix)))) (thunk))) ;;; (with-benchmark-prefix PREFIX BODY ...) ;;; Postpend PREFIX to the current name prefix while evaluating BODY ... ;;; The name prefix is only changed within the dynamic scope of the ;;; with-benchmark-prefix expression. Return the value returned by the last ;;; BODY expression. (defmacro with-benchmark-prefix (prefix . body) `(with-benchmark-prefix* ,prefix (lambda () ,@body))) ;;;; TIME CALCULATION ;;;; (define benchmark-time-base internal-time-units-per-second) (define time-base ;; short-cut, not exported benchmark-time-base) (define frame-time/iteration "") (define (benchmark-total-time before after) (- (tms:clock after) (tms:clock before))) (define (benchmark-user-time before after) (- (tms:utime after) (tms:utime before))) (define (benchmark-system-time before after) (- (tms:stime after) (tms:stime before))) (define (benchmark-frame-time iterations) (* iterations frame-time/iteration)) (define (benchmark-core-time iterations before after) (- (benchmark-user-time before after) (benchmark-frame-time iterations))) (define (benchmark-user-time\interpreter before after gc-time) (- (benchmark-user-time before after) gc-time)) (define (benchmark-core-time\interpreter iterations before after gc-time) (- (benchmark-core-time iterations before after) gc-time)) ;;;; REPORTERS ;;;; ;;; The global list of reporters. (define reporters '()) ;;; The default reporter, to be used only if no others exist. (define default-reporter #f) ;;; Add the procedure REPORTER to the current set of reporter functions. ;;; Signal an error if that reporter procedure object is already registered. (define (register-reporter reporter) (if (memq reporter reporters) (error "register-reporter: reporter already registered: " reporter)) (set! reporters (cons reporter reporters))) ;;; Remove the procedure REPORTER from the current set of reporter ;;; functions. Signal an error if REPORTER is not currently registered. (define (unregister-reporter reporter) (if (memq reporter reporters) (set! reporters (delq! reporter reporters)) (error "unregister-reporter: reporter not registered: " reporter))) ;;; Return true iff REPORTER is in the current set of reporter functions. (define (reporter-registered? reporter) (if (memq reporter reporters) #t #f)) ;;; Send RESULT to all currently registered reporter functions. (define (report . args) (if (pair? reporters) (for-each (lambda (reporter) (apply reporter args)) reporters) (apply default-reporter args))) ;;;; Some useful standard reporters: ;;;; Log reporters write all benchmark results to a given log file. ;;;; Full reporters write all benchmark results to the standard output. ;;;; User reporters write some interesting results to the standard output. ;;; Display a single benchmark result to the given port (define (print-result port name iterations before after gc-time) (let* ((name (format-benchmark-name name)) (total-time (benchmark-total-time before after)) (user-time (benchmark-user-time before after)) (system-time (benchmark-system-time before after)) (frame-time (benchmark-frame-time iterations)) (benchmark-time (benchmark-core-time iterations before after)) (user-time\interpreter (benchmark-user-time\interpreter before after gc-time)) (benchmark-core-time\interpreter (benchmark-core-time\interpreter iterations before after gc-time))) (write (list name iterations 'total (i/ total-time time-base) 'user (i/ user-time time-base) 'system (i/ system-time time-base) 'frame (i/ frame-time time-base) 'benchmark (i/ benchmark-time time-base) 'user/interp (i/ user-time\interpreter time-base) 'bench/interp (i/ benchmark-core-time\interpreter time-base) 'gc (i/ gc-time time-base)) port) (newline port))) ;;; Return a reporter procedure which prints all results to the file ;;; FILE, in human-readable form. FILE may be a filename, or a port. (define (make-log-reporter file) (let ((port (if (output-port? file) file (open-output-file file)))) (lambda args (apply print-result port args) (force-output port)))) ;;; A reporter that reports all results to the user. (define (full-reporter . args) (apply print-result (current-output-port) args)) ;;; Display interesting results of a single benchmark to the given port (define (print-user-result port name iterations before after gc-time) (let* ((name (format-benchmark-name name)) (user-time (benchmark-user-time before after)) (benchmark-time (benchmark-core-time iterations before after)) (benchmark-core-time\interpreter (benchmark-core-time\interpreter iterations before after gc-time))) (write (list name iterations 'user (i/ user-time time-base) 'benchmark (i/ benchmark-time time-base) 'bench/interp (i/ benchmark-core-time\interpreter time-base) 'gc (i/ gc-time time-base)) port) (newline port))) ;;; A reporter that reports interesting results to the user. (define (user-reporter . args) (apply print-user-result (current-output-port) args)) ;;;; Initialize the benchmarking system: ;;;; ;;; First, display version information (display ";; running guile version " (current-output-port)) (display (version) (current-output-port)) (newline (current-output-port)) ;;; Second, make sure the benchmarking routines are compiled. (define (null-reporter . args) #t) (set! default-reporter null-reporter) (benchmark "empty initialization benchmark" 2 #t) ;;; Third, initialize the system constants (display ";; calibrating the benchmarking framework..." (current-output-port)) (newline (current-output-port)) (define (initialization-reporter name iterations before after gc-time) (let* ((frame-time (- (tms:utime after) (tms:utime before) gc-time 3))) (set! frame-time/iteration (/ frame-time iterations)) (display ";; framework time per iteration: " (current-output-port)) (display (i/ frame-time/iteration time-base) (current-output-port)) (newline (current-output-port)))) (set! default-reporter initialization-reporter) (benchmark "empty initialization benchmark" 524288 #t) ;;; Finally, set the default reporter (set! default-reporter user-reporter) guile-1.8-1.8.8+1.orig/build-aux/000077500000000000000000000000001155472604000161325ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/build-aux/config.rpath000077500000000000000000000436271155472604000204560ustar00rootroot00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2008 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < not found. See README.])]) AC_CHECK_PROG(have_makeinfo, makeinfo, yes, no) AM_CONDITIONAL(HAVE_MAKEINFO, test "$have_makeinfo" = yes) AM_PATH_LISPDIR #-------------------------------------------------------------------- # # User options (after above tests that may set default CFLAGS etc.) # #-------------------------------------------------------------------- GUILE_ERROR_ON_WARNING="yes" AC_ARG_ENABLE(error-on-warning, [ --enable-error-on-warning treat compile warnings as errors], [case "${enableval}" in yes | y) GUILE_ERROR_ON_WARNING="yes" ;; no | n) GUILE_ERROR_ON_WARNING="no" ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-error-on-warning) ;; esac]) SCM_I_GSC_GUILE_DEBUG_FREELIST=0 AC_ARG_ENABLE(debug-freelist, [ --enable-debug-freelist include garbage collector freelist debugging code], if test "$enable_debug_freelist" = y \ || test "$enable_debug_freelist" = yes; then SCM_I_GSC_GUILE_DEBUG_FREELIST=1 fi) AC_ARG_ENABLE(debug-malloc, [ --enable-debug-malloc include malloc debugging code], if test "$enable_debug_malloc" = y || test "$enable_debug_malloc" = yes; then AC_DEFINE(GUILE_DEBUG_MALLOC, 1, [Define this if you want to debug scm_must_malloc/realloc/free calls.]) fi) SCM_I_GSC_GUILE_DEBUG=0 AC_ARG_ENABLE(guile-debug, [AS_HELP_STRING([--enable-guile-debug], [include internal debugging functions])], if test "$enable_guile_debug" = y || test "$enable_guile_debug" = yes; then SCM_I_GSC_GUILE_DEBUG=1 fi) AC_ARG_ENABLE(posix, [ --disable-posix omit posix interfaces],, enable_posix=yes) AC_ARG_ENABLE(networking, [ --disable-networking omit networking interfaces],, enable_networking=yes) AC_ARG_ENABLE(regex, [ --disable-regex omit regular expression interfaces],, enable_regex=yes) AC_ARG_ENABLE([discouraged], AS_HELP_STRING([--disable-discouraged],[omit discouraged features])) if test "$enable_discouraged" = no; then SCM_I_GSC_ENABLE_DISCOURAGED=0 else SCM_I_GSC_ENABLE_DISCOURAGED=1 fi AC_ARG_ENABLE([deprecated], AS_HELP_STRING([--disable-deprecated],[omit deprecated features])) if test "$enable_deprecated" = no; then SCM_I_GSC_ENABLE_DEPRECATED=0 warn_default=no else if test "$enable_deprecated" = yes || test "$enable_deprecated" = ""; then warn_default=summary elif test "$enable_deprecated" = shutup; then warn_default=no else warn_default=$enable_deprecated fi SCM_I_GSC_ENABLE_DEPRECATED=1 fi AC_DEFINE_UNQUOTED(SCM_WARN_DEPRECATED_DEFAULT, "$warn_default", [Define this to control the default warning level for deprecated features.]) AC_ARG_ENABLE(elisp, [ --disable-elisp omit Emacs Lisp support],, enable_elisp=yes) dnl Added the following configure option in January 2008 following dnl investigation of problems with "64" system and library calls on dnl Darwin (MacOS X). The libguile code (_scm.h) assumes that if a dnl system has stat64, it will have all the other 64 APIs too; but on dnl Darwin, stat64 is there but other APIs are missing. dnl dnl It also appears, from the Darwin docs, that most system call APIs dnl there (i.e. the traditional ones _without_ "64" in their names) have dnl been 64-bit-capable for a long time now, so it isn't necessary to dnl use "64" versions anyway. For example, Darwin's off_t is 64-bit. dnl dnl A similar problem has been reported for HP-UX: dnl http://www.nabble.com/Building-guile-1.8.2-on-hpux-td13106681.html dnl dnl Therefore, and also because a Guile without LARGEFILE64 support is dnl better than no Guile at all, we provide this option to suppress dnl trying to use "64" calls. dnl dnl It may be that for some 64-bit function on Darwin/HP-UX we do need dnl to use a "64" call, and hence that by using --without-64-calls we're dnl missing out on that. If so, someone can work on that in the future. dnl For now, --without-64-calls allows Guile to build on OSs where it dnl wasn't building before. AC_MSG_CHECKING([whether to use system and library "64" calls]) AC_ARG_WITH([64-calls], AS_HELP_STRING([--without-64-calls], [don't attempt to use system and library calls with "64" in their names]), [use_64_calls=$withval], [use_64_calls=yes case $host in *-apple-darwin* ) use_64_calls=no ;; powerpc-ibm-aix* ) use_64_calls=no ;; esac]) AC_MSG_RESULT($use_64_calls) case "$use_64_calls" in y* ) AC_DEFINE(GUILE_USE_64_CALLS, 1, [Define to 1 in order to try to use "64" versions of system and library calls.]) ;; esac AC_MSG_CHECKING([whether the compiler defaults to IEEE floating point behavior]) # The following snippet was taken from Gnulib's `fpieee'. See also the definition # of `guile_NaN' in `numbers.c'. # IEEE behaviour is the default on all CPUs except Alpha and SH # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4 # and the GCC 4.1.2 manual). case "$host_cpu" in alpha*) # On Alpha systems, a compiler option provides the behaviour. # See the ieee(3) manual page, also available at # AC_MSG_RESULT([no]) if test -n "$GCC"; then # GCC has the option -mieee. CPPFLAGS="$CPPFLAGS -mieee" else # Compaq (ex-DEC) C has the option -ieee. CPPFLAGS="$CPPFLAGS -ieee" fi ;; sh*) AC_MSG_RESULT([no]) if test -n "$GCC"; then # GCC has the option -mieee. CPPFLAGS="$CPPFLAGS -mieee" fi ;; *) AC_MSG_RESULT([yes]) ;; esac #-------------------------------------------------------------------- dnl Check for dynamic linking use_modules=yes AC_ARG_WITH(modules, [ --with-modules[=FILES] Add support for dynamic modules], use_modules="$withval") test -z "$use_modules" && use_modules=yes DLPREOPEN= if test "$use_modules" != no; then if test "$use_modules" = yes; then DLPREOPEN="-dlpreopen force" else DLPREOPEN="-export-dynamic" for module in $use_modules; do DLPREOPEN="$DLPREOPEN -dlopen $module" done fi fi dnl files which are destined for separate modules. if test "$use_modules" != no; then AC_LIBOBJ([dynl]) fi if test "$enable_posix" = yes; then AC_LIBOBJ([filesys]) AC_LIBOBJ([posix]) AC_DEFINE(HAVE_POSIX, 1, [Define this if you want support for POSIX system calls in Guile.]) fi if test "$enable_networking" = yes; then AC_LIBOBJ([net_db]) AC_LIBOBJ([socket]) AC_DEFINE(HAVE_NETWORKING, 1, [Define this if you want support for networking in Guile.]) fi if test "$enable_debug_malloc" = yes; then AC_LIBOBJ([debug-malloc]) fi if test "$enable_elisp" = yes; then SCM_I_GSC_ENABLE_ELISP=1 else SCM_I_GSC_ENABLE_ELISP=0 fi AC_CHECK_LIB(uca, __uc_get_ar_bsp) AC_C_CONST # "volatile" is used in a couple of tests below. AC_C_VOLATILE AC_C_INLINE if test "$ac_cv_c_inline" != no; then SCM_I_GSC_C_INLINE="\"${ac_cv_c_inline}\"" else SCM_I_GSC_C_INLINE=NULL fi AC_CHECK_LIB(uca, __uc_get_ar_bsp) AC_C_BIGENDIAN AC_CHECK_SIZEOF(char) AC_CHECK_SIZEOF(unsigned char) AC_CHECK_SIZEOF(short) AC_CHECK_SIZEOF(unsigned short) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(unsigned int) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(unsigned long) AC_CHECK_SIZEOF(size_t) AC_CHECK_SIZEOF(long long) AC_CHECK_SIZEOF(unsigned long long) AC_CHECK_SIZEOF(__int64) AC_CHECK_SIZEOF(unsigned __int64) AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(intptr_t) AC_CHECK_SIZEOF(uintptr_t) AC_CHECK_SIZEOF(ptrdiff_t) AC_CHECK_SIZEOF(size_t) AC_CHECK_SIZEOF(off_t) if test "$ac_cv_sizeof_long" -ne "$ac_cv_sizeof_void_p"; then AC_MSG_ERROR(sizes of long and void* are not identical) fi if test "$ac_cv_sizeof_ptrdiff_t" -ne 0; then SCM_I_GSC_T_PTRDIFF='"ptrdiff_t"' else SCM_I_GSC_T_PTRDIFF='"long"' fi AC_SUBST([SCM_I_GSC_T_PTRDIFF]) AC_CHECK_HEADERS([stdint.h]) AC_CHECK_HEADERS([inttypes.h]) AC_CHECK_SIZEOF(intmax_t) SCM_I_GSC_NEEDS_STDINT_H=0 SCM_I_GSC_NEEDS_INTTYPES_H=0 ### intptr and uintptr (try not to use inttypes if we don't have to) if test "$ac_cv_header_inttypes_h" = yes; then if test "$ac_cv_sizeof_intptr_t" -eq 0; then AC_CHECK_SIZEOF([intptr_t],,[#include #include ]) if test "$ac_cv_sizeof_intptr_t" -ne 0; then SCM_I_GSC_NEEDS_INTTYPES_H=1 fi fi if test "$ac_cv_sizeof_uintptr_t" -eq 0; then AC_CHECK_SIZEOF([uintptr_t],,[#include #include ]) if test "$ac_cv_sizeof_uintptr_t" -ne 0; then SCM_I_GSC_NEEDS_INTTYPES_H=1 fi fi fi ### See what's provided by stdint.h if test "$ac_cv_header_stdint_h" = yes; then AC_CHECK_TYPE([int8_t],[scm_stdint_has_int8=1],,[#include ]) AC_CHECK_TYPE([uint8_t],[scm_stdint_has_uint8=1],,[#include ]) AC_CHECK_TYPE([int16_t],[scm_stdint_has_int16=1],,[#include ]) AC_CHECK_TYPE([uint16_t],[scm_stdint_has_uint16=1],,[#include ]) AC_CHECK_TYPE([int32_t],[scm_stdint_has_int32=1],,[#include ]) AC_CHECK_TYPE([uint32_t],[scm_stdint_has_uint32=1],,[#include ]) AC_CHECK_TYPE([int64_t],[scm_stdint_has_int64=1],,[#include ]) AC_CHECK_TYPE([uint64_t],[scm_stdint_has_uint64=1],,[#include ]) AC_CHECK_TYPE([intmax_t],[scm_stdint_has_intmax=1],,[#include ]) AC_CHECK_TYPE([uintmax_t],[scm_stdint_has_uintmax=1],,[#include ]) fi # so we don't get confused by the cache (wish there was a better way # to check particular headers for the same type...) unset ac_cv_type_int8_t unset ac_cv_type_uint8_t unset ac_cv_type_int16_t unset ac_cv_type_uint16_t unset ac_cv_type_int32_t unset ac_cv_type_uint32_t unset ac_cv_type_int64_t unset ac_cv_type_uint64_t unset ac_cv_type_intmax_t unset ac_cv_type_uintmax_t ### See what's provided by inttypes.h if test "$ac_cv_header_inttypes_h" = yes; then AC_CHECK_TYPE([int8_t],[scm_inttypes_has_int8=1],,[#include ]) AC_CHECK_TYPE([uint8_t],[scm_inttypes_has_uint8=1],,[#include ]) AC_CHECK_TYPE([int16_t],[scm_inttypes_has_int16=1],,[#include ]) AC_CHECK_TYPE([uint16_t],[scm_inttypes_has_uint16=1],,[#include ]) AC_CHECK_TYPE([int32_t],[scm_inttypes_has_int32=1],,[#include ]) AC_CHECK_TYPE([uint32_t],[scm_inttypes_has_uint32=1],,[#include ]) AC_CHECK_TYPE([int64_t],[scm_inttypes_has_int64=1],,[#include ]) AC_CHECK_TYPE([uint64_t],[scm_inttypes_has_uint64=1],,[#include ]) AC_CHECK_TYPE([intmax_t],[scm_inttypes_has_intmax=1],,[#include ]) AC_CHECK_TYPE([uintmax_t],[scm_inttypes_has_uintmax=1],,[#include ]) fi # Try hard to find definitions for some required scm_t_*int* types. ### Required type scm_t_int8 if test "$scm_stdint_has_int8"; then SCM_I_GSC_T_INT8='"int8_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_int8"; then SCM_I_GSC_T_INT8='"int8_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_char" -eq 1; then SCM_I_GSC_T_INT8='"signed char"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_int8.]) fi AC_SUBST([SCM_I_GSC_T_INT8]) ### Required type scm_t_uint8 if test "$scm_stdint_has_uint8"; then SCM_I_GSC_T_UINT8='"uint8_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_uint8"; then SCM_I_GSC_T_UINT8='"uint8_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_unsigned_char" -eq 1; then SCM_I_GSC_T_UINT8='"unsigned char"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_uint8.]) fi AC_SUBST([SCM_I_GSC_T_UINT8]) ### Required type scm_t_int16 (ANSI C says int or short might work) if test "$scm_stdint_has_int16"; then SCM_I_GSC_T_INT16='"int16_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_int16"; then SCM_I_GSC_T_INT16='"int16_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_int" -eq 2; then SCM_I_GSC_T_INT16='"int"' elif test "$ac_cv_sizeof_short" -eq 2; then SCM_I_GSC_T_INT16='"short"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_int16.]) fi AC_SUBST([SCM_I_GSC_T_INT16]) ### Required type scm_t_uint16 (ANSI C says int or short might work) if test "$scm_stdint_has_uint16"; then SCM_I_GSC_T_UINT16='"uint16_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_uint16"; then SCM_I_GSC_T_UINT16='"uint16_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_unsigned_int" -eq 2; then SCM_I_GSC_T_UINT16='"unsigned int"' elif test "$ac_cv_sizeof_unsigned_short" -eq 2; then SCM_I_GSC_T_UINT16='"unsigned short"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_uint16.]) fi AC_SUBST([SCM_I_GSC_T_UINT16]) ### Required type scm_t_int32 (ANSI C says int, short, or long might work) if test "$scm_stdint_has_int32"; then SCM_I_GSC_T_INT32='"int32_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_int32"; then SCM_I_GSC_T_INT32='"int32_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_int" -eq 4; then SCM_I_GSC_T_INT32='"int"' elif test "$ac_cv_sizeof_long" -eq 4; then SCM_I_GSC_T_INT32='"long"' elif test "$ac_cv_sizeof_short" -eq 4; then SCM_I_GSC_T_INT32='"short"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_int32.]) fi AC_SUBST([SCM_I_GSC_T_INT32]) ### Required type scm_t_uint32 (ANSI C says int, short, or long might work) if test "$scm_stdint_has_uint32"; then SCM_I_GSC_T_UINT32='"uint32_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_uint32"; then SCM_I_GSC_T_UINT32='"uint32_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_unsigned_int" -eq 4; then SCM_I_GSC_T_UINT32='"unsigned int"' elif test "$ac_cv_sizeof_unsigned_long" -eq 4; then SCM_I_GSC_T_UINT32='"unsigned long"' elif test "$ac_cv_sizeof_unsigned_short" -eq 4; then SCM_I_GSC_T_UINT32='"unsigned short"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_uint32.]) fi AC_SUBST([SCM_I_GSC_T_UINT32]) ### Optional type scm_t_int64 (ANSI C says int, short, or long might work) ### Also try 'long long' and '__int64' if we have it. SCM_I_GSC_T_INT64=0 if test "$scm_stdint_has_int64"; then SCM_I_GSC_T_INT64='"int64_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_int64"; then SCM_I_GSC_T_INT64='"int64_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_int" -eq 8; then SCM_I_GSC_T_INT64='"int"' elif test "$ac_cv_sizeof_long" -eq 8; then SCM_I_GSC_T_INT64='"long"' elif test "$ac_cv_sizeof_short" -eq 8; then SCM_I_GSC_T_INT64='"short"' elif test "$ac_cv_sizeof_long_long" -eq 8; then SCM_I_GSC_T_INT64='"long long"' elif test "$ac_cv_sizeof___int64" -eq 8; then SCM_I_GSC_T_INT64='"__int64"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_int64.]) fi AC_SUBST([SCM_I_GSC_T_INT64]) ### Optional type scm_t_uint64 (ANSI C says int, short, or long might work) ### Also try 'long long' and '__int64' if we have it. SCM_I_GSC_T_UINT64=0 if test "$scm_stdint_has_uint64"; then SCM_I_GSC_T_UINT64='"uint64_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_uint64"; then SCM_I_GSC_T_UINT64='"uint64_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_unsigned_int" -eq 8; then SCM_I_GSC_T_UINT64='"unsigned int"' elif test "$ac_cv_sizeof_unsigned_long" -eq 8; then SCM_I_GSC_T_UINT64='"unsigned long"' elif test "$ac_cv_sizeof_unsigned_short" -eq 8; then SCM_I_GSC_T_UINT64='"unsigned short"' elif test "$ac_cv_sizeof_unsigned_long_long" -eq 8; then SCM_I_GSC_T_UINT64='"unsigned long long"' elif test "$ac_cv_sizeof_unsigned___int64" -eq 8; then SCM_I_GSC_T_UINT64='"unsigned __int64"' else AC_MSG_ERROR([Can't find appropriate type for scm_t_uint64.]) fi AC_SUBST([SCM_I_GSC_T_UINT64]) ### Required type scm_t_intmax ### ### We try 'intmax_t', '__int64', 'long long' in this order. When ### none of them is available, we use 'long'. ### SCM_I_GSC_T_INTMAX=0 if test "$scm_stdint_has_intmax"; then SCM_I_GSC_T_INTMAX='"intmax_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_intmax"; then SCM_I_GSC_T_INTMAX='"intmax_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof___int64" -ne 0; then SCM_I_GSC_T_INTMAX='"__int64"' elif test "$ac_cv_sizeof_long_long" -ne 0; then SCM_I_GSC_T_INTMAX='"long long"' else SCM_I_GSC_T_INTMAX='"long"' fi AC_SUBST([SCM_I_GSC_T_INTMAX]) ### Required type scm_t_uintmax ### ### We try 'uintmax_t', 'unsigned __int64', 'unsigned long long' in ### this order. When none of them is available, we use 'unsigned long'. ### SCM_I_GSC_T_UINTMAX=0 if test "$scm_stdint_has_uintmax"; then SCM_I_GSC_T_UINTMAX='"uintmax_t"' SCM_I_GSC_NEEDS_STDINT_H=1 elif test "$scm_inttypes_has_uintmax"; then SCM_I_GSC_T_UINTMAX='"uintmax_t"' SCM_I_GSC_NEEDS_INTTYPES_H=1 elif test "$ac_cv_sizeof_unsigned___int64" -ne 0; then SCM_I_GSC_T_UINTMAX='"unsigned __int64"' elif test "$ac_cv_sizeof_unsigned_long_long" -ne 0; then SCM_I_GSC_T_UINTMAX='"unsigned long long"' else SCM_I_GSC_T_UINTMAX='"unsigned long"' fi AC_SUBST([SCM_I_GSC_T_UINTMAX]) AC_SUBST([SCM_I_GSC_NEEDS_STDINT_H]) AC_SUBST([SCM_I_GSC_NEEDS_INTTYPES_H]) AC_HEADER_STDC AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_HEADER_DIRENT # Reason for checking: # # HP-UX 11.11 (at least) doesn't provide `struct dirent64', even # with `_LARGEFILE64_SOURCE', so check whether it's available. # AC_CHECK_MEMBER([struct dirent64.d_name], [SCM_I_GSC_HAVE_STRUCT_DIRENT64=1], [SCM_I_GSC_HAVE_STRUCT_DIRENT64=0], [ #ifndef _LARGEFILE64_SOURCE # define _LARGEFILE64_SOURCE #endif /* Per Autoconf manual. */ #include #ifdef HAVE_DIRENT_H # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif ]) AC_SUBST([SCM_I_GSC_HAVE_STRUCT_DIRENT64]) # Reasons for testing: # complex.h - new in C99 # fenv.h - available in C99, but not older systems # machine/fpu.h - on Tru64 5.1b, the declaration of fesetround(3) is in # this file instead of # process.h - mingw specific # AC_CHECK_HEADERS([complex.h fenv.h io.h libc.h limits.h malloc.h memory.h process.h string.h \ regex.h rxposix.h rx/rxposix.h sys/dir.h sys/ioctl.h sys/select.h \ sys/time.h sys/timeb.h sys/times.h sys/stdtypes.h sys/types.h \ sys/utime.h time.h unistd.h utime.h pwd.h grp.h sys/utsname.h \ direct.h strings.h machine/fpu.h]) # "complex double" is new in C99, and "complex" is only a keyword if # is included AC_CHECK_TYPES(complex double,,, [#if HAVE_COMPLEX_H #include #endif]) # On MacOS X contains socklen_t, so must include that # when testing. AC_CHECK_TYPE(socklen_t, , [AC_DEFINE_UNQUOTED(socklen_t, int, [Define to `int' if does not define.])], [#if HAVE_SYS_TYPES_H #include #endif #include ]) AC_CHECK_TYPE(struct ip_mreq) GUILE_HEADER_LIBC_WITH_UNISTD AC_TYPE_GETGROUPS AC_TYPE_SIGNAL AC_TYPE_MODE_T # On mingw -lm is empty, so this test is unnecessary, but it's # harmless so we don't hard-code to suppress it. # AC_CHECK_LIB(m, cos) AC_CHECK_FUNCS(gethostbyname) if test $ac_cv_func_gethostbyname = no; then AC_CHECK_LIB(nsl, gethostbyname) fi AC_CHECK_FUNCS(connect) if test $ac_cv_func_connect = no; then AC_CHECK_LIB(socket, connect) fi dnl dnl Check for Winsock and other functionality on Win32 (*not* CygWin) dnl EXTRA_DEFS="" case $host in *-*-mingw*) AC_CHECK_HEADER(winsock2.h, [AC_DEFINE([HAVE_WINSOCK2_H], 1, [Define if you have the header file.])]) AC_CHECK_LIB(ws2_32, main) AC_LIBOBJ([win32-uname]) AC_LIBOBJ([win32-dirent]) if test "$enable_networking" = yes ; then AC_LIBOBJ([win32-socket]) fi if test "$enable_shared" = yes ; then EXTRA_DEFS="-DSCM_IMPORT" AC_DEFINE(USE_DLL_IMPORT, 1, [Define if you need additional CPP macros on Win32 platforms.]) fi ;; esac AC_SUBST(EXTRA_DEFS) # Reasons for testing: # crt_externs.h - Darwin specific # AC_CHECK_HEADERS([assert.h crt_externs.h]) # Reasons for testing: # DINFINITY - OSF specific # DQNAN - OSF specific # (DINFINITY and DQNAN are actually global variables, not functions) # chsize - an MS-DOS-ism, found in mingw # cexp, clog - not in various pre-c99 systems, and note that it's possible # for gcc to provide the "complex double" type but the system to not # have functions like cexp and clog # clog10 - not in mingw (though others like clog and csqrt are) # fesetround - available in C99, but not older systems # ftruncate - posix, but probably not older systems (current mingw # has it as an inline for chsize) # ioctl - not in mingw. # gmtime_r - recent posix, not on old systems # pipe - not in mingw # _pipe - specific to mingw, taking 3 args # readdir_r - recent posix, not on old systems # readdir64_r - not available on HP-UX 11.11 # stat64 - SuS largefile stuff, not on old systems # sysconf - not on old systems # truncate - not in mingw # isblank - available as a GNU extension or in C99 # _NSGetEnviron - Darwin specific # AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid fesetround ftime ftruncate fchown getcwd geteuid gettimeofday gmtime_r ioctl lstat mkdir mknod nice pipe _pipe readdir_r readdir64_r readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction siginterrupt stat64 strftime strptime symlink sync sysconf tcgetpgrp tcsetpgrp times uname waitpid strdup system usleep atexit on_exit chown link fcntl ttyname getpwent getgrent kill getppid getpgrp fork setitimer getitimer strchr strcmp index bcopy memcpy rindex truncate unsetenv isblank _NSGetEnviron strncasecmp]) # Reasons for testing: # netdb.h - not in mingw # sys/param.h - not in mingw # pthread.h - only available with pthreads. ACX_PTHREAD doesn't # check this specifically, we need it for the timespec test below. # sethostname - the function itself check because it's not in mingw, # the DECL is checked because Solaris 10 doens't have in any header # strncasecmp - on NetBSD 1.6 the symbol is available in libc but the # declaration cannot be found # unsetenv - on Tru64 5.1b the symbol is available in libc but the # declaration is only found if `_BSD' is defined; it's marked as # discouraged in and has type `void' instead of `int' # anyway. # hstrerror - on Tru64 5.1b the symbol is available in libc but the # declaration isn't anywhere. # cuserid - on Tru64 5.1b the declaration is documented to be available # only with `_XOPEN_SOURCE' or some such. # flock - on Tru64 5.1b the declaration is available from # but only if `_BSD' is defined. # vsnprintf - on AIX 5.3, the declaration is only visible with # `_XOPEN_SOURCE >= 500' or `_ISOC99_SOURCE'. # AC_CHECK_HEADERS(crypt.h netdb.h pthread.h sys/param.h sys/resource.h sys/file.h) AC_CHECK_FUNCS(chroot flock getlogin cuserid getpriority setpriority getpass sethostname gethostname) AC_CHECK_DECLS([sethostname, strncasecmp, unsetenv, hstrerror, cuserid, flock, vsnprintf]) # crypt() may or may not be available, for instance in some countries there # are restrictions on cryptography. # # crypt() might be in libc (eg. OpenBSD), or it might be in a separate # -lcrypt library (eg. Debian GNU/Linux). # # On HP-UX 11, crypt() is in libc and there's a dummy libcrypt.a. We must # be careful to avoid -lcrypt in this case, since libtool will see there's # only a static libcrypt and decide to build only a static libguile. # # AC_SEARCH_LIBS lets us add -lcrypt to LIBS only if crypt() is not in the # libraries already in that list. # AC_SEARCH_LIBS(crypt, crypt, [AC_DEFINE(HAVE_CRYPT,1, [Define to 1 if you have the `crypt' function.])]) # When compiling with GCC on some OSs (Solaris, AIX), _Complex_I doesn't # work; in the reported cases so far, 1.0fi works well instead. According # to the C99 spec, the complex.h header must provide a working definition # of _Complex_I, so we always try _Complex_I first. The 1.0fi fallback # is a workaround for the failure of some systems to conform to C99. if test "$ac_cv_type_complex_double" = yes; then AC_MSG_CHECKING([for i]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if HAVE_COMPLEX_H #include #endif complex double z; ]], [[ z = _Complex_I; ]])], [AC_DEFINE(GUILE_I,_Complex_I,[The imaginary unit (positive square root of -1).]) AC_MSG_RESULT([_Complex_I])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if HAVE_COMPLEX_H #include #endif complex double z; ]],[[ z = 1.0fi; ]])], [AC_DEFINE(GUILE_I,1.0fi) AC_MSG_RESULT([1.0fi])], [ac_cv_type_complex_double=no AC_MSG_RESULT([not available])])]) fi # glibc 2.3.6 (circa 2006) and various prior versions had a bug where # csqrt(-i) returned a negative real part, when it should be positive # for the principal root. # if test "$ac_cv_type_complex_double" = yes; then AC_CACHE_CHECK([whether csqrt is usable], guile_cv_use_csqrt, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include /* "volatile" is meant to prevent gcc from calculating the sqrt as a constant, we want to test libc. */ volatile complex double z = - _Complex_I; int main (void) { z = csqrt (z); if (creal (z) > 0.0) return 0; /* good */ else return 1; /* bad */ }]])], [guile_cv_use_csqrt=yes], [guile_cv_use_csqrt="no, glibc 2.3 bug"], [guile_cv_use_csqrt="yes, hopefully (cross-compiling)"])]) case $guile_cv_use_csqrt in yes*) AC_DEFINE(HAVE_USABLE_CSQRT, 1, [Define to 1 if csqrt is bug-free]) ;; esac fi dnl GMP tests AC_CHECK_LIB([gmp], [__gmpz_init], , [AC_MSG_ERROR([GNU MP not found, see README])]) # mpz_import is a macro so we need to include AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[mpz_import (0, 0, 0, 0, 0, 0, 0); ]])], [], [AC_MSG_ERROR([At least GNU MP 4.1 is required, see README])]) dnl i18n tests #AC_CHECK_HEADERS([libintl.h]) #AC_CHECK_FUNCS(gettext) #if test $ac_cv_func_gettext = no; then # AC_CHECK_LIB(intl, gettext) #fi #AC_CHECK_FUNCS([bindtextdomain textdomain]) AM_GNU_GETTEXT([external], [need-ngettext]) ### Some systems don't declare some functions. On such systems, we ### need to at least provide our own K&R-style declarations. ### GUILE_FUNC_DECLARED(function, headerfile) ### Check for a declaration of FUNCTION in HEADERFILE; if it is ### not there, #define MISSING_FUNCTION_DECL. AC_DEFUN([GUILE_FUNC_DECLARED], [ AC_CACHE_CHECK(for $1 declaration, guile_cv_func_$1_declared, AC_EGREP_HEADER($1, $2, guile_cv_func_$1_declared=yes, guile_cv_func_$1_declared=no)) if test [x$guile_cv_func_]$1[_declared] = xno; then AC_DEFINE([MISSING_]translit($1, [a-z], [A-Z])[_DECL], 1, [Define if the operating system supplies $1 without declaring it.]) fi ]) GUILE_FUNC_DECLARED(sleep, unistd.h) GUILE_FUNC_DECLARED(usleep, unistd.h) AC_CHECK_DECLS([strptime],,, [#define _GNU_SOURCE /* ask glibc to give strptime prototype */ #include ]) ### On some systems usleep has no return value. If it does have one, ### we'd like to return it; otherwise, we'll fake it. AC_CACHE_CHECK([return type of usleep], guile_cv_func_usleep_return_type, [AC_EGREP_HEADER(changequote(<, >)changequote([, ]), unistd.h, [guile_cv_func_usleep_return_type=void], [guile_cv_func_usleep_return_type=int])]) case "$guile_cv_func_usleep_return_type" in "void" ) AC_DEFINE(USLEEP_RETURNS_VOID, 1, [Define if the system headers declare usleep to return void.]) ;; esac AC_CHECK_HEADER(sys/un.h, have_sys_un_h=1) if test -n "$have_sys_un_h" ; then AC_DEFINE(HAVE_UNIX_DOMAIN_SOCKETS, 1, [Define if the system supports Unix-domain (file-domain) sockets.]) fi AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset) AC_CHECK_FUNCS(sethostent gethostent endhostent dnl setnetent getnetent endnetent dnl setprotoent getprotoent endprotoent dnl setservent getservent endservent dnl getnetbyaddr getnetbyname dnl inet_lnaof inet_makeaddr inet_netof hstrerror dnl inet_pton inet_ntop) # struct sockaddr field sin_len is only present on BSD systems. # On 4.4BSD apparently a #define SIN_LEN exists, but on other BSD systems # (eg. FreeBSD 4.9) it doesn't and we must use this configure check AC_CHECK_MEMBERS([struct sockaddr.sin_len],,, [#ifdef HAVE_SYS_TYPES_H #include #endif #include ]) AC_MSG_CHECKING(for __libc_stack_end) AC_CACHE_VAL(guile_cv_have_libc_stack_end, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include extern char *__libc_stack_end;]], [[printf("%p", (char*) __libc_stack_end);]])], [guile_cv_have_libc_stack_end=yes], [guile_cv_have_libc_stack_end=no])]) AC_MSG_RESULT($guile_cv_have_libc_stack_end) if test $guile_cv_have_libc_stack_end = yes; then AC_DEFINE(HAVE_LIBC_STACK_END, 1, [Define if you have the __libc_stack_end variable.]) fi dnl Some systems do not declare this. Some systems do declare it, as a dnl macro. With cygwin it may be in a DLL. AC_MSG_CHECKING(whether netdb.h declares h_errno) AC_CACHE_VAL(guile_cv_have_h_errno, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int a = h_errno;]])], [guile_cv_have_h_errno=yes], [guile_cv_have_h_errno=no])]) AC_MSG_RESULT($guile_cv_have_h_errno) if test $guile_cv_have_h_errno = yes; then AC_DEFINE(HAVE_H_ERRNO, 1, [Define if h_errno is declared in netdb.h.]) fi AC_MSG_CHECKING(whether uint32_t is defined) AC_CACHE_VAL(guile_cv_have_uint32_t, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #if HAVE_STDINT_H #include #endif #ifndef HAVE_NETDB_H #include #endif]], [[uint32_t a;]])], [guile_cv_have_uint32_t=yes], [guile_cv_have_uint32_t=no])]) AC_MSG_RESULT($guile_cv_have_uint32_t) if test $guile_cv_have_uint32_t = yes; then AC_DEFINE(HAVE_UINT32_T, 1, [Define if uint32_t typedef is defined when netdb.h is include.]) fi AC_MSG_CHECKING(for working IPv6 support) AC_CACHE_VAL(guile_cv_have_ipv6, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_SYS_TYPES_H #include #endif #include #include ]], [[struct sockaddr_in6 a; a.sin6_family = AF_INET6;]])], [guile_cv_have_ipv6=yes], [guile_cv_have_ipv6=no])]) AC_MSG_RESULT($guile_cv_have_ipv6) if test $guile_cv_have_ipv6 = yes; then AC_DEFINE(HAVE_IPV6, 1, [Define if you want support for IPv6.]) fi # included in rfc2553 but not in older implementations, e.g., glibc 2.1.3. AC_MSG_CHECKING(whether sockaddr_in6 has sin6_scope_id) AC_CACHE_VAL(guile_cv_have_sin6_scope_id, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef HAVE_SYS_TYPES_H #include #endif #include ]], [[struct sockaddr_in6 sok; sok.sin6_scope_id = 0;]])], [guile_cv_have_sin6_scope_id=yes], [guile_cv_have_sin6_scope_id=no])]) AC_MSG_RESULT($guile_cv_have_sin6_scope_id) if test $guile_cv_have_sin6_scope_id = yes; then AC_DEFINE(HAVE_SIN6_SCOPE_ID, 1, [Define this if your IPv6 has sin6_scope_id in sockaddr_in6 struct.]) fi # struct sockaddr_in6 field sin_len is only present on BSD systems AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_len],,, [#ifdef HAVE_SYS_TYPES_H #include #endif #include ]) AC_MSG_CHECKING(whether localtime caches TZ) AC_CACHE_VAL(guile_cv_localtime_cache, [if test x$ac_cv_func_tzset = xyes; then AC_RUN_IFELSE([AC_LANG_SOURCE([[#include #if STDC_HEADERS # include #endif extern char **environ; unset_TZ () { char **from, **to; for (to = from = environ; (*to = *from); from++) if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '=')) to++; } char TZ_GMT0[] = "TZ=GMT0"; char TZ_PST8[] = "TZ=PST8"; main() { time_t now = time ((time_t *) 0); int hour_GMT0, hour_unset; if (putenv (TZ_GMT0) != 0) exit (1); hour_GMT0 = localtime (&now)->tm_hour; unset_TZ (); hour_unset = localtime (&now)->tm_hour; if (putenv (TZ_PST8) != 0) exit (1); if (localtime (&now)->tm_hour == hour_GMT0) exit (1); unset_TZ (); if (localtime (&now)->tm_hour != hour_unset) exit (1); exit (0); }]])], [guile_cv_localtime_cache=no], [guile_cv_localtime_cache=yes], [# If we have tzset, assume the worst when cross-compiling. guile_cv_localtime_cache=yes]) else # If we lack tzset, report that localtime does not cache TZ, # since we can't invalidate the cache if we don't have tzset. guile_cv_localtime_cache=no fi])dnl AC_MSG_RESULT($guile_cv_localtime_cache) if test $guile_cv_localtime_cache = yes; then AC_DEFINE(LOCALTIME_CACHE, 1, [Define if localtime caches the TZ setting.]) fi if test "$enable_regex" = yes; then if test "$ac_cv_header_regex_h" = yes || test "$ac_cv_header_rxposix_h" = yes || test "$ac_cv_header_rx_rxposix_h" = yes; then GUILE_NAMED_CHECK_FUNC(regcomp, norx, [AC_LIBOBJ([regex-posix])], [AC_CHECK_LIB(rx, main) GUILE_NAMED_CHECK_FUNC(regcomp, rx, [AC_LIBOBJ([regex-posix])], [AC_CHECK_LIB(regex, main) GUILE_NAMED_CHECK_FUNC(regcomp, regex, [AC_LIBOBJ([regex-posix])])])] ) dnl The following should not be necessary, but for some reason dnl autoheader misses it if we don't include it! if test "$ac_cv_func_regcomp_norx" = yes || test "$ac_cv_func_regcomp_regex" = yes || test "$ac_cv_func_regcomp_rx" = yes; then AC_DEFINE(HAVE_REGCOMP, 1, [This is included as part of a workaround for a autoheader bug.]) fi fi fi AC_REPLACE_FUNCS(inet_aton putenv strerror memmove mkstemp) AC_CHECK_HEADERS(floatingpoint.h ieeefp.h nan.h) # Reasons for testing: # asinh, acosh, atanh, trunc - C99 standard, generally not available on # older systems # sincos - GLIBC extension # AC_CHECK_FUNCS(asinh acosh atanh copysign finite sincos trunc) # C99 specifies isinf and isnan as macros. # HP-UX provides only macros, no functions. # glibc 2.3.2 provides both macros and functions. # IRIX 6.5 and Solaris 8 only provide functions. # # The following tests detect isinf and isnan either as functions or as # macros from . Plain AC_CHECK_FUNCS is insufficient, it doesn't # use so doesn't detect on macro-only systems like HP-UX. # AC_MSG_CHECKING([for isinf]) AC_LINK_IFELSE(AC_LANG_SOURCE( [[#include volatile double x = 0.0; int main () { return (isinf(x) != 0); }]]), [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_ISINF, 1, [Define to 1 if you have the `isinf' macro or function.])], [AC_MSG_RESULT([no])]) AC_MSG_CHECKING([for isnan]) AC_LINK_IFELSE(AC_LANG_SOURCE( [[#include volatile double x = 0.0; int main () { return (isnan(x) != 0); }]]), [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_ISNAN, 1, [Define to 1 if you have the `isnan' macro or function.])], [AC_MSG_RESULT([no])]) # We must have a proper stack-using alloca in order for stack-copying # continuations to work properly. If we don't find a native one, # abort. AC_FUNC_ALLOCA if test "$ALLOCA" = "alloca.o" then AC_ERROR([No native alloca found.]) fi # Reasons for checking: # # st_rdev # st_blksize # st_blocks not in mingw # tm_gmtoff BSD+GNU, not in C99 # # Note AC_STRUCT_ST_BLOCKS is not used here because we don't want the # AC_LIBOBJ(fileblocks) replacement which that macro gives. # AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize, struct stat.st_blocks]) AC_STRUCT_TIMEZONE AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,, [#include #ifdef TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif ]) GUILE_STRUCT_UTIMBUF #-------------------------------------------------------------------- # # Which way does the stack grow? # # Following code comes from Autoconf 2.61's internal _AC_LIBOBJ_ALLOCA # macro (/usr/share/autoconf/autoconf/functions.m4). Gnulib has # very similar code, so in future we could look at using that. # # An important detail is that the code involves find_stack_direction # calling _itself_ - which means that find_stack_direction (or at # least the second find_stack_direction() call) cannot be inlined. # If the code could be inlined, that might cause the test to give # an incorrect answer. #-------------------------------------------------------------------- SCM_I_GSC_STACK_GROWS_UP=0 AC_RUN_IFELSE([AC_LANG_SOURCE( [AC_INCLUDES_DEFAULT int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; }])], [SCM_I_GSC_STACK_GROWS_UP=1], [], [AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h)]) AC_CHECK_SIZEOF(float) if test "$ac_cv_sizeof_float" -le "$ac_cv_sizeof_long"; then AC_DEFINE(SCM_SINGLES, 1, [Define this if floats are the same size as longs.]) fi AC_MSG_CHECKING(for struct linger) AC_CACHE_VAL(scm_cv_struct_linger, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[struct linger lgr; lgr.l_linger = 100]])], [scm_cv_struct_linger="yes"], [scm_cv_struct_linger="no"])) AC_MSG_RESULT($scm_cv_struct_linger) if test $scm_cv_struct_linger = yes; then AC_DEFINE(HAVE_STRUCT_LINGER, 1, [Define this if your system defines struct linger, for use with the getsockopt and setsockopt system calls.]) fi # On mingw, struct timespec is in . # AC_MSG_CHECKING(for struct timespec) AC_CACHE_VAL(scm_cv_struct_timespec, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #if HAVE_PTHREAD_H #include #endif]], [[struct timespec t; t.tv_nsec = 100]])], [scm_cv_struct_timespec="yes"], [scm_cv_struct_timespec="no"])) AC_MSG_RESULT($scm_cv_struct_timespec) if test $scm_cv_struct_timespec = yes; then AC_DEFINE(HAVE_STRUCT_TIMESPEC, 1, [Define this if your system defines struct timespec via either or .]) fi #-------------------------------------------------------------------- # # Flags for thread support # #-------------------------------------------------------------------- SCM_I_GSC_USE_PTHREAD_THREADS=0 SCM_I_GSC_USE_NULL_THREADS=0 AC_SUBST([SCM_I_GSC_USE_PTHREAD_THREADS]) AC_SUBST([SCM_I_GSC_USE_NULL_THREADS]) ### What thread package has the user asked for? AC_ARG_WITH(threads, [ --with-threads thread interface], , with_threads=yes) AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT, 0) AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER, 0) case "$with_threads" in "yes" | "pthread" | "pthreads" | "pthread-threads" | "") build_pthread_support="yes" ACX_PTHREAD([CC="$PTHREAD_CC" LIBS="$PTHREAD_LIBS $LIBS" SCM_I_GSC_USE_PTHREAD_THREADS=1 with_threads="pthreads"], [with_threads="null" build_pthread_support="no"]) old_CFLAGS="$CFLAGS" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" # Reasons for testing: # pthread_getattr_np - "np" meaning "non portable" says it # all; not present on MacOS X or Solaris 10 # pthread_get_stackaddr_np - "np" meaning "non portable" says it # all; specific to MacOS X # pthread_sigmask - not available on mingw # AC_CHECK_FUNCS(pthread_attr_getstack pthread_getattr_np pthread_get_stackaddr_np pthread_sigmask) # On past versions of Solaris, believe 8 through 10 at least, you # had to write "pthread_once_t foo = { PTHREAD_ONCE_INIT };". # This is contrary to POSIX: # http://www.opengroup.org/onlinepubs/000095399/functions/pthread_once.html # Check here if this style is required. # # glibc (2.3.6 at least) works both with or without braces, so the # test checks whether it works without. # if test "$GCC" = "yes"; then # Since GCC only issues a warning for missing braces, so we need # `-Werror' to catch it. CFLAGS="-Werror -Wmissing-braces $CFLAGS" fi AC_CACHE_CHECK([whether PTHREAD_ONCE_INIT needs braces], guile_cv_need_braces_on_pthread_once_init, [AC_COMPILE_IFELSE([#include pthread_once_t foo = PTHREAD_ONCE_INIT;], [guile_cv_need_braces_on_pthread_once_init=no], [guile_cv_need_braces_on_pthread_once_init=yes])]) if test "$guile_cv_need_braces_on_pthread_once_init" = yes; then SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT=1 fi # Same problem with `PTHREAD_MUTEX_INITIALIZER', e.g., on IRIX # 6.5.30m with GCC 3.3. AC_CACHE_CHECK([whether PTHREAD_MUTEX_INITIALIZER needs braces], guile_cv_need_braces_on_pthread_mutex_initializer, [AC_COMPILE_IFELSE([#include pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;], [guile_cv_need_braces_on_pthread_mutex_initializer=no], [guile_cv_need_braces_on_pthread_mutex_initializer=yes])]) if test "$guile_cv_need_braces_on_pthread_mutex_initializer" = yes; then SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER=1 fi CFLAGS="$old_CFLAGS" # On Solaris, sched_yield lives in -lrt. AC_SEARCH_LIBS(sched_yield, rt) ;; esac case "$with_threads" in "pthreads") ;; "no" | "null") SCM_I_GSC_USE_NULL_THREADS=1 with_threads="null-threads" ;; * ) AC_MSG_ERROR(invalid value for --with-threads: $with_threads) ;; esac AC_MSG_CHECKING(what kind of threads to support) AC_MSG_RESULT($with_threads) AM_CONDITIONAL([BUILD_PTHREAD_SUPPORT], [test "x$build_pthread_support" = "xyes"]) ## Check whether pthread_attr_getstack works for the main thread if test "$with_threads" = pthreads; then AC_MSG_CHECKING(whether pthread_attr_getstack works for the main thread) old_CFLAGS="$CFLAGS" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" AC_RUN_IFELSE([AC_LANG_SOURCE([[ #if HAVE_PTHREAD_ATTR_GETSTACK #include int main () { pthread_attr_t attr; void *start, *end; size_t size; pthread_getattr_np (pthread_self (), &attr); pthread_attr_getstack (&attr, &start, &size); end = (char *)start + size; if ((void *)&attr < start || (void *)&attr >= end) return 1; else return 0; } #else int main () { return 1; } #endif ]])], [works=yes AC_DEFINE(PTHREAD_ATTR_GETSTACK_WORKS, [1], [Define when pthread_att_get_stack works for the main thread])], [works=no], []) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($works) fi # with_threads=pthreads ## Cross building if test "$cross_compiling" = "yes"; then AC_MSG_CHECKING(cc for build) ## /usr/bin/cc still uses wrong assembler ## CC_FOR_BUILD="${CC_FOR_BUILD-/usr/bincc}" CC_FOR_BUILD="${CC_FOR_BUILD-PATH=/usr/bin:$PATH cc}" else CC_FOR_BUILD="${CC_FOR_BUILD-$CC}" fi ## AC_MSG_CHECKING("if we are cross compiling") ## AC_MSG_RESULT($cross_compiling) if test "$cross_compiling" = "yes"; then AC_MSG_RESULT($CC_FOR_BUILD) fi ## No need as yet to be more elaborate CCLD_FOR_BUILD="$CC_FOR_BUILD" AC_SUBST(cross_compiling) AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler]) AC_SUBST(CCLD_FOR_BUILD) ## libtool erroneously calls CC_FOR_BUILD HOST_CC; ## --HOST is the platform that PACKAGE is compiled for. HOST_CC="$CC_FOR_BUILD" AC_SUBST(HOST_CC) if test "$cross_compiling" = "yes"; then AC_MSG_CHECKING(guile for build) GUILE_FOR_BUILD="${GUILE_FOR_BUILD-guile}" else GUILE_FOR_BUILD='$(preinstguile)' fi ## AC_MSG_CHECKING("if we are cross compiling") ## AC_MSG_RESULT($cross_compiling) if test "$cross_compiling" = "yes"; then AC_MSG_RESULT($GUILE_FOR_BUILD) fi AC_ARG_VAR(GUILE_FOR_BUILD,[guile for build system]) AC_SUBST(GUILE_FOR_BUILD) ## If we're using GCC, ask for aggressive warnings. case "$GCC" in yes ) ## We had -Wstrict-prototypes in here for a bit, but Guile does too ## much stuff with generic function pointers for that to really be ## less than exasperating. ## -Wpointer-arith was here too, but something changed in gcc/glibc ## and it became equally exasperating (gcc 2.95 and/or glibc 2.1.2). CFLAGS="$CFLAGS -Wall -Wmissing-prototypes" # Do this here so we don't screw up any of the tests above that might # not be "warning free" if test "${GUILE_ERROR_ON_WARNING}" = yes then CFLAGS="${CFLAGS} -Werror" enable_compile_warnings=no fi ;; esac ## If we're creating a shared library (using libtool!), then we'll ## need to generate a list of .lo files corresponding to the .o files ## given in LIBOBJS. We'll call it LIBLOBJS. LIBLOBJS="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.lo ,g;s,\.[[^.]]*$,.lo,'`" ## We also need to create corresponding .doc and .x files EXTRA_DOT_DOC_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.doc ,g;s,\.[[^.]]*$,.doc,'`" EXTRA_DOT_X_FILES="`echo ${LIB@&t@OBJS} | sed 's,\.[[^.]]* ,.x ,g;s,\.[[^.]]*$,.x,'`" AC_SUBST(GUILE_MAJOR_VERSION) AC_SUBST(GUILE_MINOR_VERSION) AC_SUBST(GUILE_MICRO_VERSION) AC_SUBST(GUILE_EFFECTIVE_VERSION) AC_SUBST(GUILE_VERSION) ####################################################################### # library versioning AC_SUBST(LIBGUILE_INTERFACE_CURRENT) AC_SUBST(LIBGUILE_INTERFACE_REVISION) AC_SUBST(LIBGUILE_INTERFACE_AGE) AC_SUBST(LIBGUILE_INTERFACE) AC_SUBST(LIBGUILE_SRFI_SRFI_1_MAJOR) AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_CURRENT) AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION) AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE_AGE) AC_SUBST(LIBGUILE_SRFI_SRFI_1_INTERFACE) AC_SUBST(LIBGUILE_SRFI_SRFI_4_MAJOR) AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_CURRENT) AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_REVISION) AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE_AGE) AC_SUBST(LIBGUILE_SRFI_SRFI_4_INTERFACE) AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_MAJOR) AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_CURRENT) AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_REVISION) AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE_AGE) AC_SUBST(LIBGUILE_SRFI_SRFI_13_14_INTERFACE) AC_SUBST(LIBGUILE_SRFI_SRFI_60_MAJOR) AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_CURRENT) AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_REVISION) AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE_AGE) AC_SUBST(LIBGUILE_SRFI_SRFI_60_INTERFACE) ####################################################################### dnl Tell guile-config what flags guile users should compile and link with. GUILE_LIBS="$LDFLAGS $LIBS" GUILE_CFLAGS="$CPPFLAGS $PTHREAD_CFLAGS" AC_SUBST(GUILE_LIBS) AC_SUBST(GUILE_CFLAGS) AC_SUBST(AWK) AC_SUBST(LIBLOBJS) AC_SUBST(EXTRA_DOT_DOC_FILES) AC_SUBST(EXTRA_DOT_X_FILES) dnl See also top_builddir in info node: (libtool)AC_PROG_LIBTOOL top_builddir_absolute=`pwd` AC_SUBST(top_builddir_absolute) top_srcdir_absolute=`(cd $srcdir && pwd)` AC_SUBST(top_srcdir_absolute) dnl We need `sitedir' in `guile-1.8.pc'. dnl Note: `sitedir' must be kept in sync with `GUILE_SITE_DIR' in `guile.m4'. pkgdatadir="$datadir/guile" sitedir="$pkgdatadir/site" AC_SUBST([sitedir]) # Additional SCM_I_GSC definitions are above. AC_SUBST([SCM_I_GSC_GUILE_DEBUG]) AC_SUBST([SCM_I_GSC_GUILE_DEBUG_FREELIST]) AC_SUBST([SCM_I_GSC_ENABLE_DISCOURAGED]) AC_SUBST([SCM_I_GSC_ENABLE_DEPRECATED]) AC_SUBST([SCM_I_GSC_ENABLE_ELISP]) AC_SUBST([SCM_I_GSC_STACK_GROWS_UP]) AC_SUBST([SCM_I_GSC_C_INLINE]) AC_CONFIG_FILES([libguile/gen-scmconfig.h]) AC_CONFIG_FILES([ Makefile am/Makefile benchmark-suite/Makefile doc/Makefile doc/goops/Makefile doc/r5rs/Makefile doc/ref/Makefile doc/tutorial/Makefile emacs/Makefile examples/Makefile guile-config/Makefile ice-9/Makefile lang/Makefile libguile/Makefile oop/Makefile oop/goops/Makefile scripts/Makefile srfi/Makefile test-suite/Makefile test-suite/standalone/Makefile ]) AC_CONFIG_FILES([guile-1.8.pc]) AC_CONFIG_FILES([check-guile], [chmod +x check-guile]) AC_CONFIG_FILES([benchmark-guile], [chmod +x benchmark-guile]) AC_CONFIG_FILES([guile-tools], [chmod +x guile-tools]) AC_CONFIG_FILES([pre-inst-guile], [chmod +x pre-inst-guile]) AC_CONFIG_FILES([pre-inst-guile-env], [chmod +x pre-inst-guile-env]) AC_CONFIG_FILES([libguile/guile-snarf], [chmod +x libguile/guile-snarf]) AC_CONFIG_FILES([libguile/guile-doc-snarf], [chmod +x libguile/guile-doc-snarf]) AC_CONFIG_FILES([libguile/guile-func-name-check], [chmod +x libguile/guile-func-name-check]) AC_CONFIG_FILES([libguile/guile-snarf-docs], [chmod +x libguile/guile-snarf-docs]) AC_CONFIG_FILES([test-suite/standalone/test-use-srfi], [chmod +x test-suite/standalone/test-use-srfi]) AC_CONFIG_FILES([test-suite/standalone/test-fast-slot-ref], [chmod +x test-suite/standalone/test-fast-slot-ref]) AC_OUTPUT dnl Local Variables: dnl comment-start: "dnl " dnl comment-end: "" dnl comment-start-skip: "\\bdnl\\b\\s *" dnl End: guile-1.8-1.8.8+1.orig/doc/000077500000000000000000000000001155472604000150055ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/doc/.gitignore000066400000000000000000000000121155472604000167660ustar00rootroot00000000000000stamp-vti guile-1.8-1.8.8+1.orig/doc/ChangeLog-2008000066400000000000000000001012151155472604000171460ustar00rootroot000000000000002008-04-26 Ludovic Courtès * Makefile.am (EXAMPLE_SMOB_FILES): Remove `COPYING'. 2008-01-22 Neil Jerram * COPYING: Removed. * oldfmt.c: Update copyright statement to LGPL. 2002-09-14 Rob Browning * .cvsignore: add stamp-vti.1 2002-08-24 Marius Vollmer * Makefile.am (EXTRA_DIST): Do not distribute guile-api.alist, it can't be built currently. 2002-05-13 Thien-Thi Nguyen * Makefile.am (EXTRA_DIST): New var. 2002-05-11 Thien-Thi Nguyen * Makefile.am: Include ../am/maintainer-dirs (in MAINTAINER_MODE). (guile-api.alist, guile-api.alist-FORCE): New rules (in MAINTAINER_MODE). 2002-05-09 Thien-Thi Nguyen * groupings.alist: Add copyright and commentary. (favorite): Delete this example composite. (embedded-libltdl, gdb, coop, gh, g-fdes, r-fdes, scm, k, POSIX, guile-C-API): New groups. 2002-05-08 Thien-Thi Nguyen * groupings.alist: New file. 2002-04-23 Thien-Thi Nguyen * guile-api.alist: Update. 2002-04-16 Marius Vollmer * Makefile.am (dist-hook): Simplified to not use "cd"; now it works for relative pathnames in $(distdir). 2002-04-10 Rob Browning * .cvsignore: add version-tutorial.texi, version.texi, and stamp-vti1. 2002-03-01 Thien-Thi Nguyen * guile-api.alist: Update. 2001-08-27 Neil Jerram * mltext.texi (Guile Character Properties): Fix `hexidecimal' spelling errors (merge from stable branch). * AUTHORS: Removed. Authorship information for each manual is now in the top-level Texinfo file for that manual. 2001-08-24 Neil Jerram * Makefile.am: Split documentation into per-manual subdirectories. 2001-08-22 Mikael Djurfeldt * scheme-options.texi (Evaluator trap options): Splitted section "Evaluator options". * scheme-evaluation.texi (Evaluator Behaviour): Typo "reader options" --> "evaluator options". 2001-08-17 Rob Browning * Makefile.am (guile_tut_TEXINFOS): remove guile-tut.texi. It's already in info_TEXINFOS. * .cvsignore: rename stamp-vti1 to stamp-vti.1. Of course this only matters once you fix the bug in automake. 2001-08-02 Neil Jerram * scheme-debug.texi (Debugging): Improve `make-stack' doc by explaining cutting args. 2001-07-19 Rob Browning * posix.texi (Signals): add docs for setitimer and getitimer. 2001-07-11 Gary Houston * scheme-evaluation.texi: Added `load-from-path'. Corrected `load': it doesn't use the load paths. 2001-07-04 Martin Grabmueller * scheme-data.texi (Hook Reference): Removed documentation for `make-hook-with-name', which does note exist. Added note about unspecified return values to all procedure documentation 2001-07-02 Martin Grabmueller * srfi-modules.texi (SRFI-1 Fold and Map): Documented extended versions of `map' and `for-each'. 2001-06-30 Martin Grabmueller * preface.texi (Manual Conventions): Added description of @result{} and @print{}. * scheme-data.texi (Hash Table Examples): New subsubsection. 2001-06-30 Martin Grabmueller * scheme-data.texi (Hash Tables): Added docs for `make-hash-table'. 2001-06-29 Martin Grabmueller * misc-modules.texi: New file. (Pretty Printing): New chapter. (Formatted Output): New chapter. * Makefile.am (guile_TEXINFOS): Added misc-modules.texi. * guile.texi (Top): Added inclusion of misc-modules.texi. * scheme-modules.texi (Included Guile Modules): Added (srfi srfi-4) and (ice-9 rw) modules. (Module System Quirks): Removed note that `module-export!' must be called via gh_eval_str, now that we have scm_c_export. * repl-modules.texi (Loading Readline Support, Readline Options): New nodes. 2001-06-27 Neil Jerram * posix.texi (Network Sockets and Communication): Grammar fix - thanks to Christopher Cramer! 2001-06-27 Martin Grabmueller * srfi-modules.texi (SRFI-4): Added documentation for the new module (srfi srfi-4). 2001-06-26 Neil Jerram * gh.texi (scm transition summary): Refer to scm_mem2string instead of scm_makfromstr. 2001-06-26 Dirk Herrmann * oldfmt.c (scm_oldfmt): Use scm_mem2string instead of scm_makfromstr. 2001-06-25 Neil Jerram * gh.texi (GH deprecation): Remove paragraph about portability. * extend.texi (Libguile Intro): Updated following Marius' suggestions. 2001-06-25 Marius Vollmer * Makefile.am (version.texi, version-tutorial.texi): Removed kluges to build them unconditionally. 2001-06-22 Neil Jerram * gh.texi (scm transition summary): New node for summary of how to transition from GH to scm interface. (GH): Link to new node. (Calling Scheme procedures from C): Remove doc for gh_set_car and gh_set_cdr, which don't actually exist. (Data types and constants defined by gh): Correct SCM_UNSPECIFIED/SCM_UNDEFINED confusion. (Calling Scheme procedures from C): Correct SCM_EOL/SCM_UNDEFINED confusion. 2001-06-20 Neil Jerram * guile.texi (Top): Move GH chapter to end of Part V. * extend.texi (Libguile Intro), gh.texi (GH deprecation): Explain deprecation of GH and broad plan for documentation of scm interface. 2001-06-18 Martin Grabmueller * srfi-modules.texi (SRFI-1): Completed procedure documentation. * scheme-data.texi (List Constructors): Added make-list. Added type index entries for all data types. 2001-06-15 Martin Grabmueller * srfi-modules.texi (SRFI-1): New section documenting the SRFI-1 module. 2001-06-14 Martin Grabmueller * scheme-modules.texi (Included Guile Modules): Added reference to (srfi srfi-1) module. 2001-06-16 Marius Vollmer * posix.texi (Conventions): Use `system-error-errno' instead of explicit code 2001-06-04 Gary Houston * scheme-io.texi (Block Reading and Writing): added write-string/partial, updated read-string!/partial. 2001-05-30 Martin Grabmueller * General: A lot of typo, texinfo markup and layout corrections. * scheme-data.texi (Arithmetic): Clarified docs for - and /. (String Modification): Removed docs for C functions (scm_substring_move_right_x etc.) (Keyword Procedures): New section documenting the keyword procedures from boot-9.scm. (Vectors): Moved the section before the non-standard data types. * data-rep.texi (Defining New Types (Smobs)): Adapted description of smobs and proocedure creation to new terminology. (Describing a New Type): Removed mentioning of scm_make_smob_type_mfpe from smob function list and added deprecation notice for this function. (Creating Instances): Added description and macro docs for smobs with 2 or 3 data cells. (Garbage Collecting Smobs): Removed old docs for SCM_GCTYP16. (Garbage Collecting Simple Smobs): Added some clarification about usage and usefulness. (Non-immediate Datatypes): Changed R4RS reference to R5RS. (Vector Data): Document type-specific accessors. 2001-05-23 Martin Grabmueller * guile.texi: Commented out menu entry and inclusion of Tcl/Tk stuff. * indices.texi: Users are advised to look under C and Scheme names, xref to transformation rules added. * intro.texi, scheme-modules.texi, scheme-ideas.texi, scheme-evaluation.texi, scheme-data.texi, scheme-procedures.texi: Fixed most REFFIXMEs. * srfi-modules.texi (About SRFI Usage): New node. (SRFI-0): Extended. Fixed all REFFIXMEs. 2001-05-19 Neil Jerram * posix.texi (Networking): Split existing material into new nodes `Network Address Conversion' and `Network Databases'. * scheme-control.texi (Lazy Catch): Update doc for new constraint that lazy-catch handlers are not allowed to return. 2001-05-16 Rob Browning * scheme-options.texi (Install Config): fixed minor-version docs and added micro-version docs. 2001-05-16 Neil Jerram * data-rep.texi, srfi-modules.texi (SRFI-14 Iterating Over Character Sets), scheme-io.texi (Block Reading and Writing), scheme-control.texi (Lazy Catch), scheme-procedures.texi (Internal Macros): Add @bullet to @itemize usages. (Thanks for Masao Uebayashi for the bug report!) 2001-05-15 Martin Grabmueller * scripts.texi (Invoking Guile): Added docs for --use-srfi. * expect.texi, repl-modules.texi: Start the chapters with a new page. * srfi-modules.texi (SRFI-0): Added note about supported feature identifiers and an example. Start the chapter with a new page. * srfi-modules.texi, scheme-data.texi, scheme-control.texi, scheme-binding.texi, repl-modules.texi, posix.texi, intro.texi, scheme-utility.texi: Change `--' to `-' throughout. 2001-05-14 Martin Grabmueller * srfi-13-14.texi: Removed. * srfi-modules.texi (SRFI-13): Merged SRFI-13 docs into SRFI chapter. (SRFI-14): Merged SRFI-14 too. * guile.texi (Top): Remove inclusion of obsolete SRFI-13/14 file. * srfi-modules.texi (SRFI-0): New section. (SRFI-16): New section. Change `--' to `-' throughout. 2001-05-13 Thien-Thi Nguyen * intro.texi, scheme-modules.texi, scheme-procedures.texi: Fixup some module-related references. * scheme-modules.texi (Modules): Remove "babbling" fixme. (The Guile module system): Rewrite intro. (General Information about Modules): Rewrite some parts. Move problems to "Module System Quirks". (Using Guile Modules): Renamed from "Loading Guile Modules". Rewrite most parts. Remove reivewme comment. (Creating Guile Modules): Review, touch up. Remove "Tkintr" comment. (Module System Quirks): New node/subsection. 2001-05-06 Thien-Thi Nguyen * intro.texi (Using Guile Modules): Review; remove reviewme comment. Expand `GUILE_LOAD_PATH' blurb; add small example. (Reporting Bugs): Review; remove reviewme comment. Reword some phrases; add texi markup. Add suggestion to include `guile-config info' output. Update gdb invocation; add fixme question. 2001-05-05 Neil Jerram * AUTHORS: Added Martin Grabmueller. * scheme-procedures.texi (Macros, Syntax Rules, Internal Macros): New material. (Syntax Case): New node, but currently empty. * scheme-data.texi (Booleans, Symbols): Supply cross-references. 2001-05-04 Neil Jerram * new-docstrings.texi, posix.texi, scheme-control.texi, scheme-data.texi, scheme-debug.texi, scheme-evaluation.texi, scheme-io.texi, scheme-memory.texi, scheme-procedures.texi: Automatic docstring updates (mostly argument name updates and blank lines). * scheme-modules.texi: Change double hyphens to single. * scheme-control.texi (Lazy Catch): Completed. * posix.texi (Network Databases and Address Conversion): New subsubsection `IPv6 Address Conversion'. 2001-05-04 Thien-Thi Nguyen * preface.texi (iff): Use proper texi markup. Thanks to Florian Weimer. 2001-05-04 Martin Grabmueller * scheme-io.texi (Block Reading and Writing): Moved the documentation for read-string!/partial from the node `Reading'. * scheme-data.texi (List/String Conversion): Added docstring for `string-split'. 2001-05-02 Martin Grabmueller * srfi-13-14.texi: Added @bullet to various @itemize lists. * srfi-modules.texi (SRFI Support): New file and chapter. * Makefile.am (guile_TEXINFOS): Added repl-modules.texi and srfi-modules.texi. * guile.texi (Top): New menu entries for the new chapters. (Top): @includes for the new chapters. (Top): New menu entry for `SRFI Support', @include for `srfi-modules.texi'. * repl-modules.texi: New file. (Readline Support): New chapter for (ice-9 readline). (Value History): New chapter for (ice-9 history). 2001-05-02 Martin Grabmueller * scheme-modules.texi (Dynamic Libraries): Renamed from `Dynamic Linking from Marius''. (The Guile module system): Removed obsolete naming convention. (Loading Guile Modules, Creating Guile Modules), (More Module Procedures, Included Guile Modules): New nodes, split from `The Guile module system'. (The Guile module system): Changed references to (ice-9 slib) to (ice-9 popen), because note everybody has SLIB installed. (Included Guile Modules): Added a bunch of modules shipped with Guile. (Dynamic Libraries): (old version) Removed. * scheme-io.texi (Block Reading and Writing): Corrected capitalization, so it builds again. 2001-05-01 Gary Houston * scheme-io.texi: Removed obsolete section Binary IO. Added new section Block Reading and Writing. Updated section Line/Delimited with module usage. 2001-04-29 Neil Jerram * deprecated.texi (Tags): Removed - deprecation expired. * scheme-io.texi (Random Access): Removed `fseek' - deprecation expired. * guile.texi (Top): Add menu entry for Manual Conventions node. 2001-04-28 Neil Jerram * THANKS: Move authorship bit into AUTHORS, simplify structure, add Dirk Herrmann. * AUTHORS, guile.texi, guile-tut.texi, goops.texi, Makefile.am: Consolidate authorship information in AUTHORS file, and @include AUTHORS from the top level source file for each manual. 2001-04-28 Thien-Thi Nguyen * preface.texi (Manual Conventions): New chapter. 2001-04-26 Martin Grabmueller * srfi-13-14.texi (Reverse/Append): Updated procedure names for string-concatenate-reverse[/shared]. (Reverse/Append): Document the parameter `end' to string-concatenate-reverse. 2001-04-26 Neil Jerram * data-rep.texi (Defining New Types (Smobs)): Use non-deprecated smob interface. Thanks to Masao Uebayashi for the patch! (Creating Instances): Don't need SCM_NIMP anymore. 2001-04-25 Marius Vollmer * guile.1: New file, from Robert Merkel and Rob Browning. * Makefile.am (man_MANS, EXTRADIST): Added, but still commented out: install and distribute the manpage. It is not yet installed or distributed since we don't have Robert's papers yet. 2001-04-24 Neil Jerram * guile-tut.texi: Include version-tutorial.texi rather than version.texi. * Makefile.am ($(srcdir)/version-tutorial.texi): New target, to avoid having two files both include version.texi. 2001-04-24 Martin Grabmueller * Makefile.am (guile_TEXINFOS): Added srfi-13-14.texi. * srfi-13-14.texi: New file documenting SRFI-13/14. * guile.texi (Top): Added the SRFI-13/14 menu entry and @include. 2001-04-22 Neil Jerram * posix.texi (Network Sockets and Communication): Automatic docstring updates for `socket' and `connect'. (For IPV6 support.) * scheme-io.texi: Remove old docstring comments referring to r4rs.scm. * appendices.texi (The Basic Guile Package, Packages not shipped with Guile), env.texi (Switching to Environments), format.texi (Format Specification), gh.texi (Executing Scheme code, Calling Scheme procedures from C), guile-tut.texi (How to characterize Guile), scheme-data.texi (Symbols, Keywords, Keyword Read Syntax, Append/Reverse), scheme-evaluation.texi (Delayed Evaluation), scheme-modules.texi (Scheme and modules), scheme-io.texi (Soft Ports): Change R4RS references to R5RS. * r4rs.texi: Removed. * Makefile.am (info_TEXINFOS): Remove r4rs. * README: Note removal of r4rs, and provide a reference. * scheme-control.texi (Exceptions): Extended documentation. (Continuations): Correct "except" typo, and fix reference to Exceptions node. Plus minor review changes. 2001-04-20 Neil Jerram * scheme-control.texi (Exceptions): Reorganized and extended existing documentation; more to come. 2001-04-20 Martin Grabmueller * scheme-evaluation.texi (Comments): Document normal comments and comment conventions. (Block Comments): Documented multiline comments. (Case Sensitivity): Documented R5RS and Guile behaviour and how to switch it off. * scheme-control.texi (Continuations): Added some documentation for call/cc. (Exceptions): Added xref to `Continuations'. * scheme-binding.texi (Binding Reflection): Typo fix. 2001-04-20 Neil Jerram * gh.texi (Executing Scheme code): gh_eval_file returns SCM_UNSPECIFIED. Thanks to Dirk for the report! * data-rep.texi (Non-immediate Datatypes, Immediates vs Non-immediates): Emphasize current rather than pre-1.4 practice when talking about not needing to call SCM_NIMP. * recipe-guidelines.txt: New file: guidelines for contributions to the Guile Recipes manual. 2001-04-20 Martin Grabmueller * intro.texi (Using Guile Modules): Wrote intro to using modules. (Writing New Modules): New intro for writing modules. (Reporting Bugs): Added info about what is a bug and what to include in a bug report (taken and adapted from the Emacs Reference Manual). 2001-04-19 Martin Grabmueller * scheme-control.texi (while do): Added documentation for named let. * scheme-binding.texi (Internal Definitions): New explanation of `Internal Definitions'. (Top Level): Documented behaviour of top level definitions. (Binding Constructs): New introductory text. (Local Bindings): Explain concept of local bindings. Document let, let* and letrec. 2001-04-18 Martin Grabmueller * scheme-modules.texi (Modules): Added menu descriptions. (Scheme and modules, The Guile module system): Some whitespace cleanup (The Guile module system): Layout fixes, docstring fix for `define-module'. 2001-04-17 Martin Grabmueller * scheme-control.texi (Multiple Values): Documented concept of multiple values, added docs for `receive'. (begin): Documented `begin'. (if cond case): Documented `if', `cond' and `case'. (and or): Documented `and' and `or'. (while do): Documented `do' and `while'. * scheme-procedures.texi (Optional Arguments): Split the node, added introductory text, added menu for subsections. (let-optional Reference, let-keywords Reference), (lambda* Reference, define* Reference): Added syntax documentation for all exported procedures from (ice-9 optargs). 2001-04-17 Martin Grabmueller * scheme-utility.texi (General Conversion): New node, added `object->string'. (Equality): Added definition and explanation of `sameness'. * posix.texi (System Identification): Added `gethostname' and `sethostname'. (Processes): Added `setpriority' and `getpriority'. (User Information): Added `cuserid' and `getlogin'. (Ports and File Descriptors): Added `flock'. (Processes): Added `chroot'. (File System): Added `mkstemp!'. (Encryption): New node, added `crypt' and `getpass'. * new-docstrings.texi: Moved several docstrings over to the reference manual (see above which). * scheme-data.texi (Data Types), (Numerical Tower): Add explicit @bullet to @itemize to satisfy older `makeinfo'. 2001-04-16 Neil Jerram * data-rep.texi (Signalling Type Errors): Update SCM_ASSERT doc for recent changes to disallow passing a string parameter as the `pos'. Thanks to Dirk Herrmann for the patch! 2001-04-13 Neil Jerram * data-rep.texi (Unpacking the SCM type): New section, taken from Dirk Herrmann's description of SCM and scm_bits_t in api.txt. (Immediate Datatypes, Non-immediate Datatypes): Remove obsolete notes about needing to call SCM_NIMP. 2001-04-11 Neil Jerram * scheme-procedures.texi (Procedures with Setters): Fix dvi building syntax error. Thanks to Dale P. Smith for the report and patch. 2001-04-11 Martin Grabmueller * scheme-scheduling.texi (Arbiters): New explanatory text. (Asyncs): New explanations and documentation. (Scheduling): Added menu entry descriptions. (Fluids): New documentation. 2001-04-11 Martin Grabmueller * scheme-procedures.texi (Lambda): Documented the lambda form. (Procedure Properties): Concept and usage explanation added. (Procedures with Setters): Explain by example, introduce definitions. * scheme-data.texi (Symbols and Variables): Split and reorganized this section. (Symbols): New introductory text. (Characters): Added char-ci* procedures to rn index. 2001-04-10 Neil Jerram * scm.texi (Handling Errors): Improve Texinfo markup. Thanks to Dale P. Smith for the patch! * api.txt (Accessing Cell Entries): Fix typo. 2001-04-09 Neil Jerram * deprecated.texi (Shared And Read Only Strings): New section for deprecated string stuff. I've also updated the text a bit to reflect current usage of "read only" strings. * scheme-data.texi (Shared Substrings, Read Only Strings): Moved to deprecated.texi. * deprecated.texi, posix.texi, scheme-binding.texi, scheme-control.texi, scheme-data.texi, scheme-debug.texi, scheme-evaluation.texi, scheme-io.texi, scheme-memory.texi, scheme-modules.texi, scheme-options.texi, scheme-procedures.texi, scheme-scheduling.texi, scheme-translation.texi, scheme-utility.texi: Remove `@c docstring' comments, since they aren't used any more by the docstring tracking utilities. 2001-04-09 Martin Grabmueller * scheme-data.texi (Pairs): New data type and procedure description. (Lists): Added new subsections for grouping the list procedures. (Hooks): Added new nodes for hook subsections. (String Syntax): New node, factoring out read syntax. (Strings): Some blurb about allowed characters, zero-termination etc. (Keywords): Added menu descriptions. 2001-04-08 Martin Grabmueller * scheme-indices.texi (R5RS Index): Print index `rn', not `r5'. * guile.texi: The index formerly known as `r5' is now called `rn'. * scheme-utility.texi, scheme-procedures.texi, scheme-io.texi, scheme-evaluation.texi, scheme-control.texi, scheme-data.texi: Changed all @r5index entries to @rnindex. 2001-04-06 Martin Grabmueller * scheme-data.texi (Hooks): Added hook description and constraints. 2001-04-06 Thien-Thi Nguyen * scheme-scheduling.texi (Higher level thread procedures): Replace some instances of `@var' with `@code'. * scheme-scheduling.texi (Higher level thread procedures): Rewrite. 2001-04-04 Martin Grabmueller * scheme-data.texi (Alphabetic Case Mapping), (String Comparison): Rearranged function order. (Vectors): Reorganized, new introductory text, docs about read syntax. 2001-04-03 Martin Grabmueller * scheme-options.texi, scheme-procedures.texi, scheme-modules.texi, scheme-memory.texi, scheme-control.texi, scheme-utility.texi, scheme-io.texi, scheme-evaluation.texi, scheme-data.texi: Removed a lot of ARGFIXME's after tweaking docstrings and C source. * new-docstrings.texi, scheme-io.texi, scheme-data.texi, posix.texi, scheme-control.texi, scheme-evaluation.texi, scheme-memory.texi, scheme-procedures.texi, scheme-modules.texi, scheme-scheduling.texi: Automated docstring merging. 2001-04-02 Neil Jerram * data-rep.texi (Immediates vs. Non-immediates): Update out-of-date documentation. (Thanks to Dirk Herrmann for the report!) (Immediates vs Non-immediates): Renamed without the dot, since the dot causes `info' not to be able to display this node! * Makefile.am (guile_TEXINFOS): Add in a few more source files that had got left out. 2001-03-30 Neil Jerram * scheme-reading.texi (Further Reading): Add bullets to further reading list. * gh.texi: Insert page break before chapter. Remove page breaks within the chapter. * Makefile.am: Add script-getopt.texi. * guile.texi (Top): Include and link to new script-getopt.texi chapter. * script-getopt.texi: New chapter on command line handling. (Written and contributed by Martin Grabmueller, revised by me.) * intro.texi (Modules and Extensions): Fix typo. 2001-03-27 Martin Grabmueller * scheme-data.texi (Strings): Reorganized the whole `Strings' section and wrote introductory material for each new subsection. 2001-03-25 Marius Vollmer * intro.texi (Modules and Extensions): Some short text about dynamic libraries and modules. 2001-03-23 Neil Jerram * intro.texi (Writing Extensions for Guile), scheme-data.texi (Lists): Fix typos. * guile-tut.texi, ChangeLog-guile-doc-tutorial: Added to CVS. It seems that I somehow missed these out when I moved everything from guile-doc to guile-core. * posix.texi, scheme-data.texi, scheme-evaluation.texi, scheme-io.texi, scheme-memory.texi: Automatic docstring updates. * new-docstrings.texi: New file. Holds snarfed docstrings that have not yet been incorporated into the reference manual. 2001-03-20 Martin Grabmueller * scheme-options.texi (Evaluator options): Added evaluator options, corrected docs for evaluator trap options. * scheme-evaluation.texi (Scheme Read): New docs for read-options, read-enable, read-disable and read-set! and cross references to option nodes. (Evaluator Options): New docs for eval-options, eval-enable, eval-disable and eval-set!, traps, trap-enable, trap-disable and trap-set! and cross references to option nodes. (Evaluator Behaviour): Renamed node from `Evaluator options' to avoid name clash. * scheme-io.texi (String Ports): Added docs for SRFI-6 procedures. (Void Ports): Corrected introductory comment. 2001-03-16 Martin Grabmueller * scheme-data.texi (Arithmetic): Documented the arithmetic procedures. (Integer Operations): Added documentation. (Comparison): Added documentation. (Complex): Added documentation. (Symbols and Variables): Comment out `builtin-bindings', which is removed according to NEWS. (Pairs): Added documentation. * scheme-io.texi: Added R5RS index entries for all R5RS procedures. (File Ports): New docs for `call-with-input-file', `call-with-output-file', `with-input-from-file', `with-output-to-file', `with-error-to-file'. * scheme-control.texi, scheme-utility.texi, * scheme-procedures.texi: Added R5RS index entries for all R5RS procedures. * scheme-evaluation.texi (Fly Evaluation): Added documentation for `apply'. Added R5RS index entries for all R5RS procedures. * scheme-data.texi: Added R5RS index entries for all R5RS procedures. Removed R5RS index entries for `ass{q,v,occ}-set!'. Removed explicit entries into the function entries. They are automagic. (Vectors): Added documentation for `make-vector', `vector-ref' and `vector-set!'. 2001-03-12 Marius Vollmer * intro.texi: Changed to reflect current practice better. Added stuff about writing Guile Extensions (aka dynamically loaded shared libraries). 2001-03-09 Mikael Djurfeldt * goops.texi (VERSION): Bumped to version 0.3. * goops-tutorial.texi, goops.texi: Updated to reflect new define-method syntax. 2001-03-09 Neil Jerram * Makefile.am: Change HTML to HTMLDOC, now that we're part of a wider distribution. Moving documentation files from guile-doc and guile-doc into guile-core/doc: * env.texi, indices.texi, mbapi.texi, mltext.texi, scripts.texi, scsh.texi, tcltk.texi, hierarchy.txt, scheme-indices.texi, slib.texi, deprecated.texi, scheme-binding.texi, appendices.texi, scheme-intro.texi, goops.texi, extend.texi, gh.texi, intro.texi, preface.texi, scm.texi, goops-tutorial.texi, hierarchy.eps, r4rs.texi, r5rs.texi, texinfo.tex, scheme-reading.texi, data-rep.texi, scheme-utility.texi, posix.texi, scheme-control.texi, scheme-debug.texi, scheme-evaluation.texi, scheme-io.texi, scheme-memory.texi, scheme-modules.texi, scheme-options.texi, scheme-procedures.texi, scheme-scheduling.texi, scheme-translation.texi, guile.texi, scheme-data.texi, scheme-ideas.texi, expect.texi, ChangeLog-guile-doc-ref, guile-tut.texi, ChangeLog-guile-doc-tutorial, AUTHORS, BUGS, NEWS, THANKS: New files. * .cvsignore, Makefile.am, README: Merged. * sources: New subdirectory. Both the following files are about to be replaced by files from guile-doc/ref. * texinfo.tex: Removed. * data-rep.texi: Removed. 2001-02-15 Neil Jerram * README: Explain retirement of `data-rep.texi'. * Makefile.am (info_TEXINFOS, data_rep_TEXINFOS): Removed. * data-rep.texi: Replace this copy of data-rep.texi with a notice indicating that it has been retired. The master copy of data-rep.texi is at guile-doc/ref/data-rep.texi. 2001-02-04 Marius Vollmer * data-rep.texi: Use SCM_SMOB_DATA instead of SCM_CDR. Also things like SCM_SMOB_PREDICATE and SCM_NEWSMOB. Thanks to Dale P. Smith! 2000-10-25 Mikael Djurfeldt * mop.text: Preliminary documentation of the GOOPS meta object protocol. 2000-07-28 Neil Jerram * data-rep.texi (Garbage Collection): Fix "accomodate" spelling mistake. 2000-06-30 Dirk Herrmann * data-rep.tex: Removed documentation for SCM_OUTOFRANGE. 2000-06-20 Mikael Djurfeldt * data-rep.texi: Center discussion around the standard interface for smob type creation (scm_make_smob_type) and warn about the ongoing discussion which may result in deprecating scm_make_smob_type_mfpe in next release of Guile. 2000-05-15 Dirk Herrmann * data-rep.texi: Updated the macro names for operating on characters. 2000-03-22 Dirk Herrmann * api.txt: Added a first attempt for a description of the newly designed low level API. 2000-01-31 Marius Vollmer * Makefile.am (version.texi): Override automake's rule for version.texi so that it gets created even in non-maintainer-mode. Thu Jan 20 13:00:18 2000 Greg J. Badros * version.texi, stamp-vti: Removed -- these are auto-generated. 2000-01-12 Mikael Djurfeldt * Makefile.am (dist-hook): Updated to include oldfmt.c in distribution archive. * README: Updated with note about oldfmt.c. * oldfmt.c: New file: Used by application writers to adapt to new-style error format strings. 1999-12-06 Gary Houston * data-rep.texi: change dircategory to match change in guile-doc and scm. 1999-10-05 Jim Blandy * Makefile.in: Deleted from CVS repository. Run the autogen.sh script to create generated files like this one. 1999-09-11 Jim Blandy * Makefile.in: Regenerated. Fri Jun 25 22:21:43 1999 Greg Badros * data-rep.texi: Updated SMOB docs to talk about scm_make_smob_type_mfpe, SCM_RETURN_NEWSMOB, SCM_NEWSMOB function and macros. 1999-04-17 Jim Blandy * Makefile.in: Regenerated. 1998-10-19 Jim Blandy * COPYING: New file. * Makefile.in: Regenerated. * Makefile.am (EXAMPLE_SMOB_FILES): List example-smob/COPYING. * Makefile.in: Regenerated. 1998-10-16 Jim Blandy * Makefile.in: Regenerated, after change to qthreads.m4. 1998-10-15 Jim Blandy * stamp-vti: Regenerated. * hacks.el: Some handy helper functions for working on the manual. * data-rep.texi: Extended to accomodate a full running example, provided with the manual. * example-smob: A new subdirectory, containing example files for the manual chapter on smobs. * Makefile.am (EXAMPLE_SMOB_FILES, dist-hook): New variable and target, to get the example-smob directory into the distribution. * Makefile.in: Regenerated. 1998-10-08 Jim Blandy * .cvsignore: New file, containing data-rep.info. I'm not sure whether we want to check this file into CVS, because it's generated; if you find compelling reasons it should be, let me know. 1998-10-07 Jim Blandy * New directory for documentation. * README: New file. * data-rep.texi: It's not a real manual, but it's better than nothing. * Makefile.am, Makefile.in, data-rep.info, data-rep.texi, mdate-sh, stamp-vti, texinfo.tex, version.texi: The usual support files. guile-1.8-1.8.8+1.orig/doc/ChangeLog-guile-doc000066400000000000000000000025321155472604000204270ustar00rootroot000000000000002001-02-15 Neil Jerram * sources/data-rep.texi: Removed. (ref/data-rep.texi is now the current version of this essay.) 2001-01-26 Neil Jerram * configure.in: Only check for `texi2html' program if HTML is enabled, and explain where to get `texi2html' from if the check fails. * configure.in, Makefile.am, ref/Makefile.am, tutorial/Makefile.am: Clean up Makefile.am's and support (configurable) building of HTML documentation in addition to Info. Thanks to Steve Tell for the patch on which these changes were based. 2000-10-14 Neil Jerram * sources/data-rep.texi: Merged a lot of changes from guile-core/doc/data-rep.texi. 2000-08-07 Neil Jerram * configure.in, configure: Advance version number to 1.4. 2000-07-28 Neil Jerram * sources/data-rep.texi (Garbage Collection): Fix "accomodate" spelling mistake. 1998-07-27 Mark Galassi * simple test 1998-04-13 Marius Vollmer Have "make dist" include the sources directory: * Makefile.am: Added "sources" directory to SUBDIRS. * sources/Makefile.am: New file. * configure.in: Added "sources/Makefile" to AC_OUTPUT. Sun Jun 22 18:38:28 1997 Tim Pierce New documentation module. guile-1.8-1.8.8+1.orig/doc/Makefile.am000066400000000000000000000027611155472604000170470ustar00rootroot00000000000000## Process this file with Automake to create Makefile.in ## ## Copyright (C) 1998, 2002, 2006, 2008 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA AUTOMAKE_OPTIONS = gnu SUBDIRS = ref tutorial goops r5rs dist_man1_MANS = guile.1 EXAMPLE_SMOB_FILES = \ ChangeLog-2008 Makefile README image-type.c image-type.h myguile.c OLDFMT = oldfmt.c dist-hook: cp $(srcdir)/$(OLDFMT) $(distdir)/ mkdir $(distdir)/example-smob for f in $(EXAMPLE_SMOB_FILES); do \ cp $(srcdir)/example-smob/$$f $(distdir)/example-smob/; \ done EXTRA_DIST = groupings.alist ChangeLog-2008 # guile-api.alist include $(top_srcdir)/am/maintainer-dirs guile-api.alist: guile-api.alist-FORCE ( cd $(top_builddir) ; $(mscripts)/update-guile-api.alist ) guile-api.alist-FORCE: guile-1.8-1.8.8+1.orig/doc/NEWS000066400000000000000000000031521155472604000155050ustar00rootroot00000000000000Guile-doc NEWS --- history of user-visible changes. -*- text -*- Copyright (C) 1997, 2001, 2006 Free Software Foundation, Inc. See the end for copying conditions. Changes since Guile 1.3.4: * It's now possible to build HTML documentation as well as Info The guile-doc distribution now supports building HTML versions of the Guile tutorial and reference manual, in addition to the standard Info documentation. To enable this, include the `--enable-html' option when you run `./configure': ./configure --enable-html HTML documentation is installed in $(prefix)/html/guile-$(VERSION). Changes since Guile 1.0 (Sun 5 Jan 1997): * The current documentation approach, recommended by Jim Blandy, is to have: (*) a tutorial with the pedagogical style of guile-user, and a non-dry reference manual in the style of the most excellent GNU libc reference manual: the reference manual should be complete, but at the same time it should have an introductory screen for each major topic, which can be referenced if the user goes "up" a level in the info documentation. Copyright information: Copyright (C) 1996,1997, 2006 Free Software Foundation, Inc. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. guile-1.8-1.8.8+1.orig/doc/README000066400000000000000000000024661155472604000156750ustar00rootroot00000000000000This directory contains documentation on the Guile core. -*-text-*- The documentation consists of the following manuals. - The Guile Tutorial (guile-tut.texi) contains a tutorial introduction to using Guile. - The Guile Reference Manual (guile.texi) contains (or is intended to contain) reference documentation on all aspects of Guile. - The GOOPS Manual (goops.texi) contains both tutorial-style and reference documentation for using GOOPS, Guile's Object Oriented Programming System. - The Revised^5 Report on the Algorithmic Language Scheme (r5rs.texi). Please be aware that this is all very much work in progress (apart from the Revised^5 Report). Bug reports and contributions are welcome! The file `oldfmt.c' contains a function which can be used by application writers to support both old-style and new-style error format strings. The `sources' directory includes some stuff relevant to the Guile reference manual, and which may eventually be folded in to it. It's not immediately relevant, however, which is why it's not in this directory. The Revised^4 Report (r4rs.texi) is no longer in this distribution, as it is completely superseded by the Revised^5 Report. If you need to consult R4RS, it is still widely available, for example at http://www-swiss.ai.mit.edu/projects/info/SchemeDocs/r4rs/. guile-1.8-1.8.8+1.orig/doc/THANKS000066400000000000000000000005751155472604000157270ustar00rootroot00000000000000Many thanks to the following people for contributing to the Guile manuals! Proofreading, bug reports and patches from: Chris Bitmead Christopher Cramer Marcus Daniels Dirk Herrmann Dale P. Smith Steve Tell Lee Thomas Masao Uebayashi Joel Weber Keith Wright New entries from: Per Bothner Martin Grabmueller Thien Thi Nguyen guile-1.8-1.8.8+1.orig/doc/example-smob/000077500000000000000000000000001155472604000173765ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/doc/example-smob/ChangeLog-2008000066400000000000000000000033751155472604000215470ustar00rootroot000000000000002008-01-22 Neil Jerram * COPYING: Removed. 2004-09-24 Marius Vollmer * image-type.c: Updated from manual. 2002-02-28 Marius Vollmer * image-type.c (image_tag): Changed type to scm_t_bits. (make_image): Use scm_gc_malloc instead of scm_must_malloc. (free_image): Use scm_gc_free instead of free. Return zero. 2001-05-30 Martin Grabmueller * image-type.c: Adapted to new typing and naming convention. 2001-04-26 Neil Jerram * image-type.c (make_image): Don't need to use SCM_NIMP before SCM_STRINGP. (clear_image): Use SCM_SMOB_PREDICATE. (clear_image, mark_image, free_image, print_image): Use SCM_SMOB_DATA rather than SCM_CDR. 2000-06-20 Mikael Djurfeldt * image-type.c: Removed unused scm_smobfuns structure. (init_image_type): Use standard smob type interface. Fri Jun 25 22:21:04 1999 Greg Badros * image-type.c: Updated example to use scm_make_smob_type_mfpe, SCM_RETURN_NEWSMOB, SCM_NEWSMOB function and macros. 1998-10-19 Jim Blandy * image-type.c, myguile.c: Terminate copyright comments. * COPYING: New file. * image-type.c myguile.c: Add copyright notice. 1998-10-16 Jim Blandy * Makefile (myguile): Fix link command, to put the Guile libraries after the object files. The old command worked on my machine, but I don't see how. 1998-10-15 Jim Blandy Created this directory for the Guile 1.3 release. Thanks to Jay Glascoe for suggesting that we provide a complete, buildable example! * ChangeLog, Makefile, README, image-type.c, image-type.h, myguile: New files. guile-1.8-1.8.8+1.orig/doc/example-smob/README000066400000000000000000000004551155472604000202620ustar00rootroot00000000000000This is the example code for the ``Defining New Types (Smobs)'' chapter of the Guile manual. When you try to execute the code, if the system complains that it can't find libguile.so, you need to add the directory containing the installed Guile libraries to your LD_LIBRARY_PATH environment variable. guile-1.8-1.8.8+1.orig/doc/example-smob/image-type.c000066400000000000000000000065601155472604000216120ustar00rootroot00000000000000/* image-type.c * * Copyright (C) 1998, 2000, 2004, 2006 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA */ #include #include static scm_t_bits image_tag; struct image { int width, height; char *pixels; /* The name of this image */ SCM name; /* A function to call when this image is modified, e.g., to update the screen, or SCM_BOOL_F if no action necessary */ SCM update_func; }; static SCM make_image (SCM name, SCM s_width, SCM s_height) { SCM smob; struct image *image; int width = scm_to_int (s_width); int height = scm_to_int (s_height); /* Step 1: Allocate the memory block. */ image = (struct image *) scm_gc_malloc (sizeof (struct image), "image"); /* Step 2: Initialize it with straight code. */ image->width = width; image->height = height; image->pixels = NULL; image->name = SCM_BOOL_F; image->update_func = SCM_BOOL_F; /* Step 3: Create the smob. */ SCM_NEWSMOB (smob, image_tag, image); /* Step 4: Finish the initialization. */ image->name = name; image->pixels = scm_gc_malloc (width * height, "image pixels"); return smob; } SCM clear_image (SCM image_smob) { int area; struct image *image; scm_assert_smob_type (image_tag, image_smob); image = (struct image *) SCM_SMOB_DATA (image_smob); area = image->width * image->height; memset (image->pixels, 0, area); /* Invoke the image's update function. */ if (scm_is_true (image->update_func)) scm_call_0 (image->update_func); scm_remember_upto_here_1 (image_smob); return SCM_UNSPECIFIED; } static SCM mark_image (SCM image_smob) { /* Mark the image's name and update function. */ struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); scm_gc_mark (image->name); return image->update_func; } static size_t free_image (SCM image_smob) { struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); scm_gc_free (image->pixels, image->width * image->height, "image pixels"); scm_gc_free (image, sizeof (struct image), "image"); return 0; } static int print_image (SCM image_smob, SCM port, scm_print_state *pstate) { struct image *image = (struct image *) SCM_SMOB_DATA (image_smob); scm_puts ("#name, port); scm_puts (">", port); /* non-zero means success */ return 1; } void init_image_type (void) { image_tag = scm_make_smob_type ("image", sizeof (struct image)); scm_set_smob_mark (image_tag, mark_image); scm_set_smob_free (image_tag, free_image); scm_set_smob_print (image_tag, print_image); scm_c_define_gsubr ("clear-image", 1, 0, 0, clear_image); scm_c_define_gsubr ("make-image", 3, 0, 0, make_image); } guile-1.8-1.8.8+1.orig/doc/example-smob/image-type.h000066400000000000000000000000701155472604000216050ustar00rootroot00000000000000/* file "image-type.h" */ void init_image_type (void); guile-1.8-1.8.8+1.orig/doc/example-smob/myguile.c000066400000000000000000000021601155472604000212140ustar00rootroot00000000000000/* myguile.c * * Copyright (C) 1998, 2006 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA */ #include #include "image-type.h" static void inner_main (void *closure, int argc, char **argv) { /* module initializations would go here */ init_image_type(); scm_shell (argc, argv); } int main (int argc, char **argv) { scm_boot_guile (argc, argv, inner_main, 0); return 0; /* never reached */ } guile-1.8-1.8.8+1.orig/doc/goops/000077500000000000000000000000001155472604000161345ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/doc/goops/ChangeLog-2008000066400000000000000000000044551155472604000203050ustar00rootroot000000000000002008-02-06 Neil Jerram * goops-tutorial.texi (Next-method): Minor improvements to the text. 2006-09-28 Neil Jerram * goops.texi (Slot Options): Added example from Ludovic Courtès about difference between init-value, -form and -thunk. 2006-04-21 Kevin Ryde * hierarchy.pdf: New file, converted from hierarchy.eps using epstopdf, to let "make pdf" work. * Makefile.am: (goops_TEXINFOS): Add it. 2006-03-08 Ludovic Courtès * goops.texi (Slot Options): Note init-value is shared. 2006-02-06 Marius Vollmer * goops.texi (Basic Generic Function Creation): Added blurb about merge-generics duplicates handler from NEWS. 2004-06-28 Marius Vollmer * Makefile.am: Removed home-grown code for HTML generation. Automake does it for us now. (goops_TEXINFOS): Added hierarchy.png * hierarchy.png: New file. 2004-05-19 Kevin Ryde * Makefile.am (CLEANFILES): Remove, goops.tmp goops.cps cleaned by automake these days. 2003-04-17 Mikael Djurfeldt * goops.texi (Object Comparisons): Removed object-eqv? and object-equal? and added eqv?, equal? and =. 2003-01-10 Mikael Djurfeldt * goops.texi (Class Redefinition): Clarifications; Removed mentioning of change-object-class. 2002-11-07 Neil Jerram * goops.texi (Top): Say "Indices" before index nodes in main menu. (Index): Removed (it was empty). Generally remove unnecessary padding text that looks bad in HTML. 2002-04-17 Marius Vollmer * Makefile.am (CLEANFILES): Added goops.tmp, goops.cps. 2001-12-03 Thien-Thi Nguyen * goops.texi: Grammar fix. 2001-08-27 Neil Jerram * Makefile.am (goops_TEXINFOS): Remove ../AUTHORS. (TEXINFO_TEX): Added; avoids shipping multiple copies of texinfo.tex in a single distribution. * goops.texi: Incorporate text previously in separate AUTHORS file. 2001-08-27 Neil Jerram The change log for files in this directory continues backwards from 2001-08-27 in ../ChangeLog, as all the Guile documentation prior to this date was contained in a single directory. guile-1.8-1.8.8+1.orig/doc/goops/Makefile.am000066400000000000000000000021021155472604000201630ustar00rootroot00000000000000## Process this file with Automake to create Makefile.in ## ## Copyright (C) 1998, 2004, 2006, 2008 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA AUTOMAKE_OPTIONS = gnu info_TEXINFOS = goops.texi goops_TEXINFOS = goops-tutorial.texi \ hierarchy.eps hierarchy.png hierarchy.txt hierarchy.pdf EXTRA_DIST = ChangeLog-2008 guile-1.8-1.8.8+1.orig/doc/goops/goops-tutorial.texi000066400000000000000000000673731155472604000220370ustar00rootroot00000000000000@c Original attribution: @c @c STk Reference manual (Appendix: An Introduction to STklos) @c @c Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI @c Permission to use, copy, modify, distribute,and license this @c software and its documentation for any purpose is hereby granted, @c provided that existing copyright notices are retained in all @c copies and that this notice is included verbatim in any @c distributions. No written agreement, license, or royalty fee is @c required for any of the authorized uses. @c This software is provided ``AS IS'' without express or implied @c warranty. @c @c Adapted for use in Guile with the authors permission @c @macro goops @c was {\stklos} @c GOOPS @c @end macro @c @macro guile @c was {\stk} @c Guile @c @end macro This is chapter was originally written by Erick Gallesio as an appendix for the STk reference manual, and subsequently adapted to @goops{}. @menu * Copyright:: * Intro:: * Class definition and instantiation:: * Inheritance:: * Generic functions:: @end menu @node Copyright, Intro, Tutorial, Tutorial @section Copyright Original attribution: STk Reference manual (Appendix: An Introduction to STklos) Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI Permission to use, copy, modify, distribute,and license this software and its documentation for any purpose is hereby granted, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. This software is provided ``AS IS'' without express or implied warranty. Adapted for use in Guile with the authors permission @node Intro, Class definition and instantiation, Copyright, Tutorial @section Introduction @goops{} is the object oriented extension to @guile{}. Its implementation is derived from @w{STk-3.99.3} by Erick Gallesio and version 1.3 of the Gregor Kiczales @cite{Tiny-Clos}. It is very close to CLOS, the Common Lisp Object System (@cite{CLtL2}) but is adapted for the Scheme language. Briefly stated, the @goops{} extension gives the user a full object oriented system with multiple inheritance and generic functions with multi-method dispatch. Furthermore, the implementation relies on a true meta object protocol, in the spirit of the one defined for CLOS (@cite{Gregor Kiczales: A Metaobject Protocol}). The purpose of this tutorial is to introduce briefly the @goops{} package and in no case will it replace the @goops{} reference manual (which needs to be urgently written now@ @dots{}). Note that the operations described in this tutorial resides in modules that may need to be imported before being available. The main module is imported by evaluating: @lisp (use-modules (oop goops)) @end lisp @findex (oop goops) @cindex main module @cindex loading @cindex preparing @node Class definition and instantiation, Inheritance, Intro, Tutorial @section Class definition and instantiation @menu * Class definition:: @end menu @node Class definition, , Class definition and instantiation, Class definition and instantiation @subsection Class definition A new class is defined with the @code{define-class}@footnote{Don't forget to import the @code{(oop goops)} module} macro. The syntax of @code{define-class} is close to CLOS @code{defclass}: @findex define-class @cindex class @lisp (define-class @var{class} (@var{superclass} @dots{}) @var{slot-description} @dots{} @var{class-option} @dots{}) @end lisp Class options will not be discussed in this tutorial. The list of @var{superclass}es specifies which classes to inherit properties from @var{class} (see @ref{Inheritance} for more details). A @var{slot-description} gives the name of a slot and, eventually, some ``properties'' of this slot (such as its initial value, the function which permit to access its value, @dots{}). Slot descriptions will be discussed in @ref{Slot description}. @cindex slot As an example, let us define a type for representation of complex numbers in terms of real numbers. This can be done with the following class definition: @lisp (define-class () r i) @end lisp This binds the variable @code{}@footnote{@code{} is in fact a builtin class in GOOPS. Because of this, GOOPS will create a new class. The old class will still serve as the type for Guile's native complex numbers.} to a new class whose instances contain two slots. These slots are called @code{r} an @code{i} and we suppose here that they contain respectively the real part and the imaginary part of a complex number. Note that this class inherits from @code{} which is a pre-defined class. (@code{} is the direct super class of the pre-defined class @code{} which, in turn, is the super class of @code{} which is the super of @code{}.)@footnote{With the new definition of @code{}, a @code{} is not a @code{} since @code{} inherits from @code{ } rather than @code{}. In practice, inheritance could be modified @emph{a posteriori}, if needed. However, this necessitates some knowledge of the meta object protocol and it will not be shown in this document}. @node Inheritance, Generic functions, Class definition and instantiation, Tutorial @section Inheritance @c \label{inheritance} @menu * Class hierarchy and inheritance of slots:: * Instance creation and slot access:: * Slot description:: * Class precedence list:: @end menu @node Class hierarchy and inheritance of slots, Instance creation and slot access, Inheritance, Inheritance @subsection Class hierarchy and inheritance of slots Inheritance is specified upon class definition. As said in the introduction, @goops{} supports multiple inheritance. Here are some class definitions: @lisp (define-class A () a) (define-class B () b) (define-class C () c) (define-class D (A B) d a) (define-class E (A C) e c) (define-class F (D E) f) @end lisp @code{A}, @code{B}, @code{C} have a null list of super classes. In this case, the system will replace it by the list which only contains @code{}, the root of all the classes defined by @code{define-class}. @code{D}, @code{E}, @code{F} use multiple inheritance: each class inherits from two previously defined classes. Those class definitions define a hierarchy which is shown in Figure@ 1. In this figure, the class @code{} is also shown; this class is the super class of all Scheme objects. In particular, @code{} is the super class of all standard Scheme types. @example @group @image{hierarchy} @center @emph{Fig 1: A class hierarchy} @iftex @emph{(@code{} which is the direct subclass of @code{} and the direct superclass of @code{} has been omitted in this figure.)} @end iftex @end group @end example The set of slots of a given class is calculated by taking the union of the slots of all its super class. For instance, each instance of the class D, defined before will have three slots (@code{a}, @code{b} and @code{d}). The slots of a class can be obtained by the @code{class-slots} primitive. For instance, @lisp (class-slots A) @result{} ((a)) (class-slots E) @result{} ((a) (e) (c)) (class-slots F) @result{} ((e) (c) (b) (d) (a) (f)) @c used to be ((d) (a) (b) (c) (f)) @end lisp @emph{Note: } The order of slots is not significant. @node Instance creation and slot access, Slot description, Class hierarchy and inheritance of slots, Inheritance @subsection Instance creation and slot access Creation of an instance of a previously defined class can be done with the @code{make} procedure. This procedure takes one mandatory parameter which is the class of the instance which must be created and a list of optional arguments. Optional arguments are generally used to initialize some slots of the newly created instance. For instance, the following form @findex make @cindex instance @lisp (define c (make )) @end lisp will create a new @code{} object and will bind it to the @code{c} Scheme variable. Accessing the slots of the new complex number can be done with the @code{slot-ref} and the @code{slot-set!} primitives. @code{Slot-set!} primitive permits to set the value of an object slot and @code{slot-ref} permits to get its value. @findex slot-set! @findex slot-ref @lisp @group (slot-set! c 'r 10) (slot-set! c 'i 3) (slot-ref c 'r) @result{} 10 (slot-ref c 'i) @result{} 3 @end group @end lisp Using the @code{describe} function is a simple way to see all the slots of an object at one time: this function prints all the slots of an object on the standard output. First load the module @code{(oop goops describe)}: @example @code{(use-modules (oop goops describe))} @end example The expression @smalllisp (describe c) @end smalllisp will now print the following information on the standard output: @lisp #< 401d8638> is an instance of class Slots are: r = 10 i = 3 @end lisp @node Slot description, Class precedence list, Instance creation and slot access, Inheritance @subsection Slot description @c \label{slot-description} When specifying a slot, a set of options can be given to the system. Each option is specified with a keyword. The list of authorized keywords is given below: @cindex keyword @itemize @bullet @item @code{#:init-value} permits to supply a default value for the slot. This default value is obtained by evaluating the form given after the @code{#:init-form} in the global environment, at class definition time. @cindex default slot value @findex #:init-value @cindex top level environment @item @code{#:init-thunk} permits to supply a thunk that will provide a default value for the slot. The value is obtained by evaluating the thunk a instance creation time. @c CHECKME: in the global environment? @findex default slot value @findex #:init-thunk @cindex top level environment @item @code{#:init-keyword} permits to specify the keyword for initializing a slot. The init-keyword may be provided during instance creation (i.e. in the @code{make} optional parameter list). Specifying such a keyword during instance initialization will supersede the default slot initialization possibly given with @code{#:init-form}. @findex #:init-keyword @item @code{#:getter} permits to supply the name for the slot getter. The name binding is done in the environment of the @code{define-class} macro. @findex #:getter @cindex top level environment @cindex getter @item @code{#:setter} permits to supply the name for the slot setter. The name binding is done in the environment of the @code{define-class} macro. @findex #:setter @cindex top level environment @cindex setter @item @code{#:accessor} permits to supply the name for the slot accessor. The name binding is done in the global environment. An accessor permits to get and set the value of a slot. Setting the value of a slot is done with the extended version of @code{set!}. @findex set! @findex #:accessor @cindex top level environment @cindex accessor @item @code{#:allocation} permits to specify how storage for the slot is allocated. Three kinds of allocation are provided. They are described below: @itemize @minus @item @code{#:instance} indicates that each instance gets its own storage for the slot. This is the default. @item @code{#:class} indicates that there is one storage location used by all the direct and indirect instances of the class. This permits to define a kind of global variable which can be accessed only by (in)direct instances of the class which defines this slot. @item @code{#:each-subclass} indicates that there is one storage location used by all the direct instances of the class. In other words, if two classes are not siblings in the class hierarchy, they will not see the same value. @item @code{#:virtual} indicates that no storage will be allocated for this slot. It is up to the user to define a getter and a setter function for this slot. Those functions must be defined with the @code{#:slot-ref} and @code{#:slot-set!} options. See the example below. @findex #:slot-set! @findex #:slot-ref @findex #:virtual @findex #:class @findex #:each-subclass @findex #:instance @findex #:allocation @end itemize @end itemize To illustrate slot description, we shall redefine the @code{} class seen before. A definition could be: @lisp (define-class () (r #:init-value 0 #:getter get-r #:setter set-r! #:init-keyword #:r) (i #:init-value 0 #:getter get-i #:setter set-i! #:init-keyword #:i)) @end lisp With this definition, the @code{r} and @code{i} slot are set to 0 by default. Value of a slot can also be specified by calling @code{make} with the @code{#:r} and @code{#:i} keywords. Furthermore, the generic functions @code{get-r} and @code{set-r!} (resp. @code{get-i} and @code{set-i!}) are automatically defined by the system to read and write the @code{r} (resp. @code{i}) slot. @lisp (define c1 (make #:r 1 #:i 2)) (get-r c1) @result{} 1 (set-r! c1 12) (get-r c1) @result{} 12 (define c2 (make #:r 2)) (get-r c2) @result{} 2 (get-i c2) @result{} 0 @end lisp Accessors provide an uniform access for reading and writing an object slot. Writing a slot is done with an extended form of @code{set!} which is close to the Common Lisp @code{setf} macro. So, another definition of the previous @code{} class, using the @code{#:accessor} option, could be: @findex set! @lisp (define-class () (r #:init-value 0 #:accessor real-part #:init-keyword #:r) (i #:init-value 0 #:accessor imag-part #:init-keyword #:i)) @end lisp Using this class definition, reading the real part of the @code{c} complex can be done with: @lisp (real-part c) @end lisp and setting it to the value contained in the @code{new-value} variable can be done using the extended form of @code{set!}. @lisp (set! (real-part c) new-value) @end lisp Suppose now that we have to manipulate complex numbers with rectangular coordinates as well as with polar coordinates. One solution could be to have a definition of complex numbers which uses one particular representation and some conversion functions to pass from one representation to the other. A better solution uses virtual slots. A complete definition of the @code{} class using virtual slots is given in Figure@ 2. @example @group @lisp (define-class () ;; True slots use rectangular coordinates (r #:init-value 0 #:accessor real-part #:init-keyword #:r) (i #:init-value 0 #:accessor imag-part #:init-keyword #:i) ;; Virtual slots access do the conversion (m #:accessor magnitude #:init-keyword #:magn #:allocation #:virtual #:slot-ref (lambda (o) (let ((r (slot-ref o 'r)) (i (slot-ref o 'i))) (sqrt (+ (* r r) (* i i))))) #:slot-set! (lambda (o m) (let ((a (slot-ref o 'a))) (slot-set! o 'r (* m (cos a))) (slot-set! o 'i (* m (sin a)))))) (a #:accessor angle #:init-keyword #:angle #:allocation #:virtual #:slot-ref (lambda (o) (atan (slot-ref o 'i) (slot-ref o 'r))) #:slot-set! (lambda(o a) (let ((m (slot-ref o 'm))) (slot-set! o 'r (* m (cos a))) (slot-set! o 'i (* m (sin a))))))) @end lisp @center @emph{Fig 2: A @code{} number class definition using virtual slots} @end group @end example @sp 3 This class definition implements two real slots (@code{r} and @code{i}). Values of the @code{m} and @code{a} virtual slots are calculated from real slot values. Reading a virtual slot leads to the application of the function defined in the @code{#:slot-ref} option. Writing such a slot leads to the application of the function defined in the @code{#:slot-set!} option. For instance, the following expression @findex #:slot-set! @findex #:slot-ref @lisp (slot-set! c 'a 3) @end lisp permits to set the angle of the @code{c} complex number. This expression conducts, in fact, to the evaluation of the following expression @lisp ((lambda o m) (let ((m (slot-ref o 'm))) (slot-set! o 'r (* m (cos a))) (slot-set! o 'i (* m (sin a)))) c 3) @end lisp A more complete example is given below: @example @group @lisp (define c (make #:r 12 #:i 20)) (real-part c) @result{} 12 (angle c) @result{} 1.03037682652431 (slot-set! c 'i 10) (set! (real-part c) 1) (describe c) @result{} #< 401e9b58> is an instance of class Slots are: r = 1 i = 10 m = 10.0498756211209 a = 1.47112767430373 @end lisp @end group @end example Since initialization keywords have been defined for the four slots, we can now define the @code{make-rectangular} and @code{make-polar} standard Scheme primitives. @lisp (define make-rectangular (lambda (x y) (make #:r x #:i y))) (define make-polar (lambda (x y) (make #:magn x #:angle y))) @end lisp @node Class precedence list, , Slot description, Inheritance @subsection Class precedence list A class may have more than one superclass. @footnote{This section is an adaptation of Jeff Dalton's (J.Dalton@@ed.ac.uk) @cite{Brief introduction to CLOS}} With single inheritance (one superclass), it is easy to order the super classes from most to least specific. This is the rule: @display @cartouche Rule 1: Each class is more specific than its superclasses.@c was \bf @end cartouche @end display With multiple inheritance, ordering is harder. Suppose we have @lisp (define-class X () (x #:init-value 1)) (define-class Y () (x #:init-value 2)) (define-class Z (X Y) (@dots{})) @end lisp In this case, the @code{Z} class is more specific than the @code{X} or @code{Y} class for instances of @code{Z}. However, the @code{#:init-value} specified in @code{X} and @code{Y} leads to a problem: which one overrides the other? The rule in @goops{}, as in CLOS, is that the superclasses listed earlier are more specific than those listed later. So: @display @cartouche Rule 2: For a given class, superclasses listed earlier are more specific than those listed later. @end cartouche @end display These rules are used to compute a linear order for a class and all its superclasses, from most specific to least specific. This order is called the ``class precedence list'' of the class. Given these two rules, we can claim that the initial form for the @code{x} slot of previous example is 1 since the class @code{X} is placed before @code{Y} in class precedence list of @code{Z}. These two rules are not always enough to determine a unique order, however, but they give an idea of how things work. Taking the @code{F} class shown in Figure@ 1, the class precedence list is @example (f d e a c b ) @end example However, it is usually considered a bad idea for programmers to rely on exactly what the order is. If the order for some superclasses is important, it can be expressed directly in the class definition. The precedence list of a class can be obtained by the function @code{class-precedence-list}. This function returns a ordered list whose first element is the most specific class. For instance, @lisp (class-precedence-list B) @result{} (#< B 401b97c8> #< 401e4a10> #< 4026a9d8>) @end lisp However, this result is not too much readable; using the function @code{class-name} yields a clearer result: @lisp (map class-name (class-precedence-list B)) @result{} (B ) @end lisp @node Generic functions, , Inheritance, Tutorial @section Generic functions @menu * Generic functions and methods:: * Next-method:: * Example:: @end menu @node Generic functions and methods, Next-method, Generic functions, Generic functions @subsection Generic functions and methods @c \label{gf-n-methods} Neither @goops{} nor CLOS use the message mechanism for methods as most Object Oriented language do. Instead, they use the notion of @dfn{generic functions}. A generic function can be seen as a methods ``tanker''. When the evaluator requested the application of a generic function, all the methods of this generic function will be grabbed and the most specific among them will be applied. We say that a method @var{M} is @emph{more specific} than a method @var{M'} if the class of its parameters are more specific than the @var{M'} ones. To be more precise, when a generic function must be ``called'' the system will: @cindex generic function @enumerate @item search among all the generic function those which are applicable @item sort the list of applicable methods in the ``most specific'' order @item call the most specific method of this list (i.e. the first method of the sorted methods list). @end enumerate The definition of a generic function is done with the @code{define-generic} macro. Definition of a new method is done with the @code{define-method} macro. Note that @code{define-method} automatically defines the generic function if it has not been defined before. Consequently, most of the time, the @code{define-generic} needs not be used. @findex define-generic @findex define-method Consider the following definitions: @lisp (define-generic G) (define-method (G (a ) b) 'integer) (define-method (G (a ) b) 'real) (define-method (G a b) 'top) @end lisp The @code{define-generic} call defines @var{G} as a generic function. Note that the signature of the generic function is not given upon definition, contrarily to CLOS. This will permit methods with different signatures for a given generic function, as we shall see later. The three next lines define methods for the @var{G} generic function. Each method uses a sequence of @dfn{parameter specializers} that specify when the given method is applicable. A specializer permits to indicate the class a parameter must belong to (directly or indirectly) to be applicable. If no specializer is given, the system defaults it to @code{}. Thus, the first method definition is equivalent to @cindex parameter specializers @lisp (define-method (G (a ) (b )) 'integer) @end lisp Now, let us look at some possible calls to generic function @var{G}: @lisp (G 2 3) @result{} integer (G 2 #t) @result{} integer (G 1.2 'a) @result{} real @c (G #3 'a) @result{} real @c was {\sharpsign} (G #t #f) @result{} top (G 1 2 3) @result{} error (since no method exists for 3 parameters) @end lisp The preceding methods use only one specializer per parameter list. Of course, each parameter can use a specializer. In this case, the parameter list is scanned from left to right to determine the applicability of a method. Suppose we declare now @lisp (define-method (G (a ) (b )) 'integer-number) (define-method (G (a ) (b )) 'integer-real) (define-method (G (a ) (b )) 'integer-integer) (define-method (G a (b )) 'top-number) @end lisp In this case, @lisp (G 1 2) @result{} integer-integer (G 1 1.0) @result{} integer-real (G 1 #t) @result{} integer (G 'a 1) @result{} top-number @end lisp @node Next-method, Example, Generic functions and methods, Generic functions @subsection Next-method When you call a generic function, with a particular set of arguments, GOOPS builds a list of all the methods that are applicable to those arguments and orders them by how closely the method definitions match the actual argument types. It then calls the method at the top of this list. If the selected method's code wants to call on to the next method in this list, it can do so by using @code{next-method}. @lisp (define-method (Test (a )) (cons 'integer (next-method))) (define-method (Test (a )) (cons 'number (next-method))) (define-method (Test a) (list 'top)) @end lisp With these definitions, @lisp (Test 1) @result{} (integer number top) (Test 1.0) @result{} (number top) (Test #t) @result{} (top) @end lisp @code{next-method} is always called as just @code{(next-method)}. The arguments for the next method call are always implicit, and always the same as for the original method call. If you want to call on to a method with the same name but with a different set of arguments (as you might with overloaded methods in C++, for example), you do not use @code{next-method}, but instead simply write the new call as usual: @lisp (define-method (Test (a ) min max) (if (and (>= a min) (<= a max)) (display "Number is in range\n")) (Test a)) (Test 2 1 10) @print{} Number is in range @result{} (integer number top) @end lisp (You should be careful in this case that the @code{Test} calls do not lead to an infinite recursion, but this consideration is just the same as in Scheme code in general.) @node Example, , Next-method, Generic functions @subsection Example In this section we shall continue to define operations on the @code{} class defined in Figure@ 2. Suppose that we want to use it to implement complex numbers completely. For instance a definition for the addition of two complexes could be @lisp (define-method (new-+ (a ) (b )) (make-rectangular (+ (real-part a) (real-part b)) (+ (imag-part a) (imag-part b)))) @end lisp To be sure that the @code{+} used in the method @code{new-+} is the standard addition we can do: @lisp (define-generic new-+) (let ((+ +)) (define-method (new-+ (a ) (b )) (make-rectangular (+ (real-part a) (real-part b)) (+ (imag-part a) (imag-part b))))) @end lisp The @code{define-generic} ensures here that @code{new-+} will be defined in the global environment. Once this is done, we can add methods to the generic function @code{new-+} which make a closure on the @code{+} symbol. A complete writing of the @code{new-+} methods is shown in Figure@ 3. @example @group @lisp (define-generic new-+) (let ((+ +)) (define-method (new-+ (a ) (b )) (+ a b)) (define-method (new-+ (a ) (b )) (make-rectangular (+ a (real-part b)) (imag-part b))) (define-method (new-+ (a ) (b )) (make-rectangular (+ (real-part a) b) (imag-part a))) (define-method (new-+ (a ) (b )) (make-rectangular (+ (real-part a) (real-part b)) (+ (imag-part a) (imag-part b)))) (define-method (new-+ (a )) a) (define-method (new-+) 0) (define-method (new-+ . args) (new-+ (car args) (apply new-+ (cdr args))))) (set! + new-+) @end lisp @center @emph{Fig 3: Extending @code{+} for dealing with complex numbers} @end group @end example @sp 3 We use here the fact that generic function are not obliged to have the same number of parameters, contrarily to CLOS. The four first methods implement the dyadic addition. The fifth method says that the addition of a single element is this element itself. The sixth method says that using the addition with no parameter always return 0. The last method takes an arbitrary number of parameters@footnote{The parameter list for a @code{define-method} follows the conventions used for Scheme procedures. In particular it can use the dot notation or a symbol to denote an arbitrary number of parameters}. This method acts as a kind of @code{reduce}: it calls the dyadic addition on the @emph{car} of the list and on the result of applying it on its rest. To finish, the @code{set!} permits to redefine the @code{+} symbol to our extended addition. @sp 3 To terminate our implementation (integration?) of complex numbers, we can redefine standard Scheme predicates in the following manner: @lisp (define-method (complex? c ) #t) (define-method (complex? c) #f) (define-method (number? n ) #t) (define-method (number? n) #f) @dots{} @dots{} @end lisp Standard primitives in which complex numbers are involved could also be redefined in the same manner. guile-1.8-1.8.8+1.orig/doc/goops/goops.texi000066400000000000000000003143611155472604000201660ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename goops.info @settitle Goops Manual @set goops @setchapternewpage odd @paragraphindent 0 @c %**end of header @set VERSION 0.3 @dircategory The Algorithmic Language Scheme @direntry * GOOPS: (goops). The GOOPS reference manual. @end direntry @macro goops GOOPS @end macro @macro guile Guile @end macro @ifinfo This file documents GOOPS, an object oriented extension for Guile. Copyright (C) 1999, 2000, 2001, 2003, 2006 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @end ifinfo @c This title page illustrates only one of the @c two methods of forming a title page. @titlepage @title Goops Manual @subtitle For use with GOOPS @value{VERSION} @c AUTHORS @c The GOOPS tutorial was written by Christian Lynbech and Mikael @c Djurfeldt, who also wrote GOOPS itself. The GOOPS reference manual @c and MOP documentation were written by Neil Jerram and reviewed by @c Mikael Djurfeldt. @author Christian Lynbech @author @email{chl@@tbit.dk} @author @author Mikael Djurfeldt @author @email{djurfeldt@@nada.kth.se} @author @author Neil Jerram @author @email{neil@@ossau.uklinux.net} @c The following two commands @c start the copyright page. @page @vskip 0pt plus 1filll Copyright @copyright{} 1999, 2006 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @end titlepage @node Top, Introduction, (dir), (dir) @menu * Introduction:: * Getting Started:: * Reference Manual:: * MOP Specification:: * Tutorial:: * Concept Index:: * Function and Variable Index:: @end menu @iftex @chapter Preliminaries @end iftex @node Introduction, Getting Started, Top, Top @iftex @section Introduction @end iftex @ifnottex @chapter Introduction @end ifnottex @goops{} is the object oriented extension to @guile{}. Its implementation is derived from @w{STk-3.99.3} by Erick Gallesio and version 1.3 of Gregor Kiczales @cite{Tiny-Clos}. It is very close in spirit to CLOS, the Common Lisp Object System (@cite{CLtL2}) but is adapted for the Scheme language. While GOOPS is not compatible with any of these systems, GOOPS contains a compatibility module which allows for execution of STKlos programs. Briefly stated, the @goops{} extension gives the user a full object oriented system with multiple inheritance and generic functions with multi-method dispatch. Furthermore, the implementation relies on a true meta object protocol, in the spirit of the one defined for CLOS (@cite{Gregor Kiczales: A Metaobject Protocol}). @node Getting Started, Reference Manual, Introduction, Top @iftex @section Getting Started @end iftex @ifnottex @chapter Getting Started @end ifnottex @menu * Running GOOPS:: Examples of some basic GOOPS functionality. * Methods:: * User-defined types:: * Asking for the type of an object:: See further in the GOOPS tutorial available in this distribution in info (goops.info) and texinfo format. @end menu @node Running GOOPS, Methods, Getting Started, Getting Started @subsection Running GOOPS @enumerate @item Type @smalllisp guile-oops @end smalllisp You should now be at the Guile prompt ("guile> "). @item Type @smalllisp (use-modules (oop goops)) @end smalllisp to load GOOPS. (If your system supports dynamic loading, you should be able to do this not only from `guile-oops' but from an arbitrary Guile interpreter.) @end enumerate We're now ready to try some basic GOOPS functionality. @node Methods, User-defined types, Running GOOPS, Getting Started @subsection Methods @smalllisp @group (define-method (+ (x ) (y )) (string-append x y)) (+ 1 2) --> 3 (+ "abc" "de") --> "abcde" @end group @end smalllisp @node User-defined types, Asking for the type of an object, Methods, Getting Started @subsection User-defined types @smalllisp (define-class <2D-vector> () (x #:init-value 0 #:accessor x-component #:init-keyword #:x) (y #:init-value 0 #:accessor y-component #:init-keyword #:y)) @group (use-modules (ice-9 format)) (define-method (write (obj <2D-vector>) port) (display (format #f "<~S, ~S>" (x-component obj) (y-component obj)) port)) (define v (make <2D-vector> #:x 3 #:y 4)) v --> <3, 4> @end group @group (define-method (+ (x <2D-vector>) (y <2D-vector>)) (make <2D-vector> #:x (+ (x-component x) (x-component y)) #:y (+ (y-component x) (y-component y)))) (+ v v) --> <6, 8> @end group @end smalllisp @node Asking for the type of an object, , User-defined types, Getting Started @subsection Types @example (class-of v) --> #< <2D-vector> 40241ac0> <2D-vector> --> #< <2D-vector> 40241ac0> (class-of 1) --> #< 401b2a98> --> #< 401b2a98> (is-a? v <2D-vector>) --> #t @end example @node Reference Manual, MOP Specification, Getting Started, Top @chapter Reference Manual This chapter is the GOOPS reference manual. It aims to describe all the syntax, procedures, options and associated concepts that a typical application author would need to understand in order to use GOOPS effectively in their application. It also describes what is meant by the GOOPS ``metaobject protocol'' (aka ``MOP''), and indicates how authors can use the metaobject protocol to customize the behaviour of GOOPS itself. For a detailed specification of the GOOPS metaobject protocol, see @ref{MOP Specification}. @menu * Introductory Remarks:: * Defining New Classes:: * Creating Instances:: * Accessing Slots:: * Creating Generic Functions:: * Adding Methods to Generic Functions:: * Invoking Generic Functions:: * Redefining a Class:: * Changing the Class of an Instance:: * Introspection:: * Miscellaneous Functions:: @end menu @node Introductory Remarks @section Introductory Remarks GOOPS is an object-oriented programming system based on a ``metaobject protocol'' derived from the ones used in CLOS (the Common Lisp Object System), tiny-clos (a small Scheme implementation of a subset of CLOS functionality) and STKlos. GOOPS can be used by application authors at a basic level without any need to understand what the metaobject protocol (aka ``MOP'') is and how it works. On the other hand, the MOP underlies even the customizations that application authors are likely to make use of very quickly --- such as defining an @code{initialize} method to customize the initialization of instances of an application-defined class --- and an understanding of the MOP makes it much easier to explain such customizations in a precise way. And in the long run, understanding the MOP is the key both to understanding GOOPS at a deeper level and to taking full advantage of GOOPS' power, by customizing the behaviour of GOOPS itself. Each of the following sections of the reference manual is arranged such that the most basic usage is introduced first, and then subsequent subsections discuss the related internal functions and metaobject protocols, finishing with a description of how to customize that area of functionality. These introductory remarks continue with a few words about metaobjects and the MOP. Readers who do not want to be bothered yet with the MOP and customization could safely skip this subsection on a first reading, and should correspondingly skip subsequent subsections that are concerned with internals and customization. In general, this reference manual assumes familiarity with standard object oriented concepts and terminology. However, some of the terms used in GOOPS are less well known, so the Terminology subsection provides definitions for these terms. @menu * Metaobjects and the Metaobject Protocol:: * Terminology:: @end menu @node Metaobjects and the Metaobject Protocol @subsection Metaobjects and the Metaobject Protocol The conceptual building blocks of GOOPS are classes, slot definitions, instances, generic functions and methods. A class is a grouping of inheritance relations and slot definitions. An instance is an object with slots that are allocated following the rules implied by its class's superclasses and slot definitions. A generic function is a collection of methods and rules for determining which of those methods to apply when the generic function is invoked. A method is a procedure and a set of specializers that specify the type of arguments to which the procedure is applicable. Of these entities, GOOPS represents classes, generic functions and methods as ``metaobjects''. In other words, the values in a GOOPS program that describe classes, generic functions and methods, are themselves instances (or ``objects'') of special GOOPS classes that encapsulate the behaviour, respectively, of classes, generic functions, and methods. (The other two entities are slot definitions and instances. Slot definitions are not strictly instances, but every slot definition is associated with a GOOPS class that specifies the behaviour of the slot as regards accessibility and protection from garbage collection. Instances are of course objects in the usual sense, and there is no benefit from thinking of them as metaobjects.) The ``metaobject protocol'' (aka ``MOP'') is the specification of the generic functions which determine the behaviour of these metaobjects and the circumstances in which these generic functions are invoked. For a concrete example of what this means, consider how GOOPS calculates the set of slots for a class that is being defined using @code{define-class}. The desired set of slots is the union of the new class's direct slots and the slots of all its superclasses. But @code{define-class} itself does not perform this calculation. Instead, there is a method of the @code{initialize} generic function that is specialized for instances of type @code{}, and it is this method that performs the slot calculation. @code{initialize} is a generic function which GOOPS calls whenever a new instance is created, immediately after allocating memory for a new instance, in order to initialize the new instance's slots. The sequence of steps is as follows. @itemize @bullet @item @code{define-class} uses @code{make} to make a new instance of the @code{}, passing as initialization arguments the superclasses, slot definitions and class options that were specified in the @code{define-class} form. @item @code{make} allocates memory for the new instance, and then invokes the @code{initialize} generic function to initialize the new instance's slots. @item The @code{initialize} generic function applies the method that is specialized for instances of type @code{}, and this method performs the slot calculation. @end itemize In other words, rather than being hardcoded in @code{define-class}, the behaviour of class definition is encapsulated by generic function methods that are specialized for the class @code{}. It is possible to create a new class that inherits from @code{}, which is called a ``metaclass'', and to write a new @code{initialize} method that is specialized for instances of the new metaclass. Then, if the @code{define-class} form includes a @code{#:metaclass} class option whose value is the new metaclass, the class that is defined by the @code{define-class} form will be an instance of the new metaclass rather than of the default @code{}, and will be defined in accordance with the new @code{initialize} method. Thus the default slot calculation, as well as any other aspect of the new class's relationship with its superclasses, can be modified or overridden. In a similar way, the behaviour of generic functions can be modified or overridden by creating a new class that inherits from the standard generic function class @code{}, writing appropriate methods that are specialized to the new class, and creating new generic functions that are instances of the new class. The same is true for method metaobjects. And the same basic mechanism allows the application class author to write an @code{initialize} method that is specialized to their application class, to initialize instances of that class. Such is the power of the MOP. Note that @code{initialize} is just one of a large number of generic functions that can be customized to modify the behaviour of application objects and classes and of GOOPS itself. Each subsequent section of the reference manual covers a particular area of GOOPS functionality, and describes the generic functions that are relevant for customization of that area. We conclude this subsection by emphasizing a point that may seem obvious, but contrasts with the corresponding situation in some other MOP implementations, such as CLOS. The point is simply that an identifier which represents a GOOPS class or generic function is a variable with a first-class value, the value being an instance of class @code{} or @code{}. (In CLOS, on the other hand, a class identifier is a symbol that indexes the corresponding class metaobject in a separate namespace for classes.) This is, of course, simply an extension of the tendency in Scheme to avoid the unnecessary use of, on the one hand, syntactic forms that require unevaluated arguments and, on the other, separate identifier namespaces (e.g. for class names), but it is worth noting that GOOPS conforms fully to this Schemely principle. @node Terminology @subsection Terminology It is assumed that the reader is already familiar with standard object orientation concepts such as classes, objects/instances, inheritance/subclassing, generic functions and methods, encapsulation and polymorphism. This section explains some of the less well known concepts and terminology that GOOPS uses, which are assumed by the following sections of the reference manual. @menu * Metaclass:: * Class Precedence List:: * Accessor:: @end menu @node Metaclass @subsubsection Metaclass A @dfn{metaclass} is the class of an object which represents a GOOPS class. Put more succinctly, a metaclass is a class's class. Most GOOPS classes have the metaclass @code{} and, by default, any new class that is created using @code{define-class} has the metaclass @code{}. But what does this really mean? To find out, let's look in more detail at what happens when a new class is created using @code{define-class}: @example (define-class () . slots) @end example GOOPS actually expands the @code{define-class} form to something like this @example (define (class () . slots)) @end example and thence to @example (define (make #:supers (list ) #:slots slots)) @end example In other words, the value of @code{} is in fact an instance of the class @code{} with slot values specifying the superclasses and slot definitions for the class @code{}. (@code{#:supers} and @code{#:slots} are initialization keywords for the @code{dsupers} and @code{dslots} slots of the @code{} class.) In order to take advantage of the full power of the GOOPS metaobject protocol (@pxref{MOP Specification}), it is sometimes desirable to create a new class with a metaclass other than the default @code{}. This is done by writing: @example (define-class () slot @dots{} #:metaclass ) @end example GOOPS expands this to something like: @example (define (make #:supers (list ) #:slots slots)) @end example In this case, the value of @code{} is an instance of the more specialized class @code{}. Note that @code{} itself must previously have been defined as a subclass of @code{}. For a full discussion of when and how it is useful to define new metaclasses, see @ref{MOP Specification}. Now let's make an instance of @code{}: @example (define my-object (make ...)) @end example All of the following statements are correct expressions of the relationships between @code{my-object}, @code{}, @code{} and @code{}. @itemize @bullet @item @code{my-object} is an instance of the class @code{}. @item @code{} is an instance of the class @code{}. @item @code{} is an instance of the class @code{}. @item The class of @code{my-object} is @code{}. @item The metaclass of @code{my-object} is @code{}. @item The class of @code{} is @code{}. @item The metaclass of @code{} is @code{}. @item The class of @code{} is @code{}. @item The metaclass of @code{} is @code{}. @item @code{} is not a metaclass, since it is does not inherit from @code{}. @item @code{} is a metaclass, since it inherits from @code{}. @end itemize @node Class Precedence List @subsubsection Class Precedence List The @dfn{class precedence list} of a class is the list of all direct and indirect superclasses of that class, including the class itself. In the absence of multiple inheritance, the class precedence list is ordered straightforwardly, beginning with the class itself and ending with @code{}. For example, given this inheritance hierarchy: @example (define-class () @dots{}) (define-class () @dots{}) (define-class () @dots{}) @end example the class precedence list of would be @example ( ) @end example With multiple inheritance, the algorithm is a little more complicated. A full description is provided by the GOOPS Tutorial: see @ref{Class precedence list}. ``Class precedence list'' is often abbreviated, in documentation and Scheme variable names, to @dfn{cpl}. @node Accessor @subsubsection Accessor An @dfn{accessor} is a generic function with both reference and setter methods. @example (define-accessor perimeter) @end example Reference methods for an accessor are defined in the same way as generic function methods. @example (define-method (perimeter (s )) (* 4 (side-length s))) @end example Setter methods for an accessor are defined by specifying ``(setter )'' as the first parameter of the @code{define-method} call. @example (define-method ((setter perimeter) (s ) (n )) (set! (side-length s) (/ n 4))) @end example Once an appropriate setter method has been defined in this way, it can be invoked using the generalized @code{set!} syntax, as in: @example (set! (perimeter s1) 18.3) @end example @node Defining New Classes @section Defining New Classes [ *fixme* Somewhere in this manual there needs to be an introductory discussion about GOOPS classes, generic functions and methods, covering @itemize @bullet @item how classes encapsulate related items of data in @dfn{slots} @item why it is that, unlike in C++ and Java, a class does not encapsulate the methods that act upon the class (at least not in the C++/Java sense) @item how generic functions provide a more general solution that provides for dispatch on all argument types, and avoids idiosyncracies like C++'s friend classes @item how encapsulation in the sense of data- and code-hiding, or of distinguishing interface from implementation, is treated in Guile as an orthogonal concept to object orientation, and is the responsibility of the module system. @end itemize Some of this is covered in the Tutorial chapter, in @ref{Generic functions and methods} - perhaps the best solution would be to expand the discussion there. ] @menu * Basic Class Definition:: * Class Options:: * Slot Options:: * Class Definition Internals:: * Customizing Class Definition:: * STKlos Compatibility:: @end menu @node Basic Class Definition @subsection Basic Class Definition New classes are defined using the @code{define-class} syntax, with arguments that specify the classes that the new class should inherit from, the direct slots of the new class, and any required class options. @deffn syntax define-class name (super @dots{}) slot-definition @dots{} . options Define a class called @var{name} that inherits from @var{super}s, with direct slots defined by @var{slot-definition}s and class options @var{options}. The newly created class is bound to the variable name @var{name} in the current environment. Each @var{slot-definition} is either a symbol that names the slot or a list, @example (@var{slot-name-symbol} . @var{slot-options}) @end example where @var{slot-name-symbol} is a symbol and @var{slot-options} is a list with an even number of elements. The even-numbered elements of @var{slot-options} (counting from zero) are slot option keywords; the odd-numbered elements are the corresponding values for those keywords. @var{options} is a similarly structured list containing class option keywords and corresponding values. @end deffn The standard GOOPS class and slot options are described in the following subsections: see @ref{Class Options} and @ref{Slot Options}. Example 1. Define a class that combines two pre-existing classes by inheritance but adds no new slots. @example (define-class ( )) @end example Example 2. Define a @code{regular-polygon} class with slots for side length and number of sides that have default values and can be accessed via the generic functions @code{side-length} and @code{num-sides}. @example (define-class () (sl #:init-value 1 #:accessor side-length) (ns #:init-value 5 #:accessor num-sides)) @end example Example 3. Define a class whose behavior (and that of its instances) is customized via an application-defined metaclass. @example (define-class () (s #:init-value #f #:accessor state) ... #:metaclass ) @end example @node Class Options @subsection Class Options @deffn {class option} #:metaclass metaclass The @code{#:metaclass} class option specifies the metaclass of the class being defined. @var{metaclass} must be a class that inherits from @code{}. For an introduction to the use of metaclasses, see @ref{Metaobjects and the Metaobject Protocol} and @ref{Metaclass}. If the @code{#:metaclass} option is absent, GOOPS reuses or constructs a metaclass for the new class by calling @code{ensure-metaclass} (@pxref{Class Definition Internals,, ensure-metaclass}). @end deffn @deffn {class option} #:name name The @code{#:name} class option specifies the new class's name. This name is used to identify the class whenever related objects - the class itself, its instances and its subclasses - are printed. If the @code{#:name} option is absent, GOOPS uses the first argument to @code{define-class} as the class name. @end deffn @deffn {class option} #:environment environment *fixme* Not sure about this one, but I think that the @code{#:environment} option specifies the environment in which the class's getters and setters are computed and evaluated. If the @code{#:environment} option is not specified, the class's environment defaults to the top-level environment in which the @code{define-class} form appears. @end deffn @node Slot Options @subsection Slot Options @deffn {slot option} #:allocation allocation The @code{#:allocation} option tells GOOPS how to allocate storage for the slot. Possible values for @var{allocation} are @itemize @bullet @item @code{#:instance} Indicates that GOOPS should create separate storage for this slot in each new instance of the containing class (and its subclasses). @item @code{#:class} Indicates that GOOPS should create storage for this slot that is shared by all instances of the containing class (and its subclasses). In other words, a slot in class @var{C} with allocation @code{#:class} is shared by all @var{instance}s for which @code{(is-a? @var{instance} @var{c})}. @item @code{#:each-subclass} Indicates that GOOPS should create storage for this slot that is shared by all @emph{direct} instances of the containing class, and that whenever a subclass of the containing class is defined, GOOPS should create a new storage for the slot that is shared by all @emph{direct} instances of the subclass. In other words, a slot with allocation @code{#:each-subclass} is shared by all instances with the same @code{class-of}. @item @code{#:virtual} Indicates that GOOPS should not allocate storage for this slot. The slot definition must also include the @code{#:slot-ref} and @code{#:slot-set!} options to specify how to reference and set the value for this slot. @end itemize The default value is @code{#:instance}. Slot allocation options are processed when defining a new class by the generic function @code{compute-get-n-set}, which is specialized by the class's metaclass. Hence new types of slot allocation can be implemented by defining a new metaclass and a method for @code{compute-get-n-set} that is specialized for the new metaclass. For an example of how to do this, see @ref{Customizing Class Definition}. @end deffn @deffn {slot option} #:slot-ref getter @deffnx {slot option} #:slot-set! setter The @code{#:slot-ref} and @code{#:slot-set!} options must be specified if the slot allocation is @code{#:virtual}, and are ignored otherwise. @var{getter} should be a closure taking a single @var{instance} parameter that returns the current slot value. @var{setter} should be a closure taking two parameters - @var{instance} and @var{new-val} - that sets the slot value to @var{new-val}. @end deffn @deffn {slot option} #:getter getter @deffnx {slot option} #:setter setter @deffnx {slot option} #:accessor accessor These options, if present, tell GOOPS to create generic function and method definitions that can be used to get and set the slot value more conveniently than by using @code{slot-ref} and @code{slot-set!}. @var{getter} specifies a generic function to which GOOPS will add a method for getting the slot value. @var{setter} specifies a generic function to which GOOPS will add a method for setting the slot value. @var{accessor} specifies an accessor to which GOOPS will add methods for both getting and setting the slot value. So if a class includes a slot definition like this: @example (c #:getter get-count #:setter set-count #:accessor count) @end example GOOPS defines generic function methods such that the slot value can be referenced using either the getter or the accessor - @example (let ((current-count (get-count obj))) @dots{}) (let ((current-count (count obj))) @dots{}) @end example - and set using either the setter or the accessor - @example (set-count obj (+ 1 current-count)) (set! (count obj) (+ 1 current-count)) @end example Note that @itemize @bullet @item with an accessor, the slot value is set using the generalized @code{set!} syntax @item in practice, it is unusual for a slot to use all three of these options: read-only, write-only and read-write slots would typically use only @code{#:getter}, @code{#:setter} and @code{#:accessor} options respectively. @end itemize If the specified names are already bound in the top-level environment to values that cannot be upgraded to generic functions, those values are overwritten during evaluation of the @code{define-class} that contains the slot definition. For details, see @ref{Generic Function Internals,, ensure-generic}. @end deffn @deffn {slot option} #:init-value init-value @deffnx {slot option} #:init-form init-form @deffnx {slot option} #:init-thunk init-thunk @deffnx {slot option} #:init-keyword init-keyword These options provide various ways to specify how to initialize the slot's value at instance creation time. @var{init-value} is a fixed value (shared across all new instances of the class). @var{init-thunk} is a procedure of no arguments that is called when a new instance is created and should return the desired initial slot value. @var{init-form} is an unevaluated expression that gets evaluated when a new instance is created and should return the desired initial slot value. @var{init-keyword} is a keyword that can be used to pass an initial slot value to @code{make} when creating a new instance. Note that, since an @code{init-value} value is shared across all instances of a class, you should only use it when the initial value is an immutable value, like a constant. If you want to initialize a slot with a fresh, independently mutable value, you should use @code{init-thunk} or @code{init-form} instead. Consider the following example. @example (define-class () (hashtab #:init-value (make-hash-table))) @end example @noindent Here only one hash table is created and all instances of @code{} have their @code{hashtab} slot refer to it. In order to have each instance of @code{} refer to a new hash table, you should instead write: @example (define-class () (hashtab #:init-thunk make-hash-table)) @end example @noindent or: @example (define-class () (hashtab #:init-form (make-hash-table))) @end example If more than one of these options is specified for the same slot, the order of precedence, highest first is @itemize @bullet @item @code{#:init-keyword}, if @var{init-keyword} is present in the options passed to @code{make} @item @code{#:init-thunk}, @code{#:init-form} or @code{#:init-value}. @end itemize If the slot definition contains more than one initialization option of the same precedence, the later ones are ignored. If a slot is not initialized at all, its value is unbound. In general, slots that are shared between more than one instance are only initialized at new instance creation time if the slot value is unbound at that time. However, if the new instance creation specifies a valid init keyword and value for a shared slot, the slot is re-initialized regardless of its previous value. Note, however, that the power of GOOPS' metaobject protocol means that everything written here may be customized or overridden for particular classes! The slot initializations described here are performed by the least specialized method of the generic function @code{initialize}, whose signature is @example (define-method (initialize (object ) initargs) ...) @end example The initialization of instances of any given class can be customized by defining a @code{initialize} method that is specialized for that class, and the author of the specialized method may decide to call @code{next-method} - which will result in a call to the next less specialized @code{initialize} method - at any point within the specialized code, or maybe not at all. In general, therefore, the initialization mechanisms described here may be modified or overridden by more specialized code, or may not be supported at all for particular classes. @end deffn @node Class Definition Internals @subsection Class Definition Internals Implementation notes: @code{define-class} expands to an expression which @itemize @bullet @item checks that it is being evaluated only at top level @item defines any accessors that are implied by the @var{slot-definition}s @item uses @code{class} to create the new class (@pxref{Class Definition Internals,, class}) @item checks for a previous class definition for @var{name} and, if found, handles the redefinition by invoking @code{class-redefinition} (@pxref{Redefining a Class}). @end itemize @deffn syntax class name (super @dots{}) slot-definition @dots{} . options Return a newly created class that inherits from @var{super}s, with direct slots defined by @var{slot-definition}s and class options @var{options}. For the format of @var{slot-definition}s and @var{options}, see @ref{Basic Class Definition,, define-class}. @end deffn Implementation notes: @code{class} expands to an expression which @itemize @bullet @item processes the class and slot definition options to check that they are well-formed, to convert the @code{#:init-form} option to an @code{#:init-thunk} option, to supply a default environment parameter (the current top-level environment) and to evaluate all the bits that need to be evaluated @item calls @code{make-class} to create the class with the processed and evaluated parameters. @end itemize @deffn procedure make-class supers slots . options Return a newly created class that inherits from @var{supers}, with direct slots defined by @var{slots} and class options @var{options}. For the format of @var{slots} and @var{options}, see @ref{Basic Class Definition,, define-class}, except note that for @code{make-class}, @var{slots} and @var{options} are separate list parameters: @var{slots} here is a list of slot definitions. @end deffn Implementation notes: @code{make-class} @itemize @bullet @item adds @code{} to the @var{supers} list if @var{supers} is empty or if none of the classes in @var{supers} have @code{} in their class precedence list @item defaults the @code{#:environment}, @code{#:name} and @code{#:metaclass} options, if they are not specified by @var{options}, to the current top-level environment, the unbound value, and @code{(ensure-metaclass @var{supers})} respectively (@pxref{Class Definition Internals,, ensure-metaclass}) @item checks for duplicate classes in @var{supers} and duplicate slot names in @var{slots}, and signals an error if there are any duplicates @item calls @code{make}, passing the metaclass as the first parameter and all other parameters as option keywords with values. @end itemize @deffn procedure ensure-metaclass supers env Return a metaclass suitable for a class that inherits from the list of classes in @var{supers}. The returned metaclass is the union by inheritance of the metaclasses of the classes in @var{supers}. In the simplest case, where all the @var{supers} are straightforward classes with metaclass @code{}, the returned metaclass is just @code{}. For a more complex example, suppose that @var{supers} contained one class with metaclass @code{} and one with metaclass @code{}. Then the returned metaclass would be a class that inherits from both @code{} and @code{}. If @var{supers} is the empty list, @code{ensure-metaclass} returns the default GOOPS metaclass @code{}. GOOPS keeps a list of the metaclasses created by @code{ensure-metaclass}, so that each required type of metaclass only has to be created once. The @code{env} parameter is ignored. @end deffn @deffn procedure ensure-metaclass-with-supers meta-supers @code{ensure-metaclass-with-supers} is an internal procedure used by @code{ensure-metaclass} (@pxref{Class Definition Internals,, ensure-metaclass}). It returns a metaclass that is the union by inheritance of the metaclasses in @var{meta-supers}. @end deffn The internals of @code{make}, which is ultimately used to create the new class object, are described in @ref{Customizing Instance Creation}, which covers the creation and initialization of instances in general. @node Customizing Class Definition @subsection Customizing Class Definition During the initialization of a new class, GOOPS calls a number of generic functions with the newly allocated class instance as the first argument. Specifically, GOOPS calls the generic function @itemize @bullet @item (initialize @var{class} @dots{}) @end itemize where @var{class} is the newly allocated class instance, and the default @code{initialize} method for arguments of type @code{} calls the generic functions @itemize @bullet @item (compute-cpl @var{class}) @item (compute-slots @var{class}) @item (compute-get-n-set @var{class} @var{slot-def}), for each of the slot definitions returned by @code{compute-slots} @item (compute-getter-method @var{class} @var{slot-def}), for each of the slot definitions returned by @code{compute-slots} that includes a @code{#:getter} or @code{#:accessor} slot option @item (compute-setter-method @var{class} @var{slot-def}), for each of the slot definitions returned by @code{compute-slots} that includes a @code{#:setter} or @code{#:accessor} slot option. @end itemize If the metaclass of the new class is something more specialized than the default @code{}, then the type of @var{class} in the calls above is more specialized than @code{}, and hence it becomes possible to define generic function methods, specialized for the new class's metaclass, that can modify or override the default behaviour of @code{initialize}, @code{compute-cpl} or @code{compute-get-n-set}. @code{compute-cpl} computes the class precedence list (``CPL'') for the new class (@pxref{Class precedence list}), and returns it as a list of class objects. The CPL is important because it defines a superclass ordering that is used, when a generic function is invoked upon an instance of the class, to decide which of the available generic function methods is the most specific. Hence @code{compute-cpl} could be customized in order to modify the CPL ordering algorithm for all classes with a special metaclass. The default CPL algorithm is encapsulated by the @code{compute-std-cpl} procedure, which is in turn called by the default @code{compute-cpl} method. @deffn procedure compute-std-cpl class Compute and return the class precedence list for @var{class} according to the algorithm described in @ref{Class precedence list}. @end deffn @code{compute-slots} computes and returns a list of all slot definitions for the new class. By default, this list includes the direct slot definitions from the @code{define-class} form, plus the slot definitions that are inherited from the new class's superclasses. The default @code{compute-slots} method uses the CPL computed by @code{compute-cpl} to calculate this union of slot definitions, with the rule that slots inherited from superclasses are shadowed by direct slots with the same name. One possible reason for customizing @code{compute-slots} would be to implement an alternative resolution strategy for slot name conflicts. @code{compute-get-n-set} computes the low-level closures that will be used to get and set the value of a particular slot, and returns them in a list with two elements. The closures returned depend on how storage for that slot is allocated. The standard @code{compute-get-n-set} method, specialized for classes of type @code{}, handles the standard GOOPS values for the @code{#:allocation} slot option (@pxref{Slot Options,, allocation}). By defining a new @code{compute-get-n-set} method for a more specialized metaclass, it is possible to support new types of slot allocation. Suppose you wanted to create a large number of instances of some class with a slot that should be shared between some but not all instances of that class - say every 10 instances should share the same slot storage. The following example shows how to implement and use a new type of slot allocation to do this. @example (define-class ()) (let ((batch-allocation-count 0) (batch-get-n-set #f)) (define-method (compute-get-n-set (class ) s) (case (slot-definition-allocation s) ((#:batched) ;; If we've already used the same slot storage for 10 instances, ;; reset variables. (if (= batch-allocation-count 10) (begin (set! batch-allocation-count 0) (set! batch-get-n-set #f))) ;; If we don't have a current pair of get and set closures, ;; create one. make-closure-variable returns a pair of closures ;; around a single Scheme variable - see goops.scm for details. (or batch-get-n-set (set! batch-get-n-set (make-closure-variable))) ;; Increment the batch allocation count. (set! batch-allocation-count (+ batch-allocation-count 1)) batch-get-n-set) ;; Call next-method to handle standard allocation types. (else (next-method))))) (define-class () ... (c #:allocation #:batched) ... #:metaclass ) @end example The usage of @code{compute-getter-method} and @code{compute-setter-method} is described in @ref{MOP Specification}. @code{compute-cpl} and @code{compute-get-n-set} are called by the standard @code{initialize} method for classes whose metaclass is @code{}. But @code{initialize} itself can also be modified, by defining an @code{initialize} method specialized to the new class's metaclass. Such a method could complete override the standard behaviour, by not calling @code{(next-method)} at all, but more typically it would perform additional class initialization steps before and/or after calling @code{(next-method)} for the standard behaviour. @node STKlos Compatibility @subsection STKlos Compatibility If the STKlos compatibility module is loaded, @code{define-class} is overwritten by a STKlos-specific definition; the standard GOOPS definition of @code{define-class} remains available in @code{standard-define-class}. @deffn syntax standard-define-class name (super @dots{}) slot-definition @dots{} . options @code{standard-define-class} is equivalent to the standard GOOPS @code{define-class}. @end deffn @node Creating Instances @section Creating Instances @menu * Basic Instance Creation:: * Customizing Instance Creation:: @end menu @node Basic Instance Creation @subsection Basic Instance Creation To create a new instance of any GOOPS class, use the generic function @code{make} or @code{make-instance}, passing the required class and any appropriate instance initialization arguments as keyword and value pairs. Note that @code{make} and @code{make-instances} are aliases for each other - their behaviour is identical. @deffn generic make @deffnx method make (class ) . initargs Create and return a new instance of class @var{class}, initialized using @var{initargs}. In theory, @var{initargs} can have any structure that is understood by whatever methods get applied when the @code{initialize} generic function is applied to the newly allocated instance. In practice, specialized @code{initialize} methods would normally call @code{(next-method)}, and so eventually the standard GOOPS @code{initialize} methods are applied. These methods expect @var{initargs} to be a list with an even number of elements, where even-numbered elements (counting from zero) are keywords and odd-numbered elements are the corresponding values. GOOPS processes initialization argument keywords automatically for slots whose definition includes the @code{#:init-keyword} option (@pxref{Slot Options,, init-keyword}). Other keyword value pairs can only be processed by an @code{initialize} method that is specialized for the new instance's class. Any unprocessed keyword value pairs are ignored. @end deffn @deffn generic make-instance @deffnx method make-instance (class ) . initargs @code{make-instance} is an alias for @code{make}. @end deffn @node Customizing Instance Creation @subsection Customizing Instance Creation @code{make} itself is a generic function. Hence the @code{make} invocation itself can be customized in the case where the new instance's metaclass is more specialized than the default @code{}, by defining a @code{make} method that is specialized to that metaclass. Normally, however, the method for classes with metaclass @code{} will be applied. This method calls two generic functions: @itemize @bullet @item (allocate-instance @var{class} . @var{initargs}) @item (initialize @var{instance} . @var{initargs}) @end itemize @code{allocate-instance} allocates storage for and returns the new instance, uninitialized. You might customize @code{allocate-instance}, for example, if you wanted to provide a GOOPS wrapper around some other object programming system. To do this, you would create a specialized metaclass, which would act as the metaclass for all classes and instances from the other system. Then define an @code{allocate-instance} method, specialized to that metaclass, which calls a Guile primitive C function, which in turn allocates the new instance using the interface of the other object system. In this case, for a complete system, you would also need to customize a number of other generic functions like @code{make} and @code{initialize}, so that GOOPS knows how to make classes from the other system, access instance slots, and so on. @code{initialize} initializes the instance that is returned by @code{allocate-instance}. The standard GOOPS methods perform initializations appropriate to the instance class. @itemize @bullet @item At the least specialized level, the method for instances of type @code{} performs internal GOOPS instance initialization, and initializes the instance's slots according to the slot definitions and any slot initialization keywords that appear in @var{initargs}. @item The method for instances of type @code{} calls @code{(next-method)}, then performs the class initializations described in @ref{Customizing Class Definition}. @item and so on for generic functions, method, operator classes @dots{} @end itemize Similarly, you can customize the initialization of instances of any application-defined class by defining an @code{initialize} method specialized to that class. Imagine a class whose instances' slots need to be initialized at instance creation time by querying a database. Although it might be possible to achieve this a combination of @code{#:init-thunk} keywords and closures in the slot definitions, it is neater to write an @code{initialize} method for the class that queries the database once and initializes all the dependent slot values according to the results. @node Accessing Slots @section Accessing Slots The definition of a slot contains at the very least a slot name, and may also contain various slot options, including getter, setter and/or accessor functions for the slot. It is always possible to access slots by name, using the various ``slot-ref'' and ``slot-set!'' procedures described in the following subsections. For example, @example (define-class () ;; Define a class with slots (count #:init-value 0) ;; named "count" and "cache". (cache #:init-value '()) @dots{}) (define inst (make )) ;; Make an instance of this class. (slot-set! inst 'count 5) ;; Set the value of the "count" ;; slot to 5. (slot-set! inst 'cache ;; Modify the value of the (cons (cons "^it" "It") ;; "cache" slot. (slot-ref inst 'cache))) @end example If a slot definition includes a getter, setter or accessor function, these can be used instead of @code{slot-ref} and @code{slot-set!} to access the slot. @example (define-class () ;; Define a new class whose slots (count #:setter set-count) ;; use a getter, a setter and (cache #:accessor cache) ;; an accessor. (csize #:getter cache-size) @dots{}) (define inst (make )) ;; Make an instance of this class. (set-count inst 5) ;; Set the value of the "count" ;; slot to 5. (set! (cache inst) ;; Modify the value of the (cons (cons "^it" "It") ;; "cache" slot. (cache inst))) (let ((size (cache-size inst))) ;; Get the value of the "csize" @dots{}) ;; slot. @end example Whichever of these methods is used to access slots, GOOPS always calls the low-level @dfn{getter} and @dfn{setter} closures for the slot to get and set its value. These closures make sure that the slot behaves according to the @code{#:allocation} type that was specified in the slot definition (@pxref{Slot Options,, allocation}). (For more about these closures, see @ref{Customizing Class Definition,, compute-get-n-set}.) @menu * Instance Slots:: * Class Slots:: * Handling Slot Access Errors:: @end menu @node Instance Slots @subsection Instance Slots Any slot, regardless of its allocation, can be queried, referenced and set using the following four primitive procedures. @deffn {primitive procedure} slot-exists? obj slot-name Return @code{#t} if @var{obj} has a slot with name @var{slot-name}, otherwise @code{#f}. @end deffn @deffn {primitive procedure} slot-bound? obj slot-name Return @code{#t} if the slot named @var{slot-name} in @var{obj} has a value, otherwise @code{#f}. @code{slot-bound?} calls the generic function @code{slot-missing} if @var{obj} does not have a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @end deffn @deffn {primitive procedure} slot-ref obj slot-name Return the value of the slot named @var{slot-name} in @var{obj}. @code{slot-ref} calls the generic function @code{slot-missing} if @var{obj} does not have a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @code{slot-ref} calls the generic function @code{slot-unbound} if the named slot in @var{obj} does not have a value (@pxref{Handling Slot Access Errors, slot-unbound}). @end deffn @deffn {primitive procedure} slot-set! obj slot-name value Set the value of the slot named @var{slot-name} in @var{obj} to @var{value}. @code{slot-set!} calls the generic function @code{slot-missing} if @var{obj} does not have a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @end deffn GOOPS stores information about slots in class metaobjects. Internally, all of these procedures work by looking up the slot definition for the slot named @var{slot-name} in the class metaobject for @code{(class-of @var{obj})}, and then using the slot definition's ``getter'' and ``setter'' closures to get and set the slot value. The next four procedures differ from the previous ones in that they take the class metaobject as an explicit argument, rather than assuming @code{(class-of @var{obj})}. Therefore they allow you to apply the ``getter'' and ``setter'' closures of a slot definition in one class to an instance of a different class. [ *fixme* I have no idea why this is useful! Perhaps when a slot in @code{(class-of @var{obj})} shadows a slot with the same name in one of its superclasses? There should be an enlightening example here. ] @deffn {primitive procedure} slot-exists-using-class? class obj slot-name Return @code{#t} if the class metaobject @var{class} has a slot definition for a slot with name @var{slot-name}, otherwise @code{#f}. @end deffn @deffn {primitive procedure} slot-bound-using-class? class obj slot-name Return @code{#t} if applying @code{slot-ref-using-class} to the same arguments would call the generic function @code{slot-unbound}, otherwise @code{#f}. @code{slot-bound-using-class?} calls the generic function @code{slot-missing} if @var{class} does not have a slot definition for a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @end deffn @deffn {primitive procedure} slot-ref-using-class class obj slot-name Apply the ``getter'' closure for the slot named @var{slot-name} in @var{class} to @var{obj}, and return its result. @code{slot-ref-using-class} calls the generic function @code{slot-missing} if @var{class} does not have a slot definition for a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @code{slot-ref-using-class} calls the generic function @code{slot-unbound} if the application of the ``getter'' closure to @var{obj} returns an unbound value (@pxref{Handling Slot Access Errors, slot-unbound}). @end deffn @deffn {primitive procedure} slot-set-using-class! class obj slot-name value Apply the ``setter'' closure for the slot named @var{slot-name} in @var{class} to @var{obj} and @var{value}. @code{slot-set-using-class!} calls the generic function @code{slot-missing} if @var{class} does not have a slot definition for a slot called @var{slot-name} (@pxref{Handling Slot Access Errors, slot-missing}). @end deffn @node Class Slots @subsection Class Slots Slots whose allocation is per-class rather than per-instance can be referenced and set without needing to specify any particular instance. @deffn procedure class-slot-ref class slot-name Return the value of the slot named @var{slot-name} in class @var{class}. The named slot must have @code{#:class} or @code{#:each-subclass} allocation (@pxref{Slot Options,, allocation}). If there is no such slot with @code{#:class} or @code{#:each-subclass} allocation, @code{class-slot-ref} calls the @code{slot-missing} generic function with arguments @var{class} and @var{slot-name}. Otherwise, if the slot value is unbound, @code{class-slot-ref} calls the @code{slot-missing} generic function, with the same arguments. @end deffn @deffn procedure class-slot-set! class slot-name value Set the value of the slot named @var{slot-name} in class @var{class} to @var{value}. The named slot must have @code{#:class} or @code{#:each-subclass} allocation (@pxref{Slot Options,, allocation}). If there is no such slot with @code{#:class} or @code{#:each-subclass} allocation, @code{class-slot-ref} calls the @code{slot-missing} generic function with arguments @var{class} and @var{slot-name}. @end deffn @node Handling Slot Access Errors @subsection Handling Slot Access Errors GOOPS calls one of the following generic functions when a ``slot-ref'' or ``slot-set!'' call specifies a non-existent slot name, or tries to reference a slot whose value is unbound. @deffn generic slot-missing @deffnx method slot-missing (class ) slot-name @deffnx method slot-missing (class ) (object ) slot-name @deffnx method slot-missing (class ) (object ) slot-name value When an application attempts to reference or set a class or instance slot by name, and the slot name is invalid for the specified @var{class} or @var{object}, GOOPS calls the @code{slot-missing} generic function. The default methods all call @code{goops-error} with an appropriate message. @end deffn @deffn generic slot-unbound @deffnx method slot-unbound (object ) @deffnx method slot-unbound (class ) slot-name @deffnx method slot-unbound (class ) (object ) slot-name When an application attempts to reference a class or instance slot, and the slot's value is unbound, GOOPS calls the @code{slot-unbound} generic function. The default methods all call @code{goops-error} with an appropriate message. @end deffn @node Creating Generic Functions @section Creating Generic Functions A generic function is a collection of methods, with rules for determining which of the methods should be applied for any given invocation of the generic function. GOOPS represents generic functions as metaobjects of the class @code{} (or one of its subclasses). @menu * Basic Generic Function Creation:: * Generic Function Internals:: * Extending Guiles Primitives:: @end menu @node Basic Generic Function Creation @subsection Basic Generic Function Creation The following forms may be used to bind a variable to a generic function. Depending on that variable's pre-existing value, the generic function may be created empty - with no methods - or it may contain methods that are inferred from the pre-existing value. It is not, in general, necessary to use @code{define-generic} or @code{define-accessor} before defining methods for the generic function using @code{define-method}, since @code{define-method} will automatically interpolate a @code{define-generic} call, or upgrade an existing generic to an accessor, if that is implied by the @code{define-method} call. Note in particular that, if the specified variable already has a @emph{generic function} value, @code{define-generic} and @code{define-accessor} will @emph{discard} it! Obviously it is application-dependent whether this is desirable or not. If, for example, you wanted to extend @code{+} for a class representing a new numerical type, you probably want to inherit any existing methods for @code{+} and so should not use @code{define-generic}. If, on the other hand, you do not want to risk inheriting methods whose behaviour might surprise you, you can use @code{define-generic} or @code{define-accessor} to wipe the slate clean. @deffn syntax define-generic symbol Create a generic function with name @var{symbol} and bind it to the variable @var{symbol}. If the variable @var{symbol} was previously bound to a Scheme procedure (or procedure-with-setter), the old procedure (and setter) is incorporated into the new generic function as its default procedure (and setter). Any other previous value that was bound to @var{symbol}, including an existing generic function, is overwritten by the new generic function. @end deffn @deffn syntax define-accessor symbol Create an accessor with name @var{symbol} and bind it to the variable @var{symbol}. If the variable @var{symbol} was previously bound to a Scheme procedure (or procedure-with-setter), the old procedure (and setter) is incorporated into the new accessor as its default procedure (and setter). Any other previous value that was bound to @var{symbol}, including an existing generic function or accessor, is overwritten by the new definition. @end deffn It is sometimes tempting to use GOOPS accessors with short names. For example, it is tempting to use the name @code{x} for the x-coordinate in vector packages. Assume that we work with a graphical package which needs to use two independent vector packages for 2D and 3D vectors respectively. If both packages export @code{x} we will encounter a name collision. This can be resolved automagically with the duplicates handler @code{merge-generics} which gives the module system license to merge all generic functions sharing a common name: @smalllisp (define-module (math 2D-vectors) :use-module (oop goops) :export (x y ...)) (define-module (math 3D-vectors) :use-module (oop goops) :export (x y z ...)) (define-module (my-module) :use-module (math 2D-vectors) :use-module (math 3D-vectors) :duplicates merge-generics) @end smalllisp The generic function @code{x} in @code{(my-module)} will now share methods with @code{x} in both imported modules. There will, in fact, now be three distinct generic functions named @code{x}: @code{x} in @code{(2D-vectors)}, @code{x} in @code{(3D-vectors)}, and @code{x} in @code{(my-module)}. The last function will be an @code{}, extending the previous two functions. Let's call the imported generic functions the "ancestor functions". The generic function @code{x} in @code{(my-module)} is, in turn, a "descendant function" of the imported functions, extending its ancestors. For any generic function G, the applicable methods are selected from the union of the methods of the descendant functions, the methods of G itself and the methods of the ancestor functions. This, ancestor functions share methods with their descendants and vice versa. This implies that @code{x} in @code{(math 2D-vectors)} will share the methods of @code{x} in @code{(my-module)} and vice versa, while @code{x} in @code{(math 2D-vectors)} doesn't share the methods of @code{x} in @code{(math 3D-vectors)}, thus preserving modularity. Sharing is dynamic, so that adding new methods to a descendant implies adding it to the ancestor. If duplicates checking is desired in the above example, the following form of the @code{:duplicates} option can be used instead: @smalllisp :duplicates (merge-generics check) @end smalllisp @node Generic Function Internals @subsection Generic Function Internals @code{define-generic} calls @code{ensure-generic} to upgrade a pre-existing procedure value, or @code{make} with metaclass @code{} to create a new generic function. @code{define-accessor} calls @code{ensure-accessor} to upgrade a pre-existing procedure value, or @code{make-accessor} to create a new accessor. @deffn procedure ensure-generic old-definition [name] Return a generic function with name @var{name}, if possible by using or upgrading @var{old-definition}. If unspecified, @var{name} defaults to @code{#f}. If @var{old-definition} is already a generic function, it is returned unchanged. If @var{old-definition} is a Scheme procedure or procedure-with-setter, @code{ensure-generic} returns a new generic function that uses @var{old-definition} for its default procedure and setter. Otherwise @code{ensure-generic} returns a new generic function with no defaults and no methods. @end deffn @deffn procedure make-generic [name] Return a new generic function with name @code{(car @var{name})}. If unspecified, @var{name} defaults to @code{#f}. @end deffn @code{ensure-generic} calls @code{make} with metaclasses @code{} and @code{}, depending on the previous value of the variable that it is trying to upgrade. @code{make-generic} is a simple wrapper for @code{make} with metaclass @code{}. @deffn procedure ensure-accessor proc [name] Return an accessor with name @var{name}, if possible by using or upgrading @var{proc}. If unspecified, @var{name} defaults to @code{#f}. If @var{proc} is already an accessor, it is returned unchanged. If @var{proc} is a Scheme procedure, procedure-with-setter or generic function, @code{ensure-accessor} returns an accessor that reuses the reusable elements of @var{proc}. Otherwise @code{ensure-accessor} returns a new accessor with no defaults and no methods. @end deffn @deffn procedure make-accessor [name] Return a new accessor with name @code{(car @var{name})}. If unspecified, @var{name} defaults to @code{#f}. @end deffn @code{ensure-accessor} calls @code{make} with metaclass @code{}, as well as calls to @code{ensure-generic}, @code{make-accessor} and (tail recursively) @code{ensure-accessor}. @code{make-accessor} calls @code{make} twice, first with metaclass @code{} to create a generic function for the setter, then with metaclass @code{} to create the accessor, passing the setter generic function as the value of the @code{#:setter} keyword. @node Extending Guiles Primitives @subsection Extending Guile's Primitives When GOOPS is loaded, many of Guile's primitive procedures can be extended by giving them a generic function definition that operates in conjunction with their normal C-coded implementation. For primitives that are extended in this way, the result from the user- or application-level point of view is that the extended primitive behaves exactly like a generic function with the C-coded implementation as its default method. The @code{generic-capability?} predicate should be used to determine whether a particular primitive is extensible in this way. @deffn {primitive procedure} generic-capability? primitive Return @code{#t} if @var{primitive} can be extended by giving it a generic function definition, otherwise @code{#f}. @end deffn Even when a primitive procedure is extensible like this, its generic function definition is not created until it is needed by a call to @code{define-method}, or until the application explicitly requests it by calling @code{enable-primitive-generic!}. @deffn {primitive procedure} enable-primitive-generic! primitive Force the creation of a generic function definition for @var{primitive}. @end deffn Once the generic function definition for a primitive has been created, it can be retrieved using @code{primitive-generic-generic}. @deffn {primitive procedure} primitive-generic-generic primitive Return the generic function definition of @var{primitive}. @code{primitive-generic-generic} raises an error if @var{primitive} is not a primitive with generic capability, or if its generic capability has not yet been enabled, whether implicitly (by @code{define-method}) or explicitly (by @code{enable-primitive-generic!}). @end deffn Note that the distinction between, on the one hand, primitives with additional generic function definitions and, on the other hand, generic functions with a default method, may disappear when GOOPS is fully integrated into the core of Guile. Consequently, the procedures described in this section may disappear as well. @node Adding Methods to Generic Functions @section Adding Methods to Generic Functions @menu * Basic Method Definition:: * Method Definition Internals:: @end menu @node Basic Method Definition @subsection Basic Method Definition To add a method to a generic function, use the @code{define-method} form. @deffn syntax define-method (generic parameter @dots{}) . body Define a method for the generic function or accessor @var{generic} with parameters @var{parameter}s and body @var{body}. @var{generic} is a generic function. If @var{generic} is a variable which is not yet bound to a generic function object, the expansion of @code{define-method} will include a call to @code{define-generic}. If @var{generic} is @code{(setter @var{generic-with-setter})}, where @var{generic-with-setter} is a variable which is not yet bound to a generic-with-setter object, the expansion will include a call to @code{define-accessor}. Each @var{parameter} must be either a symbol or a two-element list @code{(@var{symbol} @var{class})}. The symbols refer to variables in the @var{body} that will be bound to the parameters supplied by the caller when calling this method. The @var{class}es, if present, specify the possible combinations of parameters to which this method can be applied. @var{body} is the body of the method definition. @end deffn @code{define-method} expressions look a little like normal Scheme procedure definitions of the form @example (define (name formals @dots{}) . body) @end example The most important difference is that each formal parameter, apart from the possible ``rest'' argument, can be qualified by a class name: @code{@var{formal}} becomes @code{(@var{formal} @var{class})}. The meaning of this qualification is that the method being defined will only be applicable in a particular generic function invocation if the corresponding argument is an instance of @code{@var{class}} (or one of its subclasses). If more than one of the formal parameters is qualified in this way, then the method will only be applicable if each of the corresponding arguments is an instance of its respective qualifying class. Note that unqualified formal parameters act as though they are qualified by the class @code{}, which GOOPS uses to mean the superclass of all valid Scheme types, including both primitive types and GOOPS classes. For example, if a generic function method is defined with @var{parameter}s @code{((s1 ) (n ))}, that method is only applicable to invocations of its generic function that have two parameters where the first parameter is an instance of the @code{} class and the second parameter is a number. If a generic function is invoked with a combination of parameters for which there is no applicable method, GOOPS raises an error. For more about invocation error handling, and generic function invocation in general, see @ref{Invoking Generic Functions}. @node Method Definition Internals @subsection Method Definition Internals @code{define-method} @itemize @bullet @item checks the form of the first parameter, and applies the following steps to the accessor's setter if it has the @code{(setter @dots{})} form @item interpolates a call to @code{define-generic} or @code{define-accessor} if a generic function is not already defined with the supplied name @item calls @code{method} with the @var{parameter}s and @var{body}, to make a new method instance @item calls @code{add-method!} to add this method to the relevant generic function. @end itemize @deffn syntax method (parameter @dots{}) . body Make a method whose specializers are defined by the classes in @var{parameter}s and whose procedure definition is constructed from the @var{parameter} symbols and @var{body} forms. The @var{parameter} and @var{body} parameters should be as for @code{define-method} (@pxref{Basic Method Definition,, define-method}). @end deffn @code{method} @itemize @bullet @item extracts formals and specializing classes from the @var{parameter}s, defaulting the class for unspecialized parameters to @code{} @item creates a closure using the formals and the @var{body} forms @item calls @code{make} with metaclass @code{} and the specializers and closure using the @code{#:specializers} and @code{#:procedure} keywords. @end itemize @deffn procedure make-method specializers procedure Make a method using @var{specializers} and @var{procedure}. @var{specializers} should be a list of classes that specifies the parameter combinations to which this method will be applicable. @var{procedure} should be the closure that will applied to the generic function parameters when this method is invoked. @end deffn @code{make-method} is a simple wrapper around @code{make} with metaclass @code{}. @deffn generic add-method! target method Generic function for adding method @var{method} to @var{target}. @end deffn @deffn method add-method! (generic ) (method ) Add method @var{method} to the generic function @var{generic}. @end deffn @deffn method add-method! (proc ) (method ) If @var{proc} is a procedure with generic capability (@pxref{Extending Guiles Primitives,, generic-capability?}), upgrade it to a primitive generic and add @var{method} to its generic function definition. @end deffn @deffn method add-method! (pg ) (method ) Add method @var{method} to the generic function definition of @var{pg}. Implementation: @code{(add-method! (primitive-generic-generic pg) method)}. @end deffn @deffn method add-method! (whatever ) (method ) Raise an error indicating that @var{whatever} is not a valid generic function. @end deffn @node Invoking Generic Functions @section Invoking Generic Functions When a variable with a generic function definition appears as the first element of a list that is being evaluated, the Guile evaluator tries to apply the generic function to the arguments obtained by evaluating the remaining elements of the list. [ *fixme* How do I put this in a more Schemely and less Lispy way? ] Usually a generic function contains several method definitions, with varying degrees of formal parameter specialization (@pxref{Basic Method Definition,, define-method}). So it is necessary to sort these methods by specificity with respect to the supplied arguments, and then apply the most specific method definition. Less specific methods may be applied subsequently if a method that is being applied calls @code{next-method}. @menu * Determining Which Methods to Apply:: * Handling Invocation Errors:: @end menu @node Determining Which Methods to Apply @subsection Determining Which Methods to Apply [ *fixme* Sorry - this is the area of GOOPS that I understand least of all, so I'm afraid I have to pass on this section. Would some other kind person consider filling it in? ] @deffn generic apply-generic @deffnx method apply-generic (gf ) args @end deffn @deffn generic compute-applicable-methods @deffnx method compute-applicable-methods (gf ) args @end deffn @deffn generic sort-applicable-methods @deffnx method sort-applicable-methods (gf ) methods args @end deffn @deffn generic method-more-specific? @deffnx method method-more-specific? (m1 ) (m2 ) args @end deffn @deffn generic apply-method @deffnx method apply-method (gf ) methods build-next args @end deffn @deffn generic apply-methods @deffnx method apply-methods (gf ) (l ) args @end deffn @node Handling Invocation Errors @subsection Handling Invocation Errors @deffn generic no-method @deffnx method no-method (gf ) args When an application invokes a generic function, and no methods at all have been defined for that generic function, GOOPS calls the @code{no-method} generic function. The default method calls @code{goops-error} with an appropriate message. @end deffn @deffn generic no-applicable-method @deffnx method no-applicable-method (gf ) args When an application applies a generic function to a set of arguments, and no methods have been defined for those argument types, GOOPS calls the @code{no-applicable-method} generic function. The default method calls @code{goops-error} with an appropriate message. @end deffn @deffn generic no-next-method @deffnx method no-next-method (gf ) args When a generic function method calls @code{(next-method)} to invoke the next less specialized method for that generic function, and no less specialized methods have been defined for the current generic function arguments, GOOPS calls the @code{no-next-method} generic function. The default method calls @code{goops-error} with an appropriate message. @end deffn @node Redefining a Class @section Redefining a Class Suppose that a class @code{} is defined using @code{define-class} (@pxref{Basic Class Definition,, define-class}), with slots that have accessor functions, and that an application has created several instances of @code{} using @code{make} (@pxref{Basic Instance Creation,, make}). What then happens if @code{} is redefined by calling @code{define-class} again? @menu * Default Class Redefinition Behaviour:: * Customizing Class Redefinition:: @end menu @node Default Class Redefinition Behaviour @subsection Default Class Redefinition Behaviour GOOPS' default answer to this question is as follows. @itemize @bullet @item All existing direct instances of @code{} are converted to be instances of the new class. This is achieved by preserving the values of slots that exist in both the old and new definitions, and initializing the values of new slots in the usual way (@pxref{Basic Instance Creation,, make}). @item All existing subclasses of @code{} are redefined, as though the @code{define-class} expressions that defined them were re-evaluated following the redefinition of @code{}, and the class redefinition process described here is applied recursively to the redefined subclasses. @item Once all of its instances and subclasses have been updated, the class metaobject previously bound to the variable @code{} is no longer needed and so can be allowed to be garbage collected. @end itemize To keep things tidy, GOOPS also needs to do a little housekeeping on methods that are associated with the redefined class. @itemize @bullet @item Slot accessor methods for slots in the old definition should be removed from their generic functions. They will be replaced by accessor methods for the slots of the new class definition. @item Any generic function method that uses the old @code{} metaobject as one of its formal parameter specializers must be updated to refer to the new @code{} metaobject. (Whenever a new generic function method is defined, @code{define-method} adds the method to a list stored in the class metaobject for each class used as a formal parameter specializer, so it is easy to identify all the methods that must be updated when a class is redefined.) @end itemize If this class redefinition strategy strikes you as rather counter-intuitive, bear in mind that it is derived from similar behaviour in other object systems such as CLOS, and that experience in those systems has shown it to be very useful in practice. Also bear in mind that, like most of GOOPS' default behaviour, it can be customized@dots{} @node Customizing Class Redefinition @subsection Customizing Class Redefinition When @code{define-class} notices that a class is being redefined, it constructs the new class metaobject as usual, and then invokes the @code{class-redefinition} generic function with the old and new classes as arguments. Therefore, if the old or new classes have metaclasses other than the default @code{}, class redefinition behaviour can be customized by defining a @code{class-redefinition} method that is specialized for the relevant metaclasses. @deffn generic class-redefinition Handle the class redefinition from @var{old-class} to @var{new-class}, and return the new class metaobject that should be bound to the variable specified by @code{define-class}'s first argument. @end deffn @deffn method class-redefinition (old-class ) (new-class ) Implements GOOPS' default class redefinition behaviour, as described in @ref{Default Class Redefinition Behaviour}. Returns the metaobject for the new class definition. @end deffn An alternative class redefinition strategy could be to leave all existing instances as instances of the old class, but accepting that the old class is now ``nameless'', since its name has been taken over by the new definition. In this strategy, any existing subclasses could also be left as they are, on the understanding that they inherit from a nameless superclass. This strategy is easily implemented in GOOPS, by defining a new metaclass, that will be used as the metaclass for all classes to which the strategy should apply, and then defining a @code{class-redefinition} method that is specialized for this metaclass: @example (define-class ()) (define-method (class-redefinition (old ) (new )) new) @end example When customization can be as easy as this, aren't you glad that GOOPS implements the far more difficult strategy as its default! Finally, note that, if @code{class-redefinition} itself is not customized, the default @code{class-redefinition} method invokes three further generic functions that could be individually customized: @itemize @bullet @item (remove-class-accessors! @var{old-class}) @item (update-direct-method! @var{method} @var{old-class} @var{new-class}) @item (update-direct-subclass! @var{subclass} @var{old-class} @var{new-class}) @end itemize and the default methods for these generic functions invoke further generic functions, and so on@dots{} The detailed protocol for all of these is described in @ref{MOP Specification}. @node Changing the Class of an Instance @section Changing the Class of an Instance You can change the class of an existing instance by invoking the generic function @code{change-class} with two arguments: the instance and the new class. @deffn generic change-class @end deffn The default method for @code{change-class} decides how to implement the change of class by looking at the slot definitions for the instance's existing class and for the new class. If the new class has slots with the same name as slots in the existing class, the values for those slots are preserved. Slots that are present only in the existing class are discarded. Slots that are present only in the new class are initialized using the corresponding slot definition's init function (@pxref{Classes,, slot-init-function}). @deffn {method} change-class (obj ) (new ) Modify instance @var{obj} to make it an instance of class @var{new}. The value of each of @var{obj}'s slots is preserved only if a similarly named slot exists in @var{new}; any other slot values are discarded. The slots in @var{new} that do not correspond to any of @var{obj}'s pre-existing slots are initialized according to @var{new}'s slot definitions' init functions. @end deffn Customized change of class behaviour can be implemented by defining @code{change-class} methods that are specialized either by the class of the instances to be modified or by the metaclass of the new class. When a class is redefined (@pxref{Redefining a Class}), and the default class redefinition behaviour is not overridden, GOOPS (eventually) invokes the @code{change-class} generic function for each existing instance of the redefined class. @node Introspection @section Introspection @dfn{Introspection}, also known as @dfn{reflection}, is the name given to the ability to obtain information dynamically about GOOPS metaobjects. It is perhaps best illustrated by considering an object oriented language that does not provide any introspection, namely C++. Nothing in C++ allows a running program to obtain answers to the following types of question: @itemize @bullet @item What are the data members of this object or class? @item What classes does this class inherit from? @item Is this method call virtual or non-virtual? @item If I invoke @code{Employee::adjustHoliday()}, what class contains the @code{adjustHoliday()} method that will be applied? @end itemize In C++, answers to such questions can only be determined by looking at the source code, if you have access to it. GOOPS, on the other hand, includes procedures that allow answers to these questions --- or their GOOPS equivalents --- to be obtained dynamically, at run time. @menu * Classes:: * Slots:: * Instances:: * Generic Functions:: * Generic Function Methods:: @end menu @node Classes @subsection Classes @deffn {primitive procedure} class-name class Return the name of class @var{class}. This is the value of the @var{class} metaobject's @code{name} slot. @end deffn @deffn {primitive procedure} class-direct-supers class Return a list containing the direct superclasses of @var{class}. This is the value of the @var{class} metaobject's @code{direct-supers} slot. @end deffn @deffn {primitive procedure} class-direct-slots class Return a list containing the slot definitions of the direct slots of @var{class}. This is the value of the @var{class} metaobject's @code{direct-slots} slot. @end deffn @deffn {primitive procedure} class-direct-subclasses class Return a list containing the direct subclasses of @var{class}. This is the value of the @var{class} metaobject's @code{direct-subclasses} slot. @end deffn @deffn {primitive procedure} class-direct-methods class Return a list of all the generic function methods that use @var{class} as a formal parameter specializer. This is the value of the @var{class} metaobject's @code{direct-methods} slot. @end deffn @deffn {primitive procedure} class-precedence-list class Return the class precedence list for class @var{class} (@pxref{Class precedence list}). This is the value of the @var{class} metaobject's @code{cpl} slot. @end deffn @deffn {primitive procedure} class-slots class Return a list containing the slot definitions for all @var{class}'s slots, including any slots that are inherited from superclasses. This is the value of the @var{class} metaobject's @code{slots} slot. @end deffn @deffn {primitive procedure} class-environment class Return the value of @var{class}'s @code{environment} slot. [ *fixme* I don't know what this value is used for. ] @end deffn @deffn procedure class-subclasses class Return a list of all subclasses of @var{class}. @end deffn @deffn procedure class-methods class Return a list of all methods that use @var{class} or a subclass of @var{class} as one of its formal parameter specializers. @end deffn @node Slots @subsection Slots @deffn procedure class-slot-definition class slot-name Return the slot definition for the slot named @var{slot-name} in class @var{class}. @var{slot-name} should be a symbol. @end deffn @deffn procedure slot-definition-name slot-def Extract and return the slot name from @var{slot-def}. @end deffn @deffn procedure slot-definition-options slot-def Extract and return the slot options from @var{slot-def}. @end deffn @deffn procedure slot-definition-allocation slot-def Extract and return the slot allocation option from @var{slot-def}. This is the value of the @code{#:allocation} keyword (@pxref{Slot Options,, allocation}), or @code{#:instance} if the @code{#:allocation} keyword is absent. @end deffn @deffn procedure slot-definition-getter slot-def Extract and return the slot getter option from @var{slot-def}. This is the value of the @code{#:getter} keyword (@pxref{Slot Options,, getter}), or @code{#f} if the @code{#:getter} keyword is absent. @end deffn @deffn procedure slot-definition-setter slot-def Extract and return the slot setter option from @var{slot-def}. This is the value of the @code{#:setter} keyword (@pxref{Slot Options,, setter}), or @code{#f} if the @code{#:setter} keyword is absent. @end deffn @deffn procedure slot-definition-accessor slot-def Extract and return the slot accessor option from @var{slot-def}. This is the value of the @code{#:accessor} keyword (@pxref{Slot Options,, accessor}), or @code{#f} if the @code{#:accessor} keyword is absent. @end deffn @deffn procedure slot-definition-init-value slot-def Extract and return the slot init-value option from @var{slot-def}. This is the value of the @code{#:init-value} keyword (@pxref{Slot Options,, init-value}), or the unbound value if the @code{#:init-value} keyword is absent. @end deffn @deffn procedure slot-definition-init-form slot-def Extract and return the slot init-form option from @var{slot-def}. This is the value of the @code{#:init-form} keyword (@pxref{Slot Options,, init-form}), or the unbound value if the @code{#:init-form} keyword is absent. @end deffn @deffn procedure slot-definition-init-thunk slot-def Extract and return the slot init-thunk option from @var{slot-def}. This is the value of the @code{#:init-thunk} keyword (@pxref{Slot Options,, init-thunk}), or @code{#f} if the @code{#:init-thunk} keyword is absent. @end deffn @deffn procedure slot-definition-init-keyword slot-def Extract and return the slot init-keyword option from @var{slot-def}. This is the value of the @code{#:init-keyword} keyword (@pxref{Slot Options,, init-keyword}), or @code{#f} if the @code{#:init-keyword} keyword is absent. @end deffn @deffn procedure slot-init-function class slot-name Return the initialization function for the slot named @var{slot-name} in class @var{class}. @var{slot-name} should be a symbol. The returned initialization function incorporates the effects of the standard @code{#:init-thunk}, @code{#:init-form} and @code{#:init-value} slot options. These initializations can be overridden by the @code{#:init-keyword} slot option or by a specialized @code{initialize} method, so, in general, the function returned by @code{slot-init-function} may be irrelevant. For a fuller discussion, see @ref{Slot Options,, init-value}. @end deffn @node Instances @subsection Instances @deffn {primitive procedure} class-of value Return the GOOPS class of any Scheme @var{value}. @end deffn @deffn {primitive procedure} instance? object Return @code{#t} if @var{object} is any GOOPS instance, otherwise @code{#f}. @end deffn @deffn procedure is-a? object class Return @code{#t} if @var{object} is an instance of @var{class} or one of its subclasses. @end deffn Implementation notes: @code{is-a?} uses @code{class-of} and @code{class-precedence-list} to obtain the class precedence list for @var{object}. @node Generic Functions @subsection Generic Functions @deffn {primitive procedure} generic-function-name gf Return the name of generic function @var{gf}. @end deffn @deffn {primitive procedure} generic-function-methods gf Return a list of the methods of generic function @var{gf}. This is the value of the @var{gf} metaobject's @code{methods} slot. @end deffn @node Generic Function Methods @subsection Generic Function Methods @deffn {primitive procedure} method-generic-function method Return the generic function that @var{method} belongs to. This is the value of the @var{method} metaobject's @code{generic-function} slot. @end deffn @deffn {primitive procedure} method-specializers method Return a list of @var{method}'s formal parameter specializers . This is the value of the @var{method} metaobject's @code{specializers} slot. @end deffn @deffn {primitive procedure} method-procedure method Return the procedure that implements @var{method}. This is the value of the @var{method} metaobject's @code{procedure} slot. @end deffn @deffn generic method-source @deffnx method method-source (m ) Return an expression that prints to show the definition of method @var{m}. @example (define-generic cube) (define-method (cube (n )) (* n n n)) (map method-source (generic-function-methods cube)) @result{} ((method ((n )) (* n n n))) @end example @end deffn @node Miscellaneous Functions @section Miscellaneous Functions @menu * Administrative Functions:: * Error Handling:: * Object Comparisons:: * Cloning Objects:: * Write and Display:: @end menu @node Administrative Functions @subsection Administration Functions This section describes administrative, non-technical GOOPS functions. @deffn primitive goops-version Return the current GOOPS version as a string, for example ``0.2''. @end deffn @node Error Handling @subsection Error Handling The procedure @code{goops-error} is called to raise an appropriate error by the default methods of the following generic functions: @itemize @bullet @item @code{slot-missing} (@pxref{Handling Slot Access Errors,, slot-missing}) @item @code{slot-unbound} (@pxref{Handling Slot Access Errors,, slot-unbound}) @item @code{no-method} (@pxref{Handling Invocation Errors,, no-method}) @item @code{no-applicable-method} (@pxref{Handling Invocation Errors,, no-applicable-method}) @item @code{no-next-method} (@pxref{Handling Invocation Errors,, no-next-method}) @end itemize If you customize these functions for particular classes or metaclasses, you may still want to use @code{goops-error} to signal any error conditions that you detect. @deffn procedure goops-error format-string . args Raise an error with key @code{goops-error} and error message constructed from @var{format-string} and @var{args}. Error message formatting is as done by @code{scm-error}. @end deffn @node Object Comparisons @subsection Object Comparisons @deffn generic eqv? @deffnx method eqv? ((x ) (y )) @deffnx generic equal? @deffnx method equal? ((x ) (y )) @deffnx generic = @deffnx method = ((x ) (y )) Generic functions and default (unspecialized) methods for comparing two GOOPS objects. The default method for @code{eqv?} returns @code{#t} for all values that are equal in the sense defined by R5RS and the Guile reference manual, otherwise @code{#f}. The default method for @code{equal?} returns @code{#t} or @code{#f} in the sense defined by R5RS and the Guile reference manual. If no such comparison is defined, @code{equal?} returns the result of a call to @code{eqv?}. The default method for = returns @code{#t} if @var{x} and @var{y} are numerically equal, otherwise @code{#f}. Application class authors may wish to define specialized methods for @code{eqv?}, @code{equal?} and @code{=} that compare instances of the same class for equality in whatever sense is useful to the application. Such methods will only be called if the arguments have the same class and the result of the comparison isn't defined by R5RS and the Guile reference manual. @end deffn @node Cloning Objects @subsection Cloning Objects @deffn generic shallow-clone @deffnx method shallow-clone (self ) Return a ``shallow'' clone of @var{self}. The default method makes a shallow clone by allocating a new instance and copying slot values from self to the new instance. Each slot value is copied either as an immediate value or by reference. @end deffn @deffn generic deep-clone @deffnx method deep-clone (self ) Return a ``deep'' clone of @var{self}. The default method makes a deep clone by allocating a new instance and copying or cloning slot values from self to the new instance. If a slot value is an instance (satisfies @code{instance?}), it is cloned by calling @code{deep-clone} on that value. Other slot values are copied either as immediate values or by reference. @end deffn @node Write and Display @subsection Write and Display @deffn {primitive generic} write object port @deffnx {primitive generic} display object port When GOOPS is loaded, @code{write} and @code{display} become generic functions with special methods for printing @itemize @bullet @item objects - instances of the class @code{} @item foreign objects - instances of the class @code{} @item classes - instances of the class @code{} @item generic functions - instances of the class @code{} @item methods - instances of the class @code{}. @end itemize @code{write} and @code{display} print non-GOOPS values in the same way as the Guile primitive @code{write} and @code{display} functions. @end deffn @node MOP Specification, Tutorial, Reference Manual, Top @chapter MOP Specification For an introduction to metaobjects and the metaobject protocol, see @ref{Metaobjects and the Metaobject Protocol}. The aim of the MOP specification in this chapter is to specify all the customizable generic function invocations that can be made by the standard GOOPS syntax, procedures and methods, and to explain the protocol for customizing such invocations. A generic function invocation is customizable if the types of the arguments to which it is applied are not all determined by the lexical context in which the invocation appears. For example, @itemize @bullet @item the @code{(initialize @var{instance} @var{initargs})} invocation in the default @code{make-instance} method is customizable, because the type of the @code{@var{instance}} argument is determined by the class that was passed to @code{make-instance}. @item the @code{(make #:name ',name)} invocation in @code{define-generic} is not customizable, because all of its arguments have lexically determined types. @end itemize When using this rule to decide whether a given generic function invocation is customizable, we ignore arguments that are expected to be handled in method definitions as a single ``rest'' list argument. For each customizable generic function invocation, the @dfn{invocation protocol} is explained by specifying @itemize @bullet @item what, conceptually, the applied method is intended to do @item what assumptions, if any, the caller makes about the applied method's side effects @item what the caller expects to get as the applied method's return value. @end itemize @menu * Class Definition:: * Instance Creation:: * Class Redefinition:: * Method Definition:: * Generic Function Invocation:: @end menu @node Class Definition @section Class Definition @code{define-class} (syntax) @itemize @bullet @item @code{class} (syntax) @itemize @bullet @item @code{make-class} (procedure) @itemize @bullet @item @code{make @var{metaclass} @dots{}} (generic) @var{metaclass} is the metaclass of the class being defined, either taken from the @code{#:metaclass} class option or computed by @code{ensure-metaclass}. The applied method must create and return the fully initialized class metaobject for the new class definition. @end itemize @end itemize @item @code{class-redefinition @var{old-class} @var{new-class}} (generic) @code{define-class} calls @code{class-redefinition} if the variable specified by its first argument already held a GOOPS class definition. @var{old-class} and @var{new-class} are the old and new class metaobjects. The applied method should perform whatever is necessary to handle the redefinition, and should return the class metaobject that is to be bound to @code{define-class}'s variable. The default class redefinition protocol is described in @ref{Class Redefinition}. @end itemize The @code{(make @var{metaclass} @dots{})} invocation above will create an class metaobject with metaclass @var{metaclass}. By default, this metaobject will be initialized by the @code{initialize} method that is specialized for instances of type @code{}. @code{initialize @var{initargs}} (method) @itemize @bullet @item @code{compute-cpl @var{class}} (generic) The applied method should compute and return the class precedence list for @var{class} as a list of class metaobjects. When @code{compute-cpl} is called, the following @var{class} metaobject slots have all been initialized: @code{name}, @code{direct-supers}, @code{direct-slots}, @code{direct-subclasses} (empty), @code{direct-methods}. The value returned by @code{compute-cpl} will be stored in the @code{cpl} slot. @item @code{compute-slots @var{class}} (generic) The applied method should compute and return the slots (union of direct and inherited) for @var{class} as a list of slot definitions. When @code{compute-slots} is called, all the @var{class} metaobject slots mentioned for @code{compute-cpl} have been initialized, plus the following: @code{cpl}, @code{redefined} (@code{#f}), @code{environment}. The value returned by @code{compute-slots} will be stored in the @code{slots} slot. @item @code{compute-get-n-set @var{class} @var{slot-def}} (generic) @code{initialize} calls @code{compute-get-n-set} for each slot computed by @code{compute-slots}. The applied method should compute and return a pair of closures that, respectively, get and set the value of the specified slot. The get closure should have arity 1 and expect a single argument that is the instance whose slot value is to be retrieved. The set closure should have arity 2 and expect two arguments, where the first argument is the instance whose slot value is to be set and the second argument is the new value for that slot. The closures should be returned in a two element list: @code{(list @var{get} @var{set})}. The closures returned by @code{compute-get-n-set} are stored as part of the value of the @var{class} metaobject's @code{getters-n-setters} slot. Specifically, the value of this slot is a list with the same number of elements as there are slots in the class, and each element looks either like @example @code{(@var{slot-name-symbol} @var{init-function} . @var{index})} @end example or like @example @code{(@var{slot-name-symbol} @var{init-function} @var{get} @var{set})} @end example Where the get and set closures are replaced by @var{index}, the slot is an instance slot and @var{index} is the slot's index in the underlying structure: GOOPS knows how to get and set the value of such slots and so does not need specially constructed get and set closures. Otherwise, @var{get} and @var{set} are the closures returned by @code{compute-get-n-set}. The structure of the @code{getters-n-setters} slot value is important when understanding the next customizable generic functions that @code{initialize} calls@dots{} @item @code{compute-getter-method @var{class} @var{gns}} (generic) @code{initialize} calls @code{compute-getter-method} for each of the class's slots (as determined by @code{compute-slots}) that includes a @code{#:getter} or @code{#:accessor} slot option. @var{gns} is the element of the @var{class} metaobject's @code{getters-n-setters} slot that specifies how the slot in question is referenced and set, as described above under @code{compute-get-n-set}. The applied method should create and return a method that is specialized for instances of type @var{class} and uses the get closure to retrieve the slot's value. [ *fixme Need to insert something here about checking that the value is not unbound. ] @code{initialize} uses @code{add-method!} to add the returned method to the generic function named by the slot definition's @code{#:getter} or @code{#:accessor} option. @item @code{compute-setter-method @var{class} @var{gns}} (generic) @code{compute-setter-method} is invoked with the same arguments as @code{compute-getter-method}, for each of the class's slots that includes a @code{#:setter} or @code{#:accessor} slot option. The applied method should create and return a method that is specialized for instances of type @var{class} and uses the set closure to set the slot's value. @code{initialize} then uses @code{add-method!} to add the returned method to the generic function named by the slot definition's @code{#:setter} or @code{#:accessor} option. @end itemize @node Instance Creation @section Instance Creation @code{make . @var{initargs}} (method) @itemize @bullet @item @code{allocate-instance @var{class} @var{initargs}} (generic) The applied @code{allocate-instance} method should allocate storage for a new instance of class @var{class} and return the uninitialized instance. @item @code{initialize @var{instance} @var{initargs}} (generic) @var{instance} is the uninitialized instance returned by @code{allocate-instance}. The applied method should initialize the new instance in whatever sense is appropriate for its class. The method's return value is ignored. @end itemize @node Class Redefinition @section Class Redefinition The default @code{class-redefinition} method, specialized for classes with the default metaclass @code{}, has the following internal protocol. @code{class-redefinition @var{(old )} @var{(new )}} (method) @itemize @bullet @item @code{remove-class-accessors! @var{old}} (generic) @item @code{update-direct-method! @var{method} @var{old} @var{new}} (generic) @item @code{update-direct-subclass! @var{subclass} @var{old} @var{new}} (generic) @end itemize This protocol cleans up things that the definition of the old class once changed and modifies things to work with the new class. The default @code{remove-class-accessors!} method removes the accessor methods of the old class from all classes which they specialize. The default @code{update-direct-method!} method substitutes the new class for the old in all methods specialized to the old class. The default @code{update-direct-subclass!} method invokes @code{class-redefinition} recursively to handle the redefinition of subclasses. When a class is redefined, any existing instance of the redefined class will be modified for the new class definition before the next time that any of the instance's slot is referenced or set. GOOPS modifies each instance by calling the generic function @code{change-class}. The default @code{change-class} method copies slot values from the old to the modified instance, and initializes new slots, as described in @ref{Changing the Class of an Instance}. After doing so, it makes a generic function invocation that can be used to customize the instance update algorithm. @code{change-class @var{(old-instance )} @var{(new )}} (method) @itemize @bullet @item @code{update-instance-for-different-class @var{old-instance} @var{new-instance}} (generic) @code{change-class} invokes @code{update-instance-for-different-class} as the last thing that it does before returning. The applied method can make any further adjustments to @var{new-instance} that are required to complete or modify the change of class. The return value from the applied method is ignored. The default @code{update-instance-for-different-class} method does nothing. @end itemize @node Method Definition @section Method Definition @code{define-method} (syntax) @itemize @bullet @item @code{add-method! @var{target} @var{method}} (generic) @code{define-method} invokes the @code{add-method!} generic function to handle adding the new method to a variety of possible targets. GOOPS includes methods to handle @var{target} as @itemize @bullet @item a generic function (the most common case) @item a procedure @item a primitive generic (@pxref{Extending Guiles Primitives}) @end itemize By defining further methods for @code{add-method!}, you can theoretically handle adding methods to further types of target. @end itemize @node Generic Function Invocation @section Generic Function Invocation [ *fixme* Description required here. ] @code{apply-generic} @itemize @bullet @item @code{no-method} @item @code{compute-applicable-methods} @item @code{sort-applicable-methods} @item @code{apply-methods} @item @code{no-applicable-method} @end itemize @code{sort-applicable-methods} @itemize @bullet @item @code{method-more-specific?} @end itemize @code{apply-methods} @itemize @bullet @item @code{apply-method} @end itemize @code{next-method} @itemize @bullet @item @code{no-next-method} @end itemize @node Tutorial, Concept Index, MOP Specification, Top @chapter Tutorial @include goops-tutorial.texi @node Concept Index, Function and Variable Index, Tutorial, Top @unnumberedsec Concept Index @printindex cp @node Function and Variable Index, , Concept Index, Top @unnumberedsec Function and Variable Index @printindex fn @summarycontents @contents @bye guile-1.8-1.8.8+1.orig/doc/goops/hierarchy.eps000066400000000000000000000103261155472604000206250ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF %%Title: /tmp/xfig-fig016295 %%Creator: fig2dev %%CreationDate: Fri Jun 10 23:18:16 1994 %%For: eg@kaolin (Erick Gallesio) %%BoundingBox: 0 0 361 217 %%Pages: 0 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /l {lineto} bind def /m {moveto} bind def /s {stroke} bind def /n {newpath} bind def /gs {gsave} bind def /gr {grestore} bind def /clp {closepath} bind def /graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul setrgbcolor} bind def /col-1 {} def /col0 {0 0 0 setrgbcolor} bind def /col1 {0 0 1 setrgbcolor} bind def /col2 {0 1 0 setrgbcolor} bind def /col3 {0 1 1 setrgbcolor} bind def /col4 {1 0 0 setrgbcolor} bind def /col5 {1 0 1 setrgbcolor} bind def /col6 {1 1 0 setrgbcolor} bind def /col7 {1 1 1 setrgbcolor} bind def end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 0 setlinecap 0 setlinejoin -216.0 288.0 translate 0.900 -0.900 scale 0.500 setlinewidth n 309 159 m 309 159 l gs col-1 s gr n 246.401 216.889 m 244.000 209.000 l 249.831 214.831 l gs 2 setlinejoin col-1 s gr % Polyline n 244 209 m 274 259 l gs col-1 s gr n 298.169 214.831 m 304.000 209.000 l 301.599 216.889 l gs 2 setlinejoin col-1 s gr % Polyline n 304 209 m 274 259 l gs col-1 s gr n 255.721 213.778 m 249.000 209.000 l 257.179 210.053 l gs 2 setlinejoin col-1 s gr % Polyline n 249 209 m 364 254 l gs col-1 s gr n 370.312 216.376 m 374.000 209.000 l 374.217 217.243 l gs 2 setlinejoin col-1 s gr % Polyline n 374 209 m 364 254 l gs col-1 s gr n 283.772 280.725 m 279.000 274.000 l 286.376 277.688 l gs 2 setlinejoin col-1 s gr % Polyline n 279 274 m 314 304 l gs col-1 s gr n 351.457 272.333 m 359.000 269.000 l 353.913 275.490 l gs 2 setlinejoin col-1 s gr % Polyline n 359 269 m 314 304 l gs col-1 s gr n 300.950 165.789 m 309.000 164.000 l 302.739 169.367 l gs 2 setlinejoin col-1 s gr % Polyline n 309 164 m 249 194 l gs col-1 s gr n 307.000 172.000 m 309.000 164.000 l 311.000 172.000 l gs 2 setlinejoin col-1 s gr % Polyline n 309 164 m 309 199 l gs col-1 s gr n 315.261 169.367 m 309.000 164.000 l 317.050 165.789 l gs 2 setlinejoin col-1 s gr % Polyline n 309 164 m 379 199 l gs col-1 s gr n 406.949 101.701 m 404.000 94.000 l 410.226 99.407 l gs 2 setlinejoin col-1 s gr % Polyline n 404 94 m 439 144 l gs col-1 s gr n 410.363 99.245 m 404.000 94.000 l 412.083 95.634 l gs 2 setlinejoin col-1 s gr % Polyline n 404 94 m 509 144 l gs col-1 s gr n 411.173 98.068 m 404.000 94.000 l 412.243 94.214 l gs 2 setlinejoin col-1 s gr % Polyline n 404 94 m 584 144 l gs col-1 s gr n 396.075 96.277 m 404.000 94.000 l 398.079 99.739 l gs 2 setlinejoin col-1 s gr % Polyline n 404 94 m 309 149 l gs col-1 s gr % Polyline n 584 229 m 584 204 l gs col-1 s gr n 582.000 212.000 m 584.000 204.000 l 586.000 212.000 l gs 2 setlinejoin col-1 s gr % Polyline n 584 189 m 584 159 l gs col-1 s gr n 582.000 167.000 m 584.000 159.000 l 586.000 167.000 l gs 2 setlinejoin col-1 s gr /Times-Bold findfont 12.00 scalefont setfont 239 209 m gs 1 -1 scale (A) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 274 274 m gs 1 -1 scale (D) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 359 269 m gs 1 -1 scale (E) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 304 209 m gs 1 -1 scale (B) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 374 209 m gs 1 -1 scale (C) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 314 319 m gs 1 -1 scale (F) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 289 159 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 389 89 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 424 154 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 474 154 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 559 154 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 629 154 m gs 1 -1 scale (...) col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 569 199 m gs 1 -1 scale () col-1 show gr /Times-Bold findfont 12.00 scalefont setfont 559 239 m gs 1 -1 scale () col-1 show gr $F2psEnd guile-1.8-1.8.8+1.orig/doc/goops/hierarchy.pdf000066400000000000000000000032721155472604000206110ustar00rootroot00000000000000%PDF-1.3 %Çì¢ 5 0 obj <> stream xœm”Ën1 E÷ú -íŰ¢(êš6-Ð][ï‚.Ç Äy¸)úû½Ò¼ÛÀ‘wŽ(Šä«uÄÖÕgø_o͇ÉÞý1Ôþ3lï³_Môl9„b·óë£ùi¼}0š(:U[|†[¢-¥:s¦"V!’zirù €ÒE«û/Nú-À#K5n[ŒœÑ{ âÀr¶E#¼™]±%—w ‚­af€J˜Aœ<#ž"§ªðn ¯‰J=u ŒïFÚ$9Á“"T‚ZQAn*P”mજH²XÉŽ²+sºd"ñstÎ 1¼¾sUÁ.a©-<ç•pSÁ9Chá’cž†L’eÉ8ÙtÓ®*4"w!çJi¢MŠ–ff™iÑ Ôâßs¢”Þz‚Ð^]žï1&¤dÞô=©¬E8{Ç^x¬Îã„–K=M»!T¨õ®…ÍŠk®A—¬${›4Ð'!kÞ»!ŸêW‘ò)MŠ%’“Dü1àÊÄ‚ãG©èÕ\—ˆ6dŠ+ñ€‰”PL5ô2ƒ÷„²À<‰žd¶ÄªôÉld.Ó^n¯ŒÄ%´LòNaq5O…ÝœÈè$Ü*ÂÒ7Éž·aš½çÜ™WÔt›]Ãßzk/V˜bødW¿M?ÚØv•R ~V[³ø¸\aƘë…oW·fñ¹Úæ ƒå²Zº€‰S-W‹‹e§#‰,>-­¾™b;ô{UijdS[gUÓÙóÍÃfýv^=ÅÙ(½õíùåü8€«ÅÙËõýî|Ù±GéÄ„õîy½¹ý»ÛT£¢°íÙÓßíͦÉ µP°®¼ZAý>»ÍõcÛ¨C”½Íxÿô¶¹«ßÃ~¹2ßñü(8endstream endobj 6 0 obj 660 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 11 0000000000 65535 f 0000000973 00000 n 0000001186 00000 n 0000000914 00000 n 0000000764 00000 n 0000000015 00000 n 0000000745 00000 n 0000001021 00000 n 0000001121 00000 n 0000001062 00000 n 0000001091 00000 n trailer << /Size 11 /Root 1 0 R /Info 2 0 R /ID [(¿Ccežò3f¾q\\[)(¿Ccežò3f¾q\\[)] >> startxref 1379 %%EOF guile-1.8-1.8.8+1.orig/doc/goops/hierarchy.png000066400000000000000000000141531155472604000206240ustar00rootroot00000000000000‰PNG  IHDRö.Yío"bKGDÿ‡Ì¿$IDATxœíÈüÈ]ÇßûíÙ_rÅ|=* =ΜZ¡¥ ¨X™À¡ø’¥‰‚dÑ?êÔ,‚P-–„R¬þ!$E±¥íÁF)-"­‰”Z<ücü#Éî&›ÍÏ™d²™<ÏÝ>»™É÷y?3ó™wfæ³¢,GS߀d ¤ì‹ä6d÷§¾¹±º…±=¹‹§¾…™1ûÖYÀ&¹üù~?þ½Ì‡™Ënîö°öXYØß­îv0V+ëñj“ y¸ÛVü5HRèŒquh¥ ÔMm81`S„ÒQr˜úeƲ{*Ö¥4•]¥*(¡PJil«XOy‡â2ãNÞ4S?¾ŠÎ¾+H@1×#|%3–Ývãn—¿RϾ'PD›»­y˜äÖ„gƲÃ÷úßTýU[Kå¯r ­‰9[Íp¯þèÇ~ä©Ï<ùKf䇡¦ë²¯¯äd·|[ßh&Xßóûþ»žýÕ?ó‰5QîChkiÚ]2Ù}K·“‡uêÀGÖzïüô«_T°ÛéDß5M—ý}‘¹ËmT[¥æÏ] g§š¿ý ìvº©@´#]ׯ–±@æ-{² íb¾‹ˆáæm{·?Îß}ß—AÞ‰Y˾ۙOWïƒÐòޝüíɸ‘AÞ‰Ëîo5r©a¨Á‚}þ)Sÿ.ƒ¼”ÙÊY°¯õÙ÷ι°Ñ6:^yÀleO¶!¹£E·Ð DÛh] äÍSöªAýœmR\i…hç—¯Xt7GÙC«jP/ð`–›r²½~ÁAÞüdO¬¨ytr\ˆ™l÷ëË?—ey³“Ýòí6cò~ïVü4³îJ,0È›™ì¾¥ÛÍŸpfÜ8Zw%äÍJöÔ‰mGr2늜Yw%äÍHöK'¶–s³®È¹uWb)AÞ|doš´]P0늭»Kòæ"{µ[OѬ+R²îJÜ|7ÙëœØš«Jf]éݲuW~ÿ–ƒ¼9È^ïÄÖpaÖ©°îJÜl7Ù;ê'.ͺ"UÖ]‰Û ò„—½…{*³®ô‰Jë®|7ä .{+'¶†j³®HµuW¾‘Û òÄ–½¥[WBµYWäšuWↂ<‘eoïÄ^çªYWäºuWâF‚Û`Ý•?>× O@Ùû9±54˜u¥Ú­»³ ò„“½·[C“YW¾ƒŽÂÏ0ÈMv–ƒú‘f³®ôù6Ö]‰yybÉ>ȉ­¡YW¤•uWbFAžH²ubkheÖiiÝ•˜I'ìÃØë´4늴¶îJÌ ÈFvNl mͺ"í­»¢y‚ÈÎȉ­¡µYW¤‹uWBä OÙÙ9±5´7ëŠt²îJä‰ ;—IÛ]̺ҕݬ»òÕ"yÓËÎÖ‰­¡“YW¤³uWB¸ ojÙ™;±5t3ëŠt·îJˆäM+;'¶¦¶Žf]éêÖ] q‚¼IegP?Ñݬ+ÒǺ+!H7¡ì¼œØz˜uEúYw%ò&“£[Si³®H_ë®ÄÄAÞT²ótbkègÖémÝ•˜2È›FvÎNl =ͺ"¬»SySÈÎ߉­¡¯YWdˆuWb’ o|ÙGqb¯Ó߬+•3Ⱥ+6v7ºìcOÚ.`ÖjÝ•5ÈYöќ؆˜uE[w%Æ òF•}L'ö:Ã̺RYí»ãy#Ê>®[ÃP³®ë®ÄAÞx²O>¨ŸlÖabÝ•àä%ûNìu˜uEYw%8yãÈ>‰[ ³®+뮯 oÙ'rbk`bÖagÝ•àä ûtNl l̺" ­»̃<î²OêÄ^'Ú°îæžÂgA«öÃYö‰Ø">±FÄ5•´ÏêoНìMÚ$çðÌèìo5OÀþ]ÂSöÈ‚P“¶jîp(uðìE hñ¼dƉ„ø1×âÝÁÅ?bq—ì ÕOõȺøQplìû}˯p}hk®¥EMÕÅ·+:ƒrÁ‰ù”;„À„Ju€(0cJhÕJ àh0¡Úuw˜Pó«Ó+\êªPJ©«A!ÔU¡” zö•ï¦ï: µœÕä(ŠCÅ耣ÀI(„Ҵʬ‚6Eçp’]<\šCi ØÔñPh PŽ­¸¢(äP{y~uv…›Úp¨ ›jøcèT×)¡@ãì++þ÷Òwim-…š¼z,&¼ôK¡¨ BЩ®gwÓ\ô‰…Èî©X{”RJS!”ƒîR }Ió>/¶U¬k/ϮήPA)…JUÄÔµ %8¨ˆé±èSñÙ»uµ\Ôt¼ºê+†’zì³k‹>‡­ìúiÐдò›ÓªºA eÕç¿Êƒã]ÈNcR=ê/Ï?ž~¬øŠ¼ ­rÙÀ««å¢¦ZÙ)P¨²öP†­ìqì±Â´ªŽ8Ù(œ5ÕApÑÚ¦³º“Ì/Ï®¾híMÛ3¥T¹&;¡Mµ”kjhíj^hþ[¯):8œ¾(Ùäø¿5kkPêº ªë Q J Ò3¦1Pè€~½GJ/Ï®N¯ v6¶hêý5”€Ú—@LÓ*òâé» µkŠ8F:^ÄAö"ÎŠÍÆv7+ôséÝÔí‡ü‹R²&TšÇ´yˆéÈâÌ,Ì%H—`“91Q@)`¦·£ úK€žÞ% rÄDÁéj€PJí¬iªM]ªKc¢¬mÔQ`jYOLhönS-yM:€æÅè€NÒžžWìªPݬ‚º¢Švü¢t¸ìY€œÇ´yˆIc ‹3Ó0×K;‚Á&bRÓ9N‹ËÛNxƒì¿ÿÔæZ²š ´úµ+:e˜ìǸ3åò3 8%xbêÚÇßwë`“Y÷<ÉÕ1Löê·gæ ä8KjlòAϺç)®ˆ äqg±µ«ôØÚiææ²7ı’qÜðÒ×.Œí.M§ÆPjo ¨P ¶[ı’1ÞߦrZæ!æf‘¼êfa.%Pƒ6q¬ä:Ÿþ4£‚X¬®I¶å%^Q¤¯ª ï Û áeü›‚ø,ª2¢à±ÎcâÂyŸcSŸçíëä±€‹¤gOòä“ ›’¦>ŽPÒý§ð“k&%qZ]#áAøÂ !›’øÈþ'¯D\Ê]8á³Ï2’ùÊ( ?û¯ßÂï<÷Mo5ݬI@I˜,Ag:¶ûa˜(Ï|á_^{ßÇ_þçÿy¯BÓ4ñMÏ…}¤!T™ îL;ùPµ寔·ÿÓ×^üð/¼íµýÚÓ#F¡§u@gÓË3•h[C3ÿÓUñŒO>ôµ? ï""æ¸y¢Œ~,e6†v#OñµgB˜ö‡M/¼Û1¬`áØÇoƒa'{´1´ÃÚP|c¦æY¾#…V²GC;˜Ø® €P‡æª»T)¼ˆ°‘=°óG-º@ñT@ / ,d?ŠžákňS /Ãe/‹^uæ‚^0†Ê~):`ëHöž!…Ša²W‰~ )¼@ ‘½‹è€^ úËÞUt@ / }eï#: …„~²÷ AÙ‡ˆHá »ìCE¤ð“ÓUv¢Rø‰é&;+Ñ)ü¤t‘¥è€~BÚËÎZt@ ?meç!: …Ÿˆv²óÂOBÙyŠHá' YvÞ¢RøÑi’} Ñ)üÈÔË>–è€~TêdSt@ ?"×e[t@ ?×dŸBt@ ?Õ²O%: …¯Ccµ£°Jö)E¤ð×a–[ðRö©E¤ðÜ)Ë.‚耾cµêqQvQD¤ðM¸C.>—]$Ñ)|ʵœp :¦~;ç\vK(Ñ)<nîö°V«Ýýj¿¿[!`=^Ýûé»ÉÃݶß)1ŒÎ®-ÁðÐõƒ©vH‹p[œ’×2ÉeìÒ“Úûfã_öå _L^—'}Ë3Øeô÷ËÆ1‡S(—ÚÕû‘föŒoW[Dª“øg?SÌ5ºðs}©ÂÛNbþÕ„RªïîÎyŒ6w[óнl†Òª,²«Oss2Éeìh Ľ³qðÊẹ̀Ѓy‘@ô扉r‘IN#ô8M ×3‡yñïawog|ô5.ÅÎ _46½ü#PÞûM#”?å‰ïýD¤z^Ïf•ß|/«}¢Ï>ǣؙáëY2–ᤫk^zçÓF`í~^µ£{«_´œO¿ó%&wUfûö·p)w^0Oÿ·~ãW>`$Tf YF»61>ð•7²É3]"òß eÏr° RÙÕ¯’/™F¶ó°[»nbl:þ]%†ù%òU.ŽÊöy”ºd²%”:"5Ó]ó@!ÁzwߥÉ'†©Fà’Ã9òß!S†²%[]îÈC°SŠ]t²ßië¶BîóÞÝš<ôÙh‘¾å2/œ>«v•/ªº,¥ÂX wáÚlœoûžÇ³ðÈ8 eÏ×Ék!ÙWtéšã)­ž¦%{ré‹#P”åZ²ŒÞ¯¼‰‹!03"V« ÎWÎäj²ó¡×{8>ÇÑ·÷ºà[ƒy'ΕÔL·Éű67TŸÁcɜˮê5O_U»ÖÅÙê×@DRvƶ>VFu'j\œdÏüùúYáüŠ^*Ùr½›Ï>pÅűLjKöñÌ)nt^Gxtǃ±)}̸xñyé\¼¿ESÚ=´2\Ê.νËsu£áÊÉ[ —H Q݉’‹Ã5žCz(“„%åÓ,¢º#ŠéÙa6¥ãÏáâ×I³§,{cTwBµÕzØqŽçdDǃ‹³kZDu'L׎î_þ<ÏxNÊ΃Ëc ZFu'î~àÿÖkŽíÝßrx…thÕÙ®?Ùc-N{¤YÊÊÚFu)ÉžôX‹ÓÙÇs êìš½ßá±ÊFÏFöNkq:`éÒ­ÉIXÍe«Ž#ìÕü9Å Ìý}Ï“ok­ý³ì•'UuˆêJþ\²ß+k¶½Œè8Pyøhû¨®ìÏ»8lXªYsþŠÝF×”êséÃkÕ\ù\óZœö,ueÍ=ÎzÜä.f[zõQÃm½º+þ\óZœö,rh,çãlÞþI$®n¥n±Kºv·µ»Öçݱ?ßNxªPpšٙ³® = ^öŠŽªÝíW}MöC›S}µú¼±­™A§»©(cq²§#b€Æ€w8%ŠH“Gh˜ù«4¯„Û9‰ÄÕ3‰Ýx­Ý|²„gjÚ¼·°Ó+Ž#€ÓŽÉ#²Ÿe¯hÞ]wL"qUöXk’«ù”R;š9à|Âèl•¹@ ò„”dOG@Ï_e§1é’àúG]³áRÓmYG`j‡ž:Ëãp瀣Buè•ÖN)UE·ãüU.ûÁT`vèåkþB¢º.§çÄŽ¾nûGRº‰^WÍ¢@!1ç_”±% ©ÜÙ«4¯D÷$5²7Du ñÜEiD둹*hêrn‘˜(Ð]@¶t5È’Gèç”J ´{‰º4•{`s¶IçSe{¸8 5kj2Fl-Jѽéþ[ª“½Î«këã‰v¾nvq[7\6ÌÏ™U Áß =Ùµ6iHÍØãóÖ®ì÷I‡µ8ò9Lk—`M†6†ú\1W÷ÀÙßšìöZËFœÈÓ øP/ûÕ'°÷CøûÐlÓä}Ÿù±ô )ëãµ'°C÷CT@nƒâDCB°êÈ­_ö/>-Ï«áNÙ¹í:ß©òë¿ñ÷Ò‘åO'»Æe·39Én'ìMG.ØãO—.V}×G_át/уin4y€Åt^TõoÏ­>D¸Ì«ö[Gëq’­¤ÇöïÿÓg¾ø†¿r¬§RõQèÒ­_zú©ç ÖÂ'<%=G[Ÿ‘¼ý¥_þ3W3’Tu#4LÙÎG¤‡ìŠó»ÎF=h #îÝÆi+­@¿çíš¾÷ †³¸Ä‚Ü\7.½ÌY;Œ W×(NSJù«ÈyÛ„ ^TekF/Ý÷Ž|Ä:ÃwŘªÑcâm…2‚ŸK({ôrÞ61LήéЇ"Ÿ¼L ›#‹Ké0ÿ–ó¶Éa³N¾K@/çmÀj{Dë€^ÎÛD€Ý¹t¾Õ& —ÏÛ„€áq„áÆnÜ—,Ÿ·‰Ã=pšg5œx çm¢Àrëc“C/Ÿ· ã3gë–ÜÈy›80Þè|= —ó6‘`½¿ýÚ’9o ö‹WôrÞ&Γ¯pèå¼M08brÐËy›pð8»¦äÐËy›xpJr¶†^ÎÛ„Ó™³Ç%7r›ð: ,[r#çmbÂ/3Tb˜¦œ· Ç„`‰õåïó61ášî3?αpÉdú¿E"Ö™³’‘²/)û"‘²/)û"‘²/)û"á+{ž{„b’.ð•=MÈ}‹çN>MÈmËç1‚ÁÛœ]âÁå[‡¤3üSûZƒÏ,”0‡$OdžVñàßÚÂ2߀„ cŒíáàÜÉû€Ú„³]c÷Ò«¹ºf‘ü?o8HÕ¾Ó>IEND®B`‚guile-1.8-1.8.8+1.orig/doc/goops/hierarchy.txt000066400000000000000000000010431155472604000206510ustar00rootroot00000000000000 / \\\_____________________ / \\___________ \ / \ \ \ / | \ | / | \ | A B C |\__/__ | | \ / \ / | D E \ / | F | guile-1.8-1.8.8+1.orig/doc/goops/mop.text000066400000000000000000000024011155472604000176320ustar00rootroot00000000000000*** NOTE: This information needs updating! *** P - procedure L - local procedure S - syntax G - generic M - method define-class (S) make-class (S) ensure-metaclass (P) ensure-metaclass-with-supers (P) make (G) ensure-class (P) make (G) class-redefinition (G) remove-class-accessors (G) update-direct-method (G) update-direct-subclass (G) define-generic (S) make-generic-function (S) ensure-generic-function (P) make (G) define-method (S) ensure-method (P) ensure-generic-function (P) make (G) make (G) add-method (P) method (S) ensure-method (P) initialize (class) (M) compute-cpl (P) compute-slots (G) compute-getters-n-setters (P) compute-slot-init-function (L) compute-get-n-set (G) compute-slot-accessors (P) ensure-method (P) %inherit-magic! (P) %prep-layout! (P) initialize (generic) (M) make (G) change-class (G) change-object-class (P) update-instance-for-different-class (G) make = make-instance (G) allocate-instance (G) %allocate-instance (P) initialize (G) %initialize-object (P) apply-generic (G) compute-applicable-methods (G) find-method (P) sort-applicable-methods (G) sort (P) apply-methods (G) apply-method (G) guile-1.8-1.8.8+1.orig/doc/groupings.alist000066400000000000000000000132741155472604000200670ustar00rootroot00000000000000;;; groupings.alist -*-scheme-*- ;; Copyright (C) 2002, 2006 Free Software Foundation, Inc. ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this software; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301 USA ;;; Commentary: ;; This file describes interface element groupings. ;; See (scripts scan-api) commentary for more info. ;; NOTE: Order matters; put simple ones first, composites after. ;; ;; TODO: Add goops, add math, etc etc. ;; Group `guile-C-API' needs much more serious thought. ;;; Code: ( ;; Integrity checks (C+scheme (description "in both groups `scheme' and `C' -- should be empty!") (grok () (lambda (x) (and (in-group? x 'Scheme) (in-group? x 'C))))) ;; Embedded foreign libraries (embedded-libltdl (description "begins with lt_ -- should become empty over time") (grok () (lambda (x) (name-prefix? x "lt_")))) ;; By name (libguile-internal (description "begins with scm_i_") (grok () (lambda (x) (name-prefix? x "scm_i_")))) (gdb (description "begins with gdb_") (grok () (lambda (x) (name-prefix? x "gdb_")))) (coop (description "begins with coop_") (grok () (lambda (x) (name-prefix? x "coop_")))) (gh (description "begins with gh_") (grok () (lambda (x) (name-prefix? x "gh_")))) (g-fdes (description "begins with g and ends with fds") (grok () (lambda (x) (name-prefix? x "g.+fds$")))) (r-fdes (description "begins with r and ends with fds") (grok () (lambda (x) (name-prefix? x "r.+fds$")))) (scm (description "begins with scm_") (grok () (lambda (x) (name-prefix? x "scm_")))) (k (description "constants") (grok () (lambda (x) (name-prefix? x "[_A-Z0-9]+$")))) (POSIX (description "POSIX support") (members ; from docs ;; ports and file descriptors port-revealed set-port-revealed! fileno port->fdes fdopen fdes->ports fdes->inport fdes->outport primitive-move->fdes move->fdes release-port-handle fsync open open-fdes close close-fdes unread-char unread-string pipe dup->fdes dup->inport dup->outport dup dup->port duplicate-port redirect-port dup2 port-mode close-all-ports-except port-for-each setvbuf fcntl flock select O_RDONLY O_WRONLY O_RDWR O_APPEND O_CREAT _IONBF _IOLBF _IOFBF F_DUPFD F_GETFD F_SETFD F_GETFL F_SETFL F_GETOWN F_SETOWN FD_CLOEXEC LOCK_SH LOCK_EX LOCK_UN LOCK_NB ;; file system access? stat lstat readlink chown chmod utime delete-file copy-file rename-file link symlink mkdir rmdir opendir directory-stream? readdir rewinddir closedir sync mknod tmpnam mkstemp! dirname basename R_OK W_OK X_OK F_OK stat:perms stat:type stat:blocks stat:blksize stat:ctime stat:mtime stat:atime stat:size stat:rdev stat:gid stat:uid stat:nlink stat:mode stat:ino stat:dev ;; user information passwd:name passwd:passwd passwd:uid passwd:gid passwd:gecos passwd:dir passwd:shell group:name group:passwd group:gid group:mem getpwuid getpwnam name setpwent getpwent endpwent setpw getpw getgrgid getgrnam setgrent getgrent endgrent setgr getgr cuserid getlogin ;; time tm:sec set-tm:sec tm:min set-tm:min tm:hour set-tm:hour tm:mday set-tm:mday tm:mon set-tm:mon tm:year set-tm:year tm:wday set-tm:wday tm:yday set-tm:yday tm:isdst set-tm:isdst tm:gmtoff set-tm:gmtoff tm:zone set-tm:zone tms:clock tms:utime tms:stime tms:cutime tms:cstime current-time gettimeofday localtime gmtime mktime tzset strftime strptime times get-internal-real-time get-internal-run-time ;; runtime environment program-arguments command-line getenv setenv environ putenv ;; proceses chdir getcwd umask chroot getpid getgroups getppid getuid getgid geteuid getegid setuid setgid seteuid setegid getpgrp setpgid setsid waitpid status:exit-val status:term-sig status:stop-sig system primitive-exit execl execlp execle primitive-fork nice setpriority getpriority WNOHANG WUNTRACED ;; signals kill raise sigaction restore-signals alarm pause sleep usleep setitimer getitimer SIGHUP SIGINT ;; terminals and ptys isatty? ttyname ctermid tcgetpgrp tcsetpgrp ;; pipes -- not included because they are in (ice-9 popen) ;; system identification utsname:sysname utsname:nodename utsname:release utsname:version utsname:machine uname gethostname sethostname software-type ;; locales setlocale LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME ;; encryption crypt getpass)) (math (description "math functions") (members $abs $acos $acosh $asin $asinh $atan $atan2 $atanh $cos $cosh $exp $expt $log $sin $sinh $sqrt $tan $tanh)) ;; By composition (these must be AFTER their constituent groupings) (guile-C-API (description "the official guile API available to C programs") (grok () (lambda (x) (and (in-group? x 'C) (or (in-group? x 'gh) (in-group? x 'coop) (in-group? x 'gdb)))))) ;; Add new grouping descriptions here. ) ;;; groupings.alist ends here guile-1.8-1.8.8+1.orig/doc/guile-api.alist000066400000000000000000005710651155472604000177350ustar00rootroot00000000000000;;; generated 2002-05-12 05:25:39 UTC by scan-api -- do not edit! ( (meta (GUILE_LOAD_PATH . "") (LTDL_LIBRARY_PATH . "") (guile . "pre-inst-guile") (libguileinterface . "15:0:0") (sofile . "libguile/.libs/libguile.so.15.0.0") (groups C+scheme embedded-libltdl libguile-internal gdb coop gh g-fdes r-fdes scm k POSIX math guile-C-API Scheme C) ) ;; end of meta (interface ($abs (groups math Scheme) (scan-data "#")) ($acos (groups math Scheme) (scan-data "#")) ($acosh (groups math Scheme) (scan-data "#")) ($asin (groups math Scheme) (scan-data "#")) ($asinh (groups math Scheme) (scan-data "#")) ($atan (groups math Scheme) (scan-data "#")) ($atan2 (groups math Scheme) (scan-data "#")) ($atanh (groups math Scheme) (scan-data "#")) ($cos (groups math Scheme) (scan-data "#")) ($cosh (groups math Scheme) (scan-data "#")) ($exp (groups math Scheme) (scan-data "#")) ($expt (groups math Scheme) (scan-data "#")) ($log (groups math Scheme) (scan-data "#")) ($sin (groups math Scheme) (scan-data "#")) ($sinh (groups math Scheme) (scan-data "#")) ($sqrt (groups math Scheme) (scan-data "#")) ($tan (groups math Scheme) (scan-data "#")) ($tanh (groups math Scheme) (scan-data "#")) (%cond-expand-features (groups Scheme) (scan-data "")) (%cond-expand-table (groups Scheme) (scan-data "")) (%deliver-signals (groups Scheme) (scan-data "#")) (%get-pre-modules-obarray (groups Scheme) (scan-data "#")) (%guile-build-info (groups Scheme) (scan-data "")) (%init-goops-builtins (groups Scheme) (scan-data "#")) (%init-rdelim-builtins (groups Scheme) (scan-data "#")) (%init-rw-builtins (groups Scheme) (scan-data "#")) (%library-dir (groups Scheme) (scan-data "#")) (%load-announce (groups Scheme) (scan-data "#")) (%load-extensions (groups Scheme) (scan-data "")) (%load-hook (groups Scheme) (scan-data "#")) (%load-path (groups Scheme) (scan-data "")) (%load-verbosely (groups Scheme) (scan-data "")) (%make-void-port (groups Scheme) (scan-data "#")) (%module-public-interface (groups Scheme) (scan-data "")) (%nil (groups Scheme) (scan-data "")) (%package-data-dir (groups Scheme) (scan-data "#")) (%print-module (groups Scheme) (scan-data "#")) (%print-values (groups Scheme) (scan-data "#")) (%search-load-path (groups Scheme) (scan-data "#")) (%site-dir (groups Scheme) (scan-data "#")) (* (groups Scheme) (scan-data "#")) (*features* (groups Scheme) (scan-data "")) (*null-device* (groups Scheme) (scan-data "")) (*random-state* (groups Scheme) (scan-data "")) (*unspecified* (groups Scheme) (scan-data "")) (+ (groups Scheme) (scan-data "#")) (- (groups Scheme) (scan-data "#")) (->bool (groups Scheme) (scan-data "#bool (x)>")) (/ (groups Scheme) (scan-data "#")) (1+ (groups Scheme) (scan-data "#")) (1- (groups Scheme) (scan-data "#")) (< (groups Scheme) (scan-data "#")) (<= (groups Scheme) (scan-data "#")) ( (groups Scheme) (scan-data "")) ( (groups Scheme) (scan-data "")) ( (groups Scheme) (scan-data "")) (= (groups Scheme) (scan-data "#")) (> (groups Scheme) (scan-data "#>")) (>= (groups Scheme) (scan-data "#=>")) (@apply (groups Scheme) (scan-data "")) (@bind (groups Scheme) (scan-data "")) (@call-with-current-continuation (groups Scheme) (scan-data "")) (@call-with-values (groups Scheme) (scan-data "")) (@fop (groups Scheme) (scan-data "")) (AF_INET (groups k Scheme) (scan-data "")) (AF_INET6 (groups k Scheme) (scan-data "")) (AF_UNIX (groups k Scheme) (scan-data "")) (AF_UNSPEC (groups k Scheme) (scan-data "")) (E2BIG (groups k Scheme) (scan-data "")) (EACCES (groups k Scheme) (scan-data "")) (EADDRINUSE (groups k Scheme) (scan-data "")) (EADDRNOTAVAIL (groups k Scheme) (scan-data "")) (EADV (groups k Scheme) (scan-data "")) (EAFNOSUPPORT (groups k Scheme) (scan-data "")) (EAGAIN (groups k Scheme) (scan-data "")) (EALREADY (groups k Scheme) (scan-data "")) (EBADE (groups k Scheme) (scan-data "")) (EBADF (groups k Scheme) (scan-data "")) (EBADFD (groups k Scheme) (scan-data "")) (EBADMSG (groups k Scheme) (scan-data "")) (EBADR (groups k Scheme) (scan-data "")) (EBADRQC (groups k Scheme) (scan-data "")) (EBADSLT (groups k Scheme) (scan-data "")) (EBFONT (groups k Scheme) (scan-data "")) (EBUSY (groups k Scheme) (scan-data "")) (ECHILD (groups k Scheme) (scan-data "")) (ECHRNG (groups k Scheme) (scan-data "")) (ECOMM (groups k Scheme) (scan-data "")) (ECONNABORTED (groups k Scheme) (scan-data "")) (ECONNREFUSED (groups k Scheme) (scan-data "")) (ECONNRESET (groups k Scheme) (scan-data "")) (EDEADLK (groups k Scheme) (scan-data "")) (EDEADLOCK (groups k Scheme) (scan-data "")) (EDESTADDRREQ (groups k Scheme) (scan-data "")) (EDOM (groups k Scheme) (scan-data "")) (EDOTDOT (groups k Scheme) (scan-data "")) (EDQUOT (groups k Scheme) (scan-data "")) (EEXIST (groups k Scheme) (scan-data "")) (EFAULT (groups k Scheme) (scan-data "")) (EFBIG (groups k Scheme) (scan-data "")) (EHOSTDOWN (groups k Scheme) (scan-data "")) (EHOSTUNREACH (groups k Scheme) (scan-data "")) (EIDRM (groups k Scheme) (scan-data "")) (EILSEQ (groups k Scheme) (scan-data "")) (EINPROGRESS (groups k Scheme) (scan-data "")) (EINTR (groups k Scheme) (scan-data "")) (EINVAL (groups k Scheme) (scan-data "")) (EIO (groups k Scheme) (scan-data "")) (EISCONN (groups k Scheme) (scan-data "")) (EISDIR (groups k Scheme) (scan-data "")) (EISNAM (groups k Scheme) (scan-data "")) (EL2HLT (groups k Scheme) (scan-data "")) (EL2NSYNC (groups k Scheme) (scan-data "")) (EL3HLT (groups k Scheme) (scan-data "")) (EL3RST (groups k Scheme) (scan-data "")) (ELIBACC (groups k Scheme) (scan-data "")) (ELIBBAD (groups k Scheme) (scan-data "")) (ELIBEXEC (groups k Scheme) (scan-data "")) (ELIBMAX (groups k Scheme) (scan-data "")) (ELIBSCN (groups k Scheme) (scan-data "")) (ELNRNG (groups k Scheme) (scan-data "")) (ELOOP (groups k Scheme) (scan-data "")) (EMFILE (groups k Scheme) (scan-data "")) (EMLINK (groups k Scheme) (scan-data "")) (EMSGSIZE (groups k Scheme) (scan-data "")) (EMULTIHOP (groups k Scheme) (scan-data "")) (ENAMETOOLONG (groups k Scheme) (scan-data "")) (ENAVAIL (groups k Scheme) (scan-data "")) (ENETDOWN (groups k Scheme) (scan-data "")) (ENETRESET (groups k Scheme) (scan-data "")) (ENETUNREACH (groups k Scheme) (scan-data "")) (ENFILE (groups k Scheme) (scan-data "")) (ENOANO (groups k Scheme) (scan-data "")) (ENOBUFS (groups k Scheme) (scan-data "")) (ENOCSI (groups k Scheme) (scan-data "")) (ENODATA (groups k Scheme) (scan-data "")) (ENODEV (groups k Scheme) (scan-data "")) (ENOENT (groups k Scheme) (scan-data "")) (ENOEXEC (groups k Scheme) (scan-data "")) (ENOLCK (groups k Scheme) (scan-data "")) (ENOLINK (groups k Scheme) (scan-data "")) (ENOMEM (groups k Scheme) (scan-data "")) (ENOMSG (groups k Scheme) (scan-data "")) (ENONET (groups k Scheme) (scan-data "")) (ENOPKG (groups k Scheme) (scan-data "")) (ENOPROTOOPT (groups k Scheme) (scan-data "")) (ENOSPC (groups k Scheme) (scan-data "")) (ENOSR (groups k Scheme) (scan-data "")) (ENOSTR (groups k Scheme) (scan-data "")) (ENOSYS (groups k Scheme) (scan-data "")) (ENOTBLK (groups k Scheme) (scan-data "")) (ENOTCONN (groups k Scheme) (scan-data "")) (ENOTDIR (groups k Scheme) (scan-data "")) (ENOTEMPTY (groups k Scheme) (scan-data "")) (ENOTNAM (groups k Scheme) (scan-data "")) (ENOTSOCK (groups k Scheme) (scan-data "")) (ENOTTY (groups k Scheme) (scan-data "")) (ENOTUNIQ (groups k Scheme) (scan-data "")) (ENXIO (groups k Scheme) (scan-data "")) (EOPNOTSUPP (groups k Scheme) (scan-data "")) (EOVERFLOW (groups k Scheme) (scan-data "")) (EPERM (groups k Scheme) (scan-data "")) (EPFNOSUPPORT (groups k Scheme) (scan-data "")) (EPIPE (groups k Scheme) (scan-data "")) (EPROTO (groups k Scheme) (scan-data "")) (EPROTONOSUPPORT (groups k Scheme) (scan-data "")) (EPROTOTYPE (groups k Scheme) (scan-data "")) (ERANGE (groups k Scheme) (scan-data "")) (EREMCHG (groups k Scheme) (scan-data "")) (EREMOTE (groups k Scheme) (scan-data "")) (EREMOTEIO (groups k Scheme) (scan-data "")) (ERESTART (groups k Scheme) (scan-data "")) (EROFS (groups k Scheme) (scan-data "")) (ESHUTDOWN (groups k Scheme) (scan-data "")) (ESOCKTNOSUPPORT (groups k Scheme) (scan-data "")) (ESPIPE (groups k Scheme) (scan-data "")) (ESRCH (groups k Scheme) (scan-data "")) (ESRMNT (groups k Scheme) (scan-data "")) (ESTALE (groups k Scheme) (scan-data "")) (ESTRPIPE (groups k Scheme) (scan-data "")) (ETIME (groups k Scheme) (scan-data "")) (ETIMEDOUT (groups k Scheme) (scan-data "")) (ETOOMANYREFS (groups k Scheme) (scan-data "")) (ETXTBSY (groups k Scheme) (scan-data "")) (EUCLEAN (groups k Scheme) (scan-data "")) (EUNATCH (groups k Scheme) (scan-data "")) (EUSERS (groups k Scheme) (scan-data "")) (EWOULDBLOCK (groups k Scheme) (scan-data "")) (EXDEV (groups k Scheme) (scan-data "")) (EXFULL (groups k Scheme) (scan-data "")) (FD_CLOEXEC (groups POSIX k Scheme) (scan-data "")) (F_DUPFD (groups POSIX k Scheme) (scan-data "")) (F_GETFD (groups POSIX k Scheme) (scan-data "")) (F_GETFL (groups POSIX k Scheme) (scan-data "")) (F_GETOWN (groups POSIX k Scheme) (scan-data "")) (F_OK (groups POSIX k Scheme) (scan-data "")) (F_SETFD (groups POSIX k Scheme) (scan-data "")) (F_SETFL (groups POSIX k Scheme) (scan-data "")) (F_SETOWN (groups POSIX k Scheme) (scan-data "")) (INADDR_ANY (groups k Scheme) (scan-data "")) (INADDR_BROADCAST (groups k Scheme) (scan-data "")) (INADDR_LOOPBACK (groups k Scheme) (scan-data "")) (INADDR_NONE (groups k Scheme) (scan-data "")) (ITIMER_PROF (groups k Scheme) (scan-data "")) (ITIMER_REAL (groups k Scheme) (scan-data "")) (ITIMER_VIRTUAL (groups k Scheme) (scan-data "")) (LC_ALL (groups POSIX k Scheme) (scan-data "")) (LC_COLLATE (groups POSIX k Scheme) (scan-data "")) (LC_CTYPE (groups POSIX k Scheme) (scan-data "")) (LC_MESSAGES (groups POSIX k Scheme) (scan-data "")) (LC_MONETARY (groups POSIX k Scheme) (scan-data "")) (LC_NUMERIC (groups POSIX k Scheme) (scan-data "")) (LC_TIME (groups POSIX k Scheme) (scan-data "")) (LOCK_EX (groups POSIX k Scheme) (scan-data "")) (LOCK_NB (groups POSIX k Scheme) (scan-data "")) (LOCK_SH (groups POSIX k Scheme) (scan-data "")) (LOCK_UN (groups POSIX k Scheme) (scan-data "")) (MSG_DONTROUTE (groups k Scheme) (scan-data "")) (MSG_OOB (groups k Scheme) (scan-data "")) (MSG_PEEK (groups k Scheme) (scan-data "")) (NSIG (groups k Scheme) (scan-data "")) (OPEN_BOTH (groups k Scheme) (scan-data "")) (OPEN_READ (groups k Scheme) (scan-data "")) (OPEN_WRITE (groups k Scheme) (scan-data "")) (O_APPEND (groups POSIX k Scheme) (scan-data "")) (O_CREAT (groups POSIX k Scheme) (scan-data "")) (O_EXCL (groups k Scheme) (scan-data "")) (O_NDELAY (groups k Scheme) (scan-data "")) (O_NOCTTY (groups k Scheme) (scan-data "")) (O_NONBLOCK (groups k Scheme) (scan-data "")) (O_RDONLY (groups POSIX k Scheme) (scan-data "")) (O_RDWR (groups POSIX k Scheme) (scan-data "")) (O_SYNC (groups k Scheme) (scan-data "")) (O_TRUNC (groups k Scheme) (scan-data "")) (O_WRONLY (groups POSIX k Scheme) (scan-data "")) (PF_INET (groups k Scheme) (scan-data "")) (PF_INET6 (groups k Scheme) (scan-data "")) (PF_UNIX (groups k Scheme) (scan-data "")) (PF_UNSPEC (groups k Scheme) (scan-data "")) (PIPE_BUF (groups k Scheme) (scan-data "")) (PRIO_PGRP (groups k Scheme) (scan-data "")) (PRIO_PROCESS (groups k Scheme) (scan-data "")) (PRIO_USER (groups k Scheme) (scan-data "")) (R_OK (groups POSIX k Scheme) (scan-data "")) (SA_NOCLDSTOP (groups k Scheme) (scan-data "")) (SA_RESTART (groups k Scheme) (scan-data "")) (SEEK_CUR (groups k Scheme) (scan-data "")) (SEEK_END (groups k Scheme) (scan-data "")) (SEEK_SET (groups k Scheme) (scan-data "")) (SIGABRT (groups k Scheme) (scan-data "")) (SIGALRM (groups k Scheme) (scan-data "")) (SIGBUS (groups k Scheme) (scan-data "")) (SIGCHLD (groups k Scheme) (scan-data "")) (SIGCLD (groups k Scheme) (scan-data "")) (SIGCONT (groups k Scheme) (scan-data "")) (SIGFPE (groups k Scheme) (scan-data "")) (SIGHUP (groups POSIX k Scheme) (scan-data "")) (SIGILL (groups k Scheme) (scan-data "")) (SIGINT (groups POSIX k Scheme) (scan-data "")) (SIGIO (groups k Scheme) (scan-data "")) (SIGIOT (groups k Scheme) (scan-data "")) (SIGKILL (groups k Scheme) (scan-data "")) (SIGPIPE (groups k Scheme) (scan-data "")) (SIGPOLL (groups k Scheme) (scan-data "")) (SIGPROF (groups k Scheme) (scan-data "")) (SIGPWR (groups k Scheme) (scan-data "")) (SIGQUIT (groups k Scheme) (scan-data "")) (SIGSEGV (groups k Scheme) (scan-data "")) (SIGSTKFLT (groups k Scheme) (scan-data "")) (SIGSTOP (groups k Scheme) (scan-data "")) (SIGTERM (groups k Scheme) (scan-data "")) (SIGTRAP (groups k Scheme) (scan-data "")) (SIGTSTP (groups k Scheme) (scan-data "")) (SIGTTIN (groups k Scheme) (scan-data "")) (SIGTTOU (groups k Scheme) (scan-data "")) (SIGUNUSED (groups k Scheme) (scan-data "")) (SIGURG (groups k Scheme) (scan-data "")) (SIGUSR1 (groups k Scheme) (scan-data "")) (SIGUSR2 (groups k Scheme) (scan-data "")) (SIGVTALRM (groups k Scheme) (scan-data "")) (SIGWINCH (groups k Scheme) (scan-data "")) (SIGXCPU (groups k Scheme) (scan-data "")) (SIGXFSZ (groups k Scheme) (scan-data "")) (SIG_DFL (groups k Scheme) (scan-data "")) (SIG_IGN (groups k Scheme) (scan-data "")) (SOCK_DGRAM (groups k Scheme) (scan-data "")) (SOCK_RAW (groups k Scheme) (scan-data "")) (SOCK_STREAM (groups k Scheme) (scan-data "")) (SOL_IP (groups k Scheme) (scan-data "")) (SOL_SOCKET (groups k Scheme) (scan-data "")) (SO_BROADCAST (groups k Scheme) (scan-data "")) (SO_DEBUG (groups k Scheme) (scan-data "")) (SO_DONTROUTE (groups k Scheme) (scan-data "")) (SO_ERROR (groups k Scheme) (scan-data "")) (SO_KEEPALIVE (groups k Scheme) (scan-data "")) (SO_LINGER (groups k Scheme) (scan-data "")) (SO_NO_CHECK (groups k Scheme) (scan-data "")) (SO_OOBINLINE (groups k Scheme) (scan-data "")) (SO_PRIORITY (groups k Scheme) (scan-data "")) (SO_RCVBUF (groups k Scheme) (scan-data "")) (SO_REUSEADDR (groups k Scheme) (scan-data "")) (SO_SNDBUF (groups k Scheme) (scan-data "")) (SO_TYPE (groups k Scheme) (scan-data "")) (WAIT_ANY (groups k Scheme) (scan-data "")) (WAIT_MYPGRP (groups k Scheme) (scan-data "")) (WNOHANG (groups POSIX k Scheme) (scan-data "")) (WUNTRACED (groups POSIX k Scheme) (scan-data "")) (W_OK (groups POSIX k Scheme) (scan-data "")) (X_OK (groups POSIX k Scheme) (scan-data "")) (_IOFBF (groups POSIX k Scheme) (scan-data "")) (_IOLBF (groups POSIX k Scheme) (scan-data "")) (_IONBF (groups POSIX k Scheme) (scan-data "")) (_fini (groups C) (scan-data T)) (_init (groups C) (scan-data T)) (abort-hook (groups Scheme) (scan-data "")) (abs (groups Scheme) (scan-data "#")) (accept (groups Scheme) (scan-data "#")) (access? (groups POSIX Scheme) (scan-data "#")) (acons (groups Scheme) (scan-data "#")) (acos (groups Scheme) (scan-data "#")) (acosh (groups Scheme) (scan-data "#")) (add-hook! (groups Scheme) (scan-data "#")) (after-backtrace-hook (groups Scheme) (scan-data "")) (after-error-hook (groups Scheme) (scan-data "")) (after-eval-hook (groups Scheme) (scan-data "")) (after-gc-hook (groups Scheme) (scan-data "")) (after-print-hook (groups Scheme) (scan-data "")) (after-read-hook (groups Scheme) (scan-data "")) (alarm (groups POSIX Scheme) (scan-data "#")) (and (groups Scheme) (scan-data "")) (and-map (groups Scheme) (scan-data "#")) (and=> (groups Scheme) (scan-data "# (value procedure)>")) (angle (groups Scheme) (scan-data "#")) (app (groups Scheme) (scan-data "")) (append (groups Scheme) (scan-data "#")) (append! (groups Scheme) (scan-data "#")) (apply (groups Scheme) (scan-data "#")) (apply-to-args (groups Scheme) (scan-data "#")) (apply:nconc2last (groups Scheme) (scan-data "#")) (array->list (groups Scheme) (scan-data "#list>")) (array-contents (groups Scheme) (scan-data "#")) (array-copy! (groups Scheme) (scan-data "#")) (array-copy-in-order! (groups Scheme) (scan-data "#")) (array-dimensions (groups Scheme) (scan-data "#")) (array-equal? (groups Scheme) (scan-data "#")) (array-fill! (groups Scheme) (scan-data "#")) (array-for-each (groups Scheme) (scan-data "#")) (array-in-bounds? (groups Scheme) (scan-data "#")) (array-index-map! (groups Scheme) (scan-data "#")) (array-map! (groups Scheme) (scan-data "#")) (array-map-in-order! (groups Scheme) (scan-data "#")) (array-prototype (groups Scheme) (scan-data "#")) (array-rank (groups Scheme) (scan-data "#")) (array-ref (groups Scheme) (scan-data "#")) (array-set! (groups Scheme) (scan-data "#")) (array-shape (groups Scheme) (scan-data "#")) (array? (groups Scheme) (scan-data "#")) (ash (groups Scheme) (scan-data "#")) (asin (groups Scheme) (scan-data "#")) (asinh (groups Scheme) (scan-data "#")) (assert-defmacro?! (groups Scheme) (scan-data "#")) (assert-load-verbosity (groups Scheme) (scan-data "#")) (assert-repl-print-unspecified (groups Scheme) (scan-data "#")) (assert-repl-silence (groups Scheme) (scan-data "#")) (assert-repl-verbosity (groups Scheme) (scan-data "#")) (assoc (groups Scheme) (scan-data "#")) (assoc-ref (groups Scheme) (scan-data "#")) (assoc-remove! (groups Scheme) (scan-data "#")) (assoc-set! (groups Scheme) (scan-data "#")) (assq (groups Scheme) (scan-data "#")) (assq-ref (groups Scheme) (scan-data "#")) (assq-remove! (groups Scheme) (scan-data "#")) (assq-set! (groups Scheme) (scan-data "#")) (assv (groups Scheme) (scan-data "#")) (assv-ref (groups Scheme) (scan-data "#")) (assv-remove! (groups Scheme) (scan-data "#")) (assv-set! (groups Scheme) (scan-data "#")) (async (groups Scheme) (scan-data "#")) (async-mark (groups Scheme) (scan-data "#")) (atan (groups Scheme) (scan-data "#")) (atanh (groups Scheme) (scan-data "#")) (autoload-done! (groups Scheme) (scan-data "#")) (autoload-done-or-in-progress? (groups Scheme) (scan-data "#")) (autoload-in-progress! (groups Scheme) (scan-data "#")) (autoloads-done (groups Scheme) (scan-data "")) (autoloads-in-progress (groups Scheme) (scan-data "")) (backtrace (groups Scheme) (scan-data "#")) (bad-throw (groups Scheme) (scan-data "#")) (basename (groups POSIX Scheme) (scan-data "#")) (basic-load (groups Scheme) (scan-data "#")) (batch-mode? (groups Scheme) (scan-data "#")) (beautify-user-module! (groups Scheme) (scan-data "#")) (before-backtrace-hook (groups Scheme) (scan-data "")) (before-error-hook (groups Scheme) (scan-data "")) (before-eval-hook (groups Scheme) (scan-data "")) (before-print-hook (groups Scheme) (scan-data "")) (before-read-hook (groups Scheme) (scan-data "")) (before-signal-stack (groups Scheme) (scan-data "")) (begin (groups Scheme) (scan-data "")) (begin-deprecated (groups Scheme) (scan-data "")) (bind (groups Scheme) (scan-data "#")) (bit-count (groups Scheme) (scan-data "#")) (bit-count* (groups Scheme) (scan-data "#")) (bit-extract (groups Scheme) (scan-data "#")) (bit-invert! (groups Scheme) (scan-data "#")) (bit-position (groups Scheme) (scan-data "#")) (bit-set*! (groups Scheme) (scan-data "#")) (boolean? (groups Scheme) (scan-data "#")) (caaaar (groups Scheme) (scan-data "#")) (caaadr (groups Scheme) (scan-data "#")) (caaar (groups Scheme) (scan-data "#")) (caadar (groups Scheme) (scan-data "#")) (caaddr (groups Scheme) (scan-data "#")) (caadr (groups Scheme) (scan-data "#")) (caar (groups Scheme) (scan-data "#")) (cadaar (groups Scheme) (scan-data "#")) (cadadr (groups Scheme) (scan-data "#")) (cadar (groups Scheme) (scan-data "#")) (caddar (groups Scheme) (scan-data "#")) (cadddr (groups Scheme) (scan-data "#")) (caddr (groups Scheme) (scan-data "#")) (cadr (groups Scheme) (scan-data "#")) (call-with-current-continuation (groups Scheme) (scan-data "#")) (call-with-dynamic-root (groups Scheme) (scan-data "#")) (call-with-input-file (groups Scheme) (scan-data "#")) (call-with-input-string (groups Scheme) (scan-data "#")) (call-with-new-thread (groups Scheme) (scan-data "#")) (call-with-output-file (groups Scheme) (scan-data "#")) (call-with-output-string (groups Scheme) (scan-data "#")) (call-with-values (groups Scheme) (scan-data "#")) (car (groups Scheme) (scan-data "#")) (case (groups Scheme) (scan-data "")) (catch (groups Scheme) (scan-data "#")) (cdaaar (groups Scheme) (scan-data "#")) (cdaadr (groups Scheme) (scan-data "#")) (cdaar (groups Scheme) (scan-data "#")) (cdadar (groups Scheme) (scan-data "#")) (cdaddr (groups Scheme) (scan-data "#")) (cdadr (groups Scheme) (scan-data "#")) (cdar (groups Scheme) (scan-data "#")) (cddaar (groups Scheme) (scan-data "#")) (cddadr (groups Scheme) (scan-data "#")) (cddar (groups Scheme) (scan-data "#")) (cdddar (groups Scheme) (scan-data "#")) (cddddr (groups Scheme) (scan-data "#")) (cdddr (groups Scheme) (scan-data "#")) (cddr (groups Scheme) (scan-data "#")) (cdr (groups Scheme) (scan-data "#")) (ceiling (groups Scheme) (scan-data "#")) (char->integer (groups Scheme) (scan-data "#integer>")) (char-alphabetic? (groups Scheme) (scan-data "#")) (char-ci<=? (groups Scheme) (scan-data "#")) (char-ci")) (char-ci=? (groups Scheme) (scan-data "#")) (char-ci>=? (groups Scheme) (scan-data "#=?>")) (char-ci>? (groups Scheme) (scan-data "#?>")) (char-code-limit (groups Scheme) (scan-data "")) (char-downcase (groups Scheme) (scan-data "#")) (char-is-both? (groups Scheme) (scan-data "#")) (char-lower-case? (groups Scheme) (scan-data "#")) (char-numeric? (groups Scheme) (scan-data "#")) (char-ready? (groups Scheme) (scan-data "#")) (char-upcase (groups Scheme) (scan-data "#")) (char-upper-case? (groups Scheme) (scan-data "#")) (char-whitespace? (groups Scheme) (scan-data "#")) (char<=? (groups Scheme) (scan-data "#")) (char")) (char=? (groups Scheme) (scan-data "#")) (char>=? (groups Scheme) (scan-data "#=?>")) (char>? (groups Scheme) (scan-data "#?>")) (char? (groups Scheme) (scan-data "#")) (chdir (groups POSIX Scheme) (scan-data "#")) (chmod (groups POSIX Scheme) (scan-data "#")) (chown (groups POSIX Scheme) (scan-data "#")) (chroot (groups POSIX Scheme) (scan-data "#")) (class-of (groups Scheme) (scan-data "#")) (close (groups POSIX Scheme) (scan-data "#")) (close-fdes (groups POSIX Scheme) (scan-data "#")) (close-input-port (groups Scheme) (scan-data "#")) (close-io-port (groups Scheme) (scan-data "#")) (close-output-port (groups Scheme) (scan-data "#")) (close-port (groups Scheme) (scan-data "#")) (closedir (groups POSIX Scheme) (scan-data "#")) (closure? (groups Scheme) (scan-data "#")) (collect (groups Scheme) (scan-data "")) (command-line (groups POSIX Scheme) (scan-data "#")) (compile-define-module-args (groups Scheme) (scan-data "#")) (compile-interface-spec (groups Scheme) (scan-data "#")) (complex? (groups Scheme) (scan-data "#")) (cond (groups Scheme) (scan-data "")) (cond-expand (groups Scheme) (scan-data "")) (cond-expand-provide (groups Scheme) (scan-data "#")) (connect (groups Scheme) (scan-data "#")) (cons (groups Scheme) (scan-data "#")) (cons* (groups Scheme) (scan-data "#")) (cons-source (groups Scheme) (scan-data "#")) (coop_abort (groups guile-C-API coop C) (scan-data T)) (coop_condition_variable_destroy (groups guile-C-API coop C) (scan-data T)) (coop_condition_variable_init (groups guile-C-API coop C) (scan-data T)) (coop_condition_variable_signal (groups guile-C-API coop C) (scan-data T)) (coop_condition_variable_timed_wait_mutex (groups guile-C-API coop C) (scan-data T)) (coop_condition_variable_wait_mutex (groups guile-C-API coop C) (scan-data T)) (coop_create (groups guile-C-API coop C) (scan-data T)) (coop_getspecific (groups guile-C-API coop C) (scan-data T)) (coop_global_allq (groups guile-C-API coop C) (scan-data B)) (coop_global_curr (groups guile-C-API coop C) (scan-data B)) (coop_global_runq (groups guile-C-API coop C) (scan-data B)) (coop_global_sleepq (groups guile-C-API coop C) (scan-data B)) (coop_init (groups guile-C-API coop C) (scan-data T)) (coop_join (groups guile-C-API coop C) (scan-data T)) (coop_key_create (groups guile-C-API coop C) (scan-data T)) (coop_key_delete (groups guile-C-API coop C) (scan-data T)) (coop_mutex_destroy (groups guile-C-API coop C) (scan-data T)) (coop_mutex_init (groups guile-C-API coop C) (scan-data T)) (coop_mutex_lock (groups guile-C-API coop C) (scan-data T)) (coop_mutex_trylock (groups guile-C-API coop C) (scan-data T)) (coop_mutex_unlock (groups guile-C-API coop C) (scan-data T)) (coop_new_condition_variable_init (groups guile-C-API coop C) (scan-data T)) (coop_new_mutex_init (groups guile-C-API coop C) (scan-data T)) (coop_next_runnable_thread (groups guile-C-API coop C) (scan-data T)) (coop_qget (groups guile-C-API coop C) (scan-data T)) (coop_qput (groups guile-C-API coop C) (scan-data T)) (coop_setspecific (groups guile-C-API coop C) (scan-data T)) (coop_sleephelp (groups guile-C-API coop C) (scan-data T)) (coop_start (groups guile-C-API coop C) (scan-data T)) (coop_timeout_qinsert (groups guile-C-API coop C) (scan-data T)) (coop_tmp_queue (groups guile-C-API coop C) (scan-data B)) (coop_wait_for_runnable_thread (groups guile-C-API coop C) (scan-data T)) (coop_wait_for_runnable_thread_now (groups guile-C-API coop C) (scan-data T)) (coop_yield (groups guile-C-API coop C) (scan-data T)) (copy-file (groups POSIX Scheme) (scan-data "#")) (copy-random-state (groups Scheme) (scan-data "#")) (copy-tree (groups Scheme) (scan-data "#")) (cos (groups Scheme) (scan-data "#")) (cosh (groups Scheme) (scan-data "#")) (crypt (groups POSIX Scheme) (scan-data "#")) (ctermid (groups POSIX Scheme) (scan-data "#")) (current-error-port (groups Scheme) (scan-data "#")) (current-input-port (groups Scheme) (scan-data "#")) (current-load-port (groups Scheme) (scan-data "#")) (current-module (groups Scheme) (scan-data "#")) (current-output-port (groups Scheme) (scan-data "#")) (current-time (groups POSIX Scheme) (scan-data "#")) (cuserid (groups POSIX Scheme) (scan-data "#")) (debug-disable (groups Scheme) (scan-data "#")) (debug-enable (groups Scheme) (scan-data "#")) (debug-object? (groups Scheme) (scan-data "#")) (debug-options (groups Scheme) (scan-data "#")) (debug-options-interface (groups Scheme) (scan-data "#")) (debug-set! (groups Scheme) (scan-data "")) (default-lazy-handler (groups Scheme) (scan-data "#")) (define (groups Scheme) (scan-data "")) (define-macro (groups Scheme) (scan-data "")) (define-module (groups Scheme) (scan-data "")) (define-option-interface (groups Scheme) (scan-data "")) (define-private (groups Scheme) (scan-data "")) (define-public (groups Scheme) (scan-data "")) (define-syntax-macro (groups Scheme) (scan-data "")) (defined? (groups Scheme) (scan-data "#")) (defmacro (groups Scheme) (scan-data "")) (defmacro-public (groups Scheme) (scan-data "")) (defmacro-transformer (groups Scheme) (scan-data "#")) (defmacro:syntax-transformer (groups Scheme) (scan-data "#")) (defmacro:transformer (groups Scheme) (scan-data "#")) (defmacro? (groups Scheme) (scan-data "#")) (delay (groups Scheme) (scan-data "")) (delete (groups Scheme) (scan-data "#")) (delete! (groups Scheme) (scan-data "#")) (delete-file (groups POSIX Scheme) (scan-data "#")) (delete1! (groups Scheme) (scan-data "#")) (delq (groups Scheme) (scan-data "#")) (delq! (groups Scheme) (scan-data "#")) (delq1! (groups Scheme) (scan-data "#")) (delv (groups Scheme) (scan-data "#")) (delv! (groups Scheme) (scan-data "#")) (delv1! (groups Scheme) (scan-data "#")) (destroy-guardian! (groups Scheme) (scan-data "#")) (dimensions->uniform-array (groups Scheme) (scan-data "#uniform-array>")) (directory-stream? (groups POSIX Scheme) (scan-data "#")) (dirname (groups POSIX Scheme) (scan-data "#")) (display (groups Scheme) (scan-data "#")) (display-application (groups Scheme) (scan-data "#")) (display-backtrace (groups Scheme) (scan-data "#")) (display-error (groups Scheme) (scan-data "#")) (display-usage-report (groups Scheme) (scan-data "#")) (do (groups Scheme) (scan-data "")) (doubly-weak-hash-table? (groups Scheme) (scan-data "#")) (drain-input (groups Scheme) (scan-data "#")) (dup (groups POSIX Scheme) (scan-data "#")) (dup->fdes (groups POSIX Scheme) (scan-data "#fdes>")) (dup->inport (groups POSIX Scheme) (scan-data "#inport (port/fd . maybe-fd)>")) (dup->outport (groups POSIX Scheme) (scan-data "#outport (port/fd . maybe-fd)>")) (dup->port (groups POSIX Scheme) (scan-data "#port (port/fd mode . maybe-fd)>")) (dup2 (groups POSIX Scheme) (scan-data "#")) (duplicate-port (groups POSIX Scheme) (scan-data "#")) (dynamic-args-call (groups Scheme) (scan-data "#")) (dynamic-call (groups Scheme) (scan-data "#")) (dynamic-func (groups Scheme) (scan-data "#")) (dynamic-link (groups Scheme) (scan-data "#")) (dynamic-object? (groups Scheme) (scan-data "#")) (dynamic-root (groups Scheme) (scan-data "#")) (dynamic-unlink (groups Scheme) (scan-data "#")) (dynamic-wind (groups Scheme) (scan-data "#")) (enclose-array (groups Scheme) (scan-data "#")) (endgrent (groups POSIX Scheme) (scan-data "#")) (endhostent (groups Scheme) (scan-data "#")) (endnetent (groups Scheme) (scan-data "#")) (endprotoent (groups Scheme) (scan-data "#")) (endpwent (groups POSIX Scheme) (scan-data "#")) (endservent (groups Scheme) (scan-data "#")) (entity? (groups Scheme) (scan-data "#")) (env-module (groups Scheme) (scan-data "#")) (environ (groups POSIX Scheme) (scan-data "#")) (environment-bound? (groups Scheme) (scan-data "#")) (environment-cell (groups Scheme) (scan-data "#")) (environment-define (groups Scheme) (scan-data "#")) (environment-fold (groups Scheme) (scan-data "#")) (environment-module (groups Scheme) (scan-data "#")) (environment-observe (groups Scheme) (scan-data "#")) (environment-observe-weak (groups Scheme) (scan-data "#")) (environment-ref (groups Scheme) (scan-data "#")) (environment-set! (groups Scheme) (scan-data "#")) (environment-undefine (groups Scheme) (scan-data "#")) (environment-unobserve (groups Scheme) (scan-data "#")) (environment? (groups Scheme) (scan-data "#")) (eof-object? (groups Scheme) (scan-data "#")) (eq? (groups Scheme) (scan-data "#")) (equal? (groups Scheme) (scan-data "#")) (eqv? (groups Scheme) (scan-data "#")) (error (groups Scheme) (scan-data "#")) (error-catching-loop (groups Scheme) (scan-data "#")) (error-catching-repl (groups Scheme) (scan-data "#")) (eval (groups Scheme) (scan-data "#")) (eval-case (groups Scheme) (scan-data "")) (eval-disable (groups Scheme) (scan-data "#")) (eval-enable (groups Scheme) (scan-data "#")) (eval-environment-imported (groups Scheme) (scan-data "#")) (eval-environment-local (groups Scheme) (scan-data "#")) (eval-environment-set-imported! (groups Scheme) (scan-data "#")) (eval-environment-set-local! (groups Scheme) (scan-data "#")) (eval-environment? (groups Scheme) (scan-data "#")) (eval-options (groups Scheme) (scan-data "#")) (eval-options-interface (groups Scheme) (scan-data "#")) (eval-set! (groups Scheme) (scan-data "")) (eval-string (groups Scheme) (scan-data "#")) (evaluator-traps-interface (groups Scheme) (scan-data "#")) (even? (groups Scheme) (scan-data "#")) (exact->inexact (groups Scheme) (scan-data "#inexact>")) (exact? (groups Scheme) (scan-data "#")) (execl (groups POSIX Scheme) (scan-data "#")) (execle (groups POSIX Scheme) (scan-data "#")) (execlp (groups POSIX Scheme) (scan-data "#")) (exit (groups Scheme) (scan-data "#")) (exit-hook (groups Scheme) (scan-data "")) (exp (groups Scheme) (scan-data "#")) (export (groups Scheme) (scan-data "")) (export-environment-private (groups Scheme) (scan-data "#")) (export-environment-set-private! (groups Scheme) (scan-data "#")) (export-environment-set-signature! (groups Scheme) (scan-data "#")) (export-environment-signature (groups Scheme) (scan-data "#")) (export-environment? (groups Scheme) (scan-data "#")) (export-syntax (groups Scheme) (scan-data "")) (expt (groups Scheme) (scan-data "#")) (false-if-exception (groups Scheme) (scan-data "")) (fcntl (groups POSIX Scheme) (scan-data "#")) (fdes->inport (groups POSIX Scheme) (scan-data "#inport (fdes)>")) (fdes->outport (groups POSIX Scheme) (scan-data "#outport (fdes)>")) (fdes->ports (groups POSIX Scheme) (scan-data "#ports>")) (fdopen (groups POSIX Scheme) (scan-data "#")) (feature? (groups Scheme) (scan-data "#")) (file-exists? (groups Scheme) (scan-data "#")) (file-is-directory? (groups Scheme) (scan-data "#")) (file-port? (groups Scheme) (scan-data "#")) (file-position (groups Scheme) (scan-data "#")) (file-set-position (groups Scheme) (scan-data "#")) (fileno (groups POSIX Scheme) (scan-data "#")) (flock (groups POSIX Scheme) (scan-data "#")) (floor (groups Scheme) (scan-data "#")) (fluid-ref (groups Scheme) (scan-data "#")) (fluid-set! (groups Scheme) (scan-data "#")) (fluid? (groups Scheme) (scan-data "#")) (flush-all-ports (groups Scheme) (scan-data "#")) (for-each (groups Scheme) (scan-data "#")) (for-next-option (groups Scheme) (scan-data "#")) (force (groups Scheme) (scan-data "#")) (force-output (groups Scheme) (scan-data "#")) (format (groups Scheme) (scan-data "#")) (frame-arguments (groups Scheme) (scan-data "#")) (frame-evaluating-args? (groups Scheme) (scan-data "#")) (frame-next (groups Scheme) (scan-data "#")) (frame-number (groups Scheme) (scan-data "#")) (frame-overflow? (groups Scheme) (scan-data "#")) (frame-previous (groups Scheme) (scan-data "#")) (frame-procedure (groups Scheme) (scan-data "#")) (frame-procedure? (groups Scheme) (scan-data "#")) (frame-real? (groups Scheme) (scan-data "#")) (frame-source (groups Scheme) (scan-data "#")) (frame? (groups Scheme) (scan-data "#")) (fsync (groups POSIX Scheme) (scan-data "#")) (ftell (groups Scheme) (scan-data "#")) (gc (groups Scheme) (scan-data "#")) (gc-run-time (groups Scheme) (scan-data "#")) (gc-stats (groups Scheme) (scan-data "#")) (gcd (groups Scheme) (scan-data "#")) (gdb_binding (groups guile-C-API gdb C) (scan-data T)) (gdb_eval (groups guile-C-API gdb C) (scan-data T)) (gdb_language (groups guile-C-API gdb C) (scan-data D)) (gdb_maybe_valid_type_p (groups guile-C-API gdb C) (scan-data T)) (gdb_options (groups guile-C-API gdb C) (scan-data D)) (gdb_output (groups guile-C-API gdb C) (scan-data B)) (gdb_output_length (groups guile-C-API gdb C) (scan-data B)) (gdb_print (groups guile-C-API gdb C) (scan-data T)) (gdb_read (groups guile-C-API gdb C) (scan-data T)) (gdb_result (groups guile-C-API gdb C) (scan-data B)) (gensym (groups Scheme) (scan-data "#")) (get-internal-real-time (groups POSIX Scheme) (scan-data "#")) (get-internal-run-time (groups POSIX Scheme) (scan-data "#")) (get-option (groups Scheme) (scan-data "#")) (get-output-string (groups Scheme) (scan-data "#")) (get-print-state (groups Scheme) (scan-data "#")) (getcwd (groups POSIX Scheme) (scan-data "#")) (getegid (groups POSIX Scheme) (scan-data "#")) (getenv (groups POSIX Scheme) (scan-data "#")) (geteuid (groups POSIX Scheme) (scan-data "#")) (getgid (groups POSIX Scheme) (scan-data "#")) (getgr (groups POSIX Scheme) (scan-data "#")) (getgrent (groups POSIX Scheme) (scan-data "#")) (getgrgid (groups POSIX Scheme) (scan-data "#")) (getgrnam (groups POSIX Scheme) (scan-data "#")) (getgroups (groups POSIX Scheme) (scan-data "#")) (gethost (groups Scheme) (scan-data "#")) (gethostbyaddr (groups Scheme) (scan-data "#")) (gethostbyname (groups Scheme) (scan-data "#")) (gethostent (groups Scheme) (scan-data "#")) (gethostname (groups POSIX Scheme) (scan-data "#")) (getitimer (groups POSIX Scheme) (scan-data "#")) (getlogin (groups POSIX Scheme) (scan-data "#")) (getnet (groups Scheme) (scan-data "#")) (getnetbyaddr (groups Scheme) (scan-data "#")) (getnetbyname (groups Scheme) (scan-data "#")) (getnetent (groups Scheme) (scan-data "#")) (getpass (groups POSIX Scheme) (scan-data "#")) (getpeername (groups Scheme) (scan-data "#")) (getpgrp (groups POSIX Scheme) (scan-data "#")) (getpid (groups POSIX Scheme) (scan-data "#")) (getppid (groups POSIX Scheme) (scan-data "#")) (getpriority (groups POSIX Scheme) (scan-data "#")) (getproto (groups Scheme) (scan-data "#")) (getprotobyname (groups Scheme) (scan-data "#")) (getprotobynumber (groups Scheme) (scan-data "#")) (getprotoent (groups Scheme) (scan-data "#")) (getpw (groups POSIX Scheme) (scan-data "#")) (getpwent (groups POSIX Scheme) (scan-data "#")) (getpwnam (groups POSIX Scheme) (scan-data "#")) (getpwuid (groups POSIX Scheme) (scan-data "#")) (getserv (groups Scheme) (scan-data "#")) (getservbyname (groups Scheme) (scan-data "#")) (getservbyport (groups Scheme) (scan-data "#")) (getservent (groups Scheme) (scan-data "#")) (getsockname (groups Scheme) (scan-data "#")) (getsockopt (groups Scheme) (scan-data "#")) (gettimeofday (groups POSIX Scheme) (scan-data "#")) (getuid (groups POSIX Scheme) (scan-data "#")) (gh_append (groups guile-C-API gh C) (scan-data T)) (gh_append2 (groups guile-C-API gh C) (scan-data T)) (gh_append3 (groups guile-C-API gh C) (scan-data T)) (gh_append4 (groups guile-C-API gh C) (scan-data T)) (gh_apply (groups guile-C-API gh C) (scan-data T)) (gh_bool2scm (groups guile-C-API gh C) (scan-data T)) (gh_boolean_p (groups guile-C-API gh C) (scan-data T)) (gh_caaar (groups guile-C-API gh C) (scan-data T)) (gh_caadr (groups guile-C-API gh C) (scan-data T)) (gh_caar (groups guile-C-API gh C) (scan-data T)) (gh_cadar (groups guile-C-API gh C) (scan-data T)) (gh_caddr (groups guile-C-API gh C) (scan-data T)) (gh_cadr (groups guile-C-API gh C) (scan-data T)) (gh_call0 (groups guile-C-API gh C) (scan-data T)) (gh_call1 (groups guile-C-API gh C) (scan-data T)) (gh_call2 (groups guile-C-API gh C) (scan-data T)) (gh_call3 (groups guile-C-API gh C) (scan-data T)) (gh_car (groups guile-C-API gh C) (scan-data T)) (gh_catch (groups guile-C-API gh C) (scan-data T)) (gh_cdaar (groups guile-C-API gh C) (scan-data T)) (gh_cdadr (groups guile-C-API gh C) (scan-data T)) (gh_cdar (groups guile-C-API gh C) (scan-data T)) (gh_cddar (groups guile-C-API gh C) (scan-data T)) (gh_cdddr (groups guile-C-API gh C) (scan-data T)) (gh_cddr (groups guile-C-API gh C) (scan-data T)) (gh_cdr (groups guile-C-API gh C) (scan-data T)) (gh_char2scm (groups guile-C-API gh C) (scan-data T)) (gh_char_p (groups guile-C-API gh C) (scan-data T)) (gh_chars2byvect (groups guile-C-API gh C) (scan-data T)) (gh_cons (groups guile-C-API gh C) (scan-data T)) (gh_define (groups guile-C-API gh C) (scan-data T)) (gh_display (groups guile-C-API gh C) (scan-data T)) (gh_double2scm (groups guile-C-API gh C) (scan-data T)) (gh_doubles2dvect (groups guile-C-API gh C) (scan-data T)) (gh_doubles2scm (groups guile-C-API gh C) (scan-data T)) (gh_enter (groups guile-C-API gh C) (scan-data T)) (gh_eq_p (groups guile-C-API gh C) (scan-data T)) (gh_equal_p (groups guile-C-API gh C) (scan-data T)) (gh_eqv_p (groups guile-C-API gh C) (scan-data T)) (gh_eval_file (groups guile-C-API gh C) (scan-data T)) (gh_eval_file_with_catch (groups guile-C-API gh C) (scan-data T)) (gh_eval_file_with_standard_handler (groups guile-C-API gh C) (scan-data T)) (gh_eval_str (groups guile-C-API gh C) (scan-data T)) (gh_eval_str_with_catch (groups guile-C-API gh C) (scan-data T)) (gh_eval_str_with_stack_saving_handler (groups guile-C-API gh C) (scan-data T)) (gh_eval_str_with_standard_handler (groups guile-C-API gh C) (scan-data T)) (gh_exact_p (groups guile-C-API gh C) (scan-data T)) (gh_floats2fvect (groups guile-C-API gh C) (scan-data T)) (gh_get_substr (groups guile-C-API gh C) (scan-data T)) (gh_inexact_p (groups guile-C-API gh C) (scan-data T)) (gh_int2scm (groups guile-C-API gh C) (scan-data T)) (gh_ints2scm (groups guile-C-API gh C) (scan-data T)) (gh_length (groups guile-C-API gh C) (scan-data T)) (gh_list_p (groups guile-C-API gh C) (scan-data T)) (gh_long2scm (groups guile-C-API gh C) (scan-data T)) (gh_longs2ivect (groups guile-C-API gh C) (scan-data T)) (gh_lookup (groups guile-C-API gh C) (scan-data T)) (gh_make_vector (groups guile-C-API gh C) (scan-data T)) (gh_module_lookup (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure0_0 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure0_1 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure0_2 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure1_0 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure1_1 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure1_2 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure2_0 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure2_1 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure2_2 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure3_0 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure4_0 (groups guile-C-API gh C) (scan-data T)) (gh_new_procedure5_0 (groups guile-C-API gh C) (scan-data T)) (gh_newline (groups guile-C-API gh C) (scan-data T)) (gh_null_p (groups guile-C-API gh C) (scan-data T)) (gh_number_p (groups guile-C-API gh C) (scan-data T)) (gh_pair_p (groups guile-C-API gh C) (scan-data T)) (gh_procedure_p (groups guile-C-API gh C) (scan-data T)) (gh_repl (groups guile-C-API gh C) (scan-data T)) (gh_scm2bool (groups guile-C-API gh C) (scan-data T)) (gh_scm2char (groups guile-C-API gh C) (scan-data T)) (gh_scm2chars (groups guile-C-API gh C) (scan-data T)) (gh_scm2double (groups guile-C-API gh C) (scan-data T)) (gh_scm2doubles (groups guile-C-API gh C) (scan-data T)) (gh_scm2floats (groups guile-C-API gh C) (scan-data T)) (gh_scm2int (groups guile-C-API gh C) (scan-data T)) (gh_scm2long (groups guile-C-API gh C) (scan-data T)) (gh_scm2longs (groups guile-C-API gh C) (scan-data T)) (gh_scm2newstr (groups guile-C-API gh C) (scan-data T)) (gh_scm2shorts (groups guile-C-API gh C) (scan-data T)) (gh_scm2ulong (groups guile-C-API gh C) (scan-data T)) (gh_set_car_x (groups guile-C-API gh C) (scan-data T)) (gh_set_cdr_x (groups guile-C-API gh C) (scan-data T)) (gh_set_substr (groups guile-C-API gh C) (scan-data T)) (gh_shorts2svect (groups guile-C-API gh C) (scan-data T)) (gh_standard_handler (groups guile-C-API gh C) (scan-data T)) (gh_str02scm (groups guile-C-API gh C) (scan-data T)) (gh_str2scm (groups guile-C-API gh C) (scan-data T)) (gh_string_equal_p (groups guile-C-API gh C) (scan-data T)) (gh_string_p (groups guile-C-API gh C) (scan-data T)) (gh_symbol2newstr (groups guile-C-API gh C) (scan-data T)) (gh_symbol2scm (groups guile-C-API gh C) (scan-data T)) (gh_symbol_p (groups guile-C-API gh C) (scan-data T)) (gh_ulong2scm (groups guile-C-API gh C) (scan-data T)) (gh_ulongs2uvect (groups guile-C-API gh C) (scan-data T)) (gh_uniform_vector_length (groups guile-C-API gh C) (scan-data T)) (gh_uniform_vector_ref (groups guile-C-API gh C) (scan-data T)) (gh_vector_length (groups guile-C-API gh C) (scan-data T)) (gh_vector_p (groups guile-C-API gh C) (scan-data T)) (gh_vector_ref (groups guile-C-API gh C) (scan-data T)) (gh_vector_set_x (groups guile-C-API gh C) (scan-data T)) (gh_write (groups guile-C-API gh C) (scan-data T)) (gmtime (groups POSIX Scheme) (scan-data "#")) (group:gid (groups POSIX Scheme) (scan-data "#")) (group:mem (groups POSIX Scheme) (scan-data "#")) (group:name (groups POSIX Scheme) (scan-data "#")) (group:passwd (groups POSIX Scheme) (scan-data "#")) (guardian-destroyed? (groups Scheme) (scan-data "#")) (guardian-greedy? (groups Scheme) (scan-data "#")) (handle-system-error (groups Scheme) (scan-data "#")) (has-shown-backtrace-hint? (groups Scheme) (scan-data "")) (has-shown-debugger-hint? (groups Scheme) (scan-data "")) (has-suffix? (groups Scheme) (scan-data "#")) (hash (groups Scheme) (scan-data "#")) (hash-create-handle! (groups Scheme) (scan-data "#")) (hash-fold (groups Scheme) (scan-data "#")) (hash-get-handle (groups Scheme) (scan-data "#")) (hash-ref (groups Scheme) (scan-data "#")) (hash-remove! (groups Scheme) (scan-data "#")) (hash-set! (groups Scheme) (scan-data "#")) (hashq (groups Scheme) (scan-data "#")) (hashq-create-handle! (groups Scheme) (scan-data "#")) (hashq-get-handle (groups Scheme) (scan-data "#")) (hashq-ref (groups Scheme) (scan-data "#")) (hashq-remove! (groups Scheme) (scan-data "#")) (hashq-set! (groups Scheme) (scan-data "#")) (hashv (groups Scheme) (scan-data "#")) (hashv-create-handle! (groups Scheme) (scan-data "#")) (hashv-get-handle (groups Scheme) (scan-data "#")) (hashv-ref (groups Scheme) (scan-data "#")) (hashv-remove! (groups Scheme) (scan-data "#")) (hashv-set! (groups Scheme) (scan-data "#")) (hashx-create-handle! (groups Scheme) (scan-data "#")) (hashx-get-handle (groups Scheme) (scan-data "#")) (hashx-ref (groups Scheme) (scan-data "#")) (hashx-set! (groups Scheme) (scan-data "#")) (hook->list (groups Scheme) (scan-data "#list>")) (hook-empty? (groups Scheme) (scan-data "#")) (hook? (groups Scheme) (scan-data "#")) (hostent:addr-list (groups Scheme) (scan-data "#")) (hostent:addrtype (groups Scheme) (scan-data "#")) (hostent:aliases (groups Scheme) (scan-data "#")) (hostent:length (groups Scheme) (scan-data "#")) (hostent:name (groups Scheme) (scan-data "#")) (htonl (groups Scheme) (scan-data "#")) (htons (groups Scheme) (scan-data "#")) (identity (groups Scheme) (scan-data "#")) (if (groups Scheme) (scan-data "")) (imag-part (groups Scheme) (scan-data "#")) (import-environment-imports (groups Scheme) (scan-data "#")) (import-environment-set-imports! (groups Scheme) (scan-data "#")) (import-environment? (groups Scheme) (scan-data "#")) (in-vicinity (groups Scheme) (scan-data "#")) (include-deprecated-features (groups Scheme) (scan-data "#")) (inet-aton (groups Scheme) (scan-data "#")) (inet-lnaof (groups Scheme) (scan-data "#")) (inet-makeaddr (groups Scheme) (scan-data "#")) (inet-netof (groups Scheme) (scan-data "#")) (inet-ntoa (groups Scheme) (scan-data "#")) (inet-ntop (groups Scheme) (scan-data "#")) (inet-pton (groups Scheme) (scan-data "#")) (inexact->exact (groups Scheme) (scan-data "#exact>")) (inexact? (groups Scheme) (scan-data "#")) (inf (groups Scheme) (scan-data "#")) (inf? (groups Scheme) (scan-data "#")) (inherit-print-state (groups Scheme) (scan-data "#")) (input-port? (groups Scheme) (scan-data "#")) (integer->char (groups Scheme) (scan-data "#char>")) (integer-expt (groups Scheme) (scan-data "#")) (integer-length (groups Scheme) (scan-data "#")) (integer? (groups Scheme) (scan-data "#")) (interaction-environment (groups Scheme) (scan-data "#")) (internal-time-units-per-second (groups Scheme) (scan-data "")) (iota (groups Scheme) (scan-data "#")) (ipow-by-squaring (groups Scheme) (scan-data "#")) (isatty? (groups POSIX Scheme) (scan-data "#")) (issue-deprecation-warning (groups Scheme) (scan-data "#")) (join-thread (groups Scheme) (scan-data "#")) (keyword->symbol (groups Scheme) (scan-data "#symbol (kw)>")) (keyword-dash-symbol (groups Scheme) (scan-data "#")) (keyword-like-symbol->keyword (groups Scheme) (scan-data "#keyword (sym)>")) (keyword? (groups Scheme) (scan-data "#")) (kill (groups POSIX Scheme) (scan-data "#")) (kw-arg-ref (groups Scheme) (scan-data "#")) (lambda (groups Scheme) (scan-data "")) (last-pair (groups Scheme) (scan-data "#")) (last-stack-frame (groups Scheme) (scan-data "#")) (lazy-catch (groups Scheme) (scan-data "#")) (lazy-handler-dispatch (groups Scheme) (scan-data "#")) (lcm (groups Scheme) (scan-data "#")) (leaf-environment? (groups Scheme) (scan-data "#")) (length (groups Scheme) (scan-data "#")) (let (groups Scheme) (scan-data "")) (let* (groups Scheme) (scan-data "")) (letrec (groups Scheme) (scan-data "")) (link (groups POSIX Scheme) (scan-data "#")) (list (groups Scheme) (scan-data "#")) (list->array (groups Scheme) (scan-data "#array (ndim lst)>")) (list->string (groups Scheme) (scan-data "#string>")) (list->symbol (groups Scheme) (scan-data "#symbol args>")) (list->uniform-array (groups Scheme) (scan-data "#uniform-array>")) (list->uniform-vector (groups Scheme) (scan-data "#uniform-vector (prot lst)>")) (list->vector (groups Scheme) (scan-data "#vector>")) (list->weak-vector (groups Scheme) (scan-data "#weak-vector>")) (list-cdr-ref (groups Scheme) (scan-data "#")) (list-cdr-set! (groups Scheme) (scan-data "#")) (list-copy (groups Scheme) (scan-data "#")) (list-head (groups Scheme) (scan-data "#")) (list-index (groups Scheme) (scan-data "#")) (list-ref (groups Scheme) (scan-data "#")) (list-set! (groups Scheme) (scan-data "#")) (list-tail (groups Scheme) (scan-data "#")) (list? (groups Scheme) (scan-data "#")) (listen (groups Scheme) (scan-data "#")) (load (groups Scheme) (scan-data "#")) (load-compiled (groups Scheme) (scan-data "")) (load-emacs-interface (groups Scheme) (scan-data "#")) (load-extension (groups Scheme) (scan-data "#")) (load-from-path (groups Scheme) (scan-data "#")) (load-module (groups Scheme) (scan-data "#")) (load-user-init (groups Scheme) (scan-data "#")) (local-define (groups Scheme) (scan-data "#")) (local-eval (groups Scheme) (scan-data "#")) (local-ref (groups Scheme) (scan-data "#")) (local-remove (groups Scheme) (scan-data "#")) (local-set! (groups Scheme) (scan-data "#")) (localtime (groups POSIX Scheme) (scan-data "#")) (lock-mutex (groups Scheme) (scan-data "#")) (log (groups Scheme) (scan-data "#")) (log10 (groups Scheme) (scan-data "#")) (logand (groups Scheme) (scan-data "#")) (logbit? (groups Scheme) (scan-data "#")) (logcount (groups Scheme) (scan-data "#")) (logior (groups Scheme) (scan-data "#")) (lognot (groups Scheme) (scan-data "#")) (logtest (groups Scheme) (scan-data "#")) (logxor (groups Scheme) (scan-data "#")) (lstat (groups POSIX Scheme) (scan-data "#")) (macro-name (groups Scheme) (scan-data "#")) (macro-table (groups Scheme) (scan-data "")) (macro-transformer (groups Scheme) (scan-data "#")) (macro-type (groups Scheme) (scan-data "#")) (macro? (groups Scheme) (scan-data "#")) (macroexpand (groups Scheme) (scan-data "#")) (macroexpand-1 (groups Scheme) (scan-data "#")) (magnitude (groups Scheme) (scan-data "#")) (major-version (groups Scheme) (scan-data "#")) (make-arbiter (groups Scheme) (scan-data "#")) (make-array (groups Scheme) (scan-data "#")) (make-autoload-interface (groups Scheme) (scan-data "#")) (make-class-object (groups Scheme) (scan-data "#")) (make-condition-variable (groups Scheme) (scan-data "#")) (make-doubly-weak-hash-table (groups Scheme) (scan-data "#")) (make-eval-environment (groups Scheme) (scan-data "#")) (make-export-environment (groups Scheme) (scan-data "#")) (make-fluid (groups Scheme) (scan-data "#")) (make-guardian (groups Scheme) (scan-data "#")) (make-hash-table (groups Scheme) (scan-data "#")) (make-hook (groups Scheme) (scan-data "#")) (make-import-environment (groups Scheme) (scan-data "#")) (make-keyword-from-dash-symbol (groups Scheme) (scan-data "#")) (make-leaf-environment (groups Scheme) (scan-data "#")) (make-list (groups Scheme) (scan-data "#")) (make-module (groups Scheme) (scan-data "#")) (make-modules-in (groups Scheme) (scan-data "#")) (make-mutex (groups Scheme) (scan-data "#")) (make-object-property (groups Scheme) (scan-data "#")) (make-polar (groups Scheme) (scan-data "#")) (make-procedure-with-setter (groups Scheme) (scan-data "#")) (make-record-type (groups Scheme) (scan-data "#")) (make-rectangular (groups Scheme) (scan-data "#")) (make-regexp (groups Scheme) (scan-data "#")) (make-root-module (groups Scheme) (scan-data "#")) (make-scm-module (groups Scheme) (scan-data "#")) (make-shared-array (groups Scheme) (scan-data "#")) (make-soft-port (groups Scheme) (scan-data "#")) (make-stack (groups Scheme) (scan-data "#")) (make-string (groups Scheme) (scan-data "#")) (make-struct (groups Scheme) (scan-data "#")) (make-struct-layout (groups Scheme) (scan-data "#")) (make-subclass-object (groups Scheme) (scan-data "#")) (make-symbol (groups Scheme) (scan-data "#")) (make-undefined-variable (groups Scheme) (scan-data "#")) (make-uniform-array (groups Scheme) (scan-data "#")) (make-uniform-vector (groups Scheme) (scan-data "#uniform-array>")) (make-variable (groups Scheme) (scan-data "#")) (make-vector (groups Scheme) (scan-data "#")) (make-vtable-vtable (groups Scheme) (scan-data "#")) (make-weak-key-hash-table (groups Scheme) (scan-data "#")) (make-weak-value-hash-table (groups Scheme) (scan-data "#")) (make-weak-vector (groups Scheme) (scan-data "#")) (map (groups Scheme) (scan-data "#")) (map-in-order (groups Scheme) (scan-data "#")) (mask-signals (groups Scheme) (scan-data "#")) (max (groups Scheme) (scan-data "#")) (member (groups Scheme) (scan-data "#")) (memoized-environment (groups Scheme) (scan-data "#")) (memoized? (groups Scheme) (scan-data "#")) (memq (groups Scheme) (scan-data "#")) (memv (groups Scheme) (scan-data "#")) (merge (groups Scheme) (scan-data "#")) (merge! (groups Scheme) (scan-data "#")) (micro-version (groups Scheme) (scan-data "#")) (min (groups Scheme) (scan-data "#")) (minor-version (groups Scheme) (scan-data "#")) (mkdir (groups POSIX Scheme) (scan-data "#")) (mknod (groups POSIX Scheme) (scan-data "#")) (mkstemp! (groups POSIX Scheme) (scan-data "#")) (mktime (groups POSIX Scheme) (scan-data "#")) (module-add! (groups Scheme) (scan-data "#")) (module-binder (groups Scheme) (scan-data "#")) (module-bound? (groups Scheme) (scan-data "#")) (module-clear! (groups Scheme) (scan-data "#")) (module-constructor (groups Scheme) (scan-data "#")) (module-define! (groups Scheme) (scan-data "#")) (module-defined? (groups Scheme) (scan-data "#")) (module-ensure-local-variable! (groups Scheme) (scan-data "#")) (module-eval-closure (groups Scheme) (scan-data "#")) (module-export! (groups Scheme) (scan-data "#")) (module-for-each (groups Scheme) (scan-data "#")) (module-kind (groups Scheme) (scan-data "#")) (module-local-variable (groups Scheme) (scan-data "#")) (module-locally-bound? (groups Scheme) (scan-data "#")) (module-make-local-var! (groups Scheme) (scan-data "#")) (module-map (groups Scheme) (scan-data "#")) (module-modified (groups Scheme) (scan-data "#")) (module-name (groups Scheme) (scan-data "#")) (module-obarray (groups Scheme) (scan-data "#")) (module-obarray-get-handle (groups Scheme) (scan-data "#")) (module-obarray-ref (groups Scheme) (scan-data "#")) (module-obarray-remove! (groups Scheme) (scan-data "#")) (module-obarray-set! (groups Scheme) (scan-data "#")) (module-observe (groups Scheme) (scan-data "#")) (module-observe-weak (groups Scheme) (scan-data "#")) (module-observer-id (groups Scheme) (scan-data "#")) (module-observers (groups Scheme) (scan-data "#")) (module-public-interface (groups Scheme) (scan-data "#")) (module-re-export! (groups Scheme) (scan-data "#")) (module-ref (groups Scheme) (scan-data "#")) (module-remove! (groups Scheme) (scan-data "#")) (module-search (groups Scheme) (scan-data "#")) (module-set! (groups Scheme) (scan-data "#")) (module-symbol-binding (groups Scheme) (scan-data "#")) (module-symbol-interned? (groups Scheme) (scan-data "#")) (module-symbol-local-binding (groups Scheme) (scan-data "#")) (module-symbol-locally-interned? (groups Scheme) (scan-data "#")) (module-transformer (groups Scheme) (scan-data "#")) (module-type (groups Scheme) (scan-data "")) (module-unobserve (groups Scheme) (scan-data "#")) (module-use! (groups Scheme) (scan-data "#")) (module-uses (groups Scheme) (scan-data "#")) (module-variable (groups Scheme) (scan-data "#")) (module-weak-observers (groups Scheme) (scan-data "#")) (module? (groups Scheme) (scan-data "#")) (modulo (groups Scheme) (scan-data "#")) (most-negative-fixnum (groups Scheme) (scan-data "")) (most-positive-fixnum (groups Scheme) (scan-data "")) (move->fdes (groups POSIX Scheme) (scan-data "#fdes (fd/port fd)>")) (named-module-use! (groups Scheme) (scan-data "#")) (nan (groups Scheme) (scan-data "#")) (nan? (groups Scheme) (scan-data "#")) (negative? (groups Scheme) (scan-data "#")) (nested-define! (groups Scheme) (scan-data "#")) (nested-ref (groups Scheme) (scan-data "#")) (nested-remove! (groups Scheme) (scan-data "#")) (nested-set! (groups Scheme) (scan-data "#")) (netent:addrtype (groups Scheme) (scan-data "#")) (netent:aliases (groups Scheme) (scan-data "#")) (netent:name (groups Scheme) (scan-data "#")) (netent:net (groups Scheme) (scan-data "#")) (newline (groups Scheme) (scan-data "#")) (nice (groups POSIX Scheme) (scan-data "#")) (nil-cond (groups Scheme) (scan-data "")) (noop (groups Scheme) (scan-data "#")) (not (groups Scheme) (scan-data "#")) (ntohl (groups Scheme) (scan-data "#")) (ntohs (groups Scheme) (scan-data "#")) (null? (groups Scheme) (scan-data "#")) (number->string (groups Scheme) (scan-data "#string>")) (number? (groups Scheme) (scan-data "#")) (object->string (groups Scheme) (scan-data "#string>")) (object-address (groups Scheme) (scan-data "#")) (object-properties (groups Scheme) (scan-data "#")) (object-property (groups Scheme) (scan-data "#")) (odd? (groups Scheme) (scan-data "#")) (open (groups POSIX Scheme) (scan-data "#")) (open-fdes (groups POSIX Scheme) (scan-data "#")) (open-file (groups Scheme) (scan-data "#")) (open-input-file (groups Scheme) (scan-data "#")) (open-input-string (groups Scheme) (scan-data "#")) (open-io-file (groups Scheme) (scan-data "#")) (open-output-file (groups Scheme) (scan-data "#")) (open-output-string (groups Scheme) (scan-data "#")) (opendir (groups POSIX Scheme) (scan-data "#")) (operator? (groups Scheme) (scan-data "#")) (or (groups Scheme) (scan-data "")) (or-map (groups Scheme) (scan-data "#")) (output-port? (groups Scheme) (scan-data "#")) (pair? (groups Scheme) (scan-data "#")) (parse-path (groups Scheme) (scan-data "#")) (passwd:dir (groups POSIX Scheme) (scan-data "#")) (passwd:gecos (groups POSIX Scheme) (scan-data "#")) (passwd:gid (groups POSIX Scheme) (scan-data "#")) (passwd:name (groups POSIX Scheme) (scan-data "#")) (passwd:passwd (groups POSIX Scheme) (scan-data "#")) (passwd:shell (groups POSIX Scheme) (scan-data "#")) (passwd:uid (groups POSIX Scheme) (scan-data "#")) (pause (groups POSIX Scheme) (scan-data "#")) (peek (groups Scheme) (scan-data "#")) (peek-char (groups Scheme) (scan-data "#")) (pipe (groups POSIX Scheme) (scan-data "#")) (pk (groups Scheme) (scan-data "#")) (port->fdes (groups POSIX Scheme) (scan-data "#fdes (port)>")) (port-closed? (groups Scheme) (scan-data "#")) (port-column (groups Scheme) (scan-data "#")) (port-filename (groups Scheme) (scan-data "#")) (port-for-each (groups POSIX Scheme) (scan-data "#")) (port-line (groups Scheme) (scan-data "#")) (port-mode (groups POSIX Scheme) (scan-data "#")) (port-revealed (groups POSIX Scheme) (scan-data "#")) (port-with-print-state (groups Scheme) (scan-data "#")) (port? (groups Scheme) (scan-data "#")) (positive? (groups Scheme) (scan-data "#")) (primitive-eval (groups Scheme) (scan-data "#")) (primitive-exit (groups POSIX Scheme) (scan-data "#")) (primitive-fork (groups POSIX Scheme) (scan-data "#")) (primitive-load (groups Scheme) (scan-data "#")) (primitive-load-path (groups Scheme) (scan-data "#")) (primitive-macro? (groups Scheme) (scan-data "#")) (primitive-make-property (groups Scheme) (scan-data "#")) (primitive-move->fdes (groups POSIX Scheme) (scan-data "#fdes>")) (primitive-property-del! (groups Scheme) (scan-data "#")) (primitive-property-ref (groups Scheme) (scan-data "#")) (primitive-property-set! (groups Scheme) (scan-data "#")) (print-disable (groups Scheme) (scan-data "#")) (print-enable (groups Scheme) (scan-data "#")) (print-options (groups Scheme) (scan-data "#")) (print-options-interface (groups Scheme) (scan-data "#")) (print-set! (groups Scheme) (scan-data "")) (procedure (groups Scheme) (scan-data "#")) (procedure->macro (groups Scheme) (scan-data "#macro>")) (procedure->memoizing-macro (groups Scheme) (scan-data "#memoizing-macro>")) (procedure->syntax (groups Scheme) (scan-data "#syntax>")) (procedure-documentation (groups Scheme) (scan-data "#")) (procedure-environment (groups Scheme) (scan-data "#")) (procedure-name (groups Scheme) (scan-data "#")) (procedure-properties (groups Scheme) (scan-data "#")) (procedure-property (groups Scheme) (scan-data "#")) (procedure-source (groups Scheme) (scan-data "#")) (procedure-with-setter? (groups Scheme) (scan-data "#")) (procedure? (groups Scheme) (scan-data "#")) (process-define-module (groups Scheme) (scan-data "#")) (process-use-modules (groups Scheme) (scan-data "#")) (program-arguments (groups POSIX Scheme) (scan-data "#")) (promise? (groups Scheme) (scan-data "#")) (protoent:aliases (groups Scheme) (scan-data "#")) (protoent:name (groups Scheme) (scan-data "#")) (protoent:proto (groups Scheme) (scan-data "#")) (provide (groups Scheme) (scan-data "#")) (provided? (groups Scheme) (scan-data "#")) (purify-module! (groups Scheme) (scan-data "#")) (putenv (groups POSIX Scheme) (scan-data "#")) (quasiquote (groups Scheme) (scan-data "")) (quit (groups Scheme) (scan-data "#")) (quote (groups Scheme) (scan-data "")) (quotient (groups Scheme) (scan-data "#")) (raise (groups POSIX Scheme) (scan-data "#")) (random (groups Scheme) (scan-data "#")) (random:exp (groups Scheme) (scan-data "#")) (random:hollow-sphere! (groups Scheme) (scan-data "#")) (random:normal (groups Scheme) (scan-data "#")) (random:normal-vector! (groups Scheme) (scan-data "#")) (random:solid-sphere! (groups Scheme) (scan-data "#")) (random:uniform (groups Scheme) (scan-data "#")) (rational? (groups Scheme) (scan-data "#")) (re-export (groups Scheme) (scan-data "")) (re-export-syntax (groups Scheme) (scan-data "")) (read (groups Scheme) (scan-data "#")) (read-char (groups Scheme) (scan-data "#")) (read-disable (groups Scheme) (scan-data "#")) (read-enable (groups Scheme) (scan-data "#")) (read-eval? (groups Scheme) (scan-data "")) (read-hash-extend (groups Scheme) (scan-data "#")) (read-hash-procedures (groups Scheme) (scan-data "")) (read-options (groups Scheme) (scan-data "#")) (read-options-interface (groups Scheme) (scan-data "#")) (read-set! (groups Scheme) (scan-data "")) (read:array (groups Scheme) (scan-data "#")) (read:uniform-vector (groups Scheme) (scan-data "#")) (readdir (groups POSIX Scheme) (scan-data "#")) (readlink (groups POSIX Scheme) (scan-data "#")) (real-part (groups Scheme) (scan-data "#")) (real? (groups Scheme) (scan-data "#")) (record-accessor (groups Scheme) (scan-data "#")) (record-constructor (groups Scheme) (scan-data "#")) (record-modifier (groups Scheme) (scan-data "#")) (record-predicate (groups Scheme) (scan-data "#")) (record-type-descriptor (groups Scheme) (scan-data "#")) (record-type-fields (groups Scheme) (scan-data "#")) (record-type-name (groups Scheme) (scan-data "#")) (record-type-vtable (groups Scheme) (scan-data "")) (record-type? (groups Scheme) (scan-data "#")) (record? (groups Scheme) (scan-data "#")) (recv! (groups Scheme) (scan-data "#")) (recvfrom! (groups Scheme) (scan-data "#")) (redirect-port (groups POSIX Scheme) (scan-data "#")) (regexp-exec (groups Scheme) (scan-data "#")) (regexp/basic (groups Scheme) (scan-data "")) (regexp/extended (groups Scheme) (scan-data "")) (regexp/icase (groups Scheme) (scan-data "")) (regexp/newline (groups Scheme) (scan-data "")) (regexp/notbol (groups Scheme) (scan-data "")) (regexp/noteol (groups Scheme) (scan-data "")) (regexp? (groups Scheme) (scan-data "#")) (release-arbiter (groups Scheme) (scan-data "#")) (release-port-handle (groups POSIX Scheme) (scan-data "#")) (remainder (groups Scheme) (scan-data "#")) (remove-hook! (groups Scheme) (scan-data "#")) (rename-file (groups POSIX Scheme) (scan-data "#")) (repl (groups Scheme) (scan-data "#")) (repl-reader (groups Scheme) (scan-data "#")) (reset-hook! (groups Scheme) (scan-data "#")) (resolve-interface (groups Scheme) (scan-data "#")) (resolve-module (groups Scheme) (scan-data "#")) (restore-signals (groups POSIX Scheme) (scan-data "#")) (restricted-vector-sort! (groups Scheme) (scan-data "#")) (reverse (groups Scheme) (scan-data "#")) (reverse! (groups Scheme) (scan-data "#")) (rewinddir (groups POSIX Scheme) (scan-data "#")) (rmdir (groups POSIX Scheme) (scan-data "#")) (round (groups Scheme) (scan-data "#")) (run-asyncs (groups Scheme) (scan-data "#")) (run-hook (groups Scheme) (scan-data "#")) (save-module-excursion (groups Scheme) (scan-data "#")) (save-stack (groups Scheme) (scan-data "#")) (scheme-file-suffix (groups Scheme) (scan-data "#")) (scm-error (groups Scheme) (scan-data "#")) (scm-repl-print-unspecified (groups Scheme) (scan-data "")) (scm-repl-prompt (groups Scheme) (scan-data "")) (scm-repl-silent (groups Scheme) (scan-data "")) (scm-repl-verbose (groups Scheme) (scan-data "")) (scm-style-repl (groups Scheme) (scan-data "#")) (scm_I_am_dead (groups scm C) (scan-data B)) (scm_abs (groups scm C) (scan-data T)) (scm_accept (groups scm C) (scan-data T)) (scm_access (groups scm C) (scan-data T)) (scm_accessor_method_slot_definition (groups scm C) (scan-data T)) (scm_acons (groups scm C) (scan-data T)) (scm_acosh (groups scm C) (scan-data T)) (scm_add_feature (groups scm C) (scan-data T)) (scm_add_hook_x (groups scm C) (scan-data T)) (scm_add_method (groups scm C) (scan-data T)) (scm_add_slot (groups scm C) (scan-data T)) (scm_add_to_port_table (groups scm C) (scan-data T)) (scm_addbig (groups scm C) (scan-data T)) (scm_after_gc_c_hook (groups scm C) (scan-data B)) (scm_after_gc_hook (groups scm C) (scan-data B)) (scm_after_sweep_c_hook (groups scm C) (scan-data B)) (scm_aind (groups scm C) (scan-data T)) (scm_alarm (groups scm C) (scan-data T)) (scm_alloc_struct (groups scm C) (scan-data T)) (scm_allocate_string (groups scm C) (scan-data T)) (scm_angle (groups scm C) (scan-data T)) (scm_append (groups scm C) (scan-data T)) (scm_append_x (groups scm C) (scan-data T)) (scm_apply (groups scm C) (scan-data T)) (scm_apply_0 (groups scm C) (scan-data T)) (scm_apply_1 (groups scm C) (scan-data T)) (scm_apply_2 (groups scm C) (scan-data T)) (scm_apply_3 (groups scm C) (scan-data T)) (scm_apply_generic (groups scm C) (scan-data T)) (scm_apply_with_dynamic_root (groups scm C) (scan-data T)) (scm_arg_type_key (groups scm C) (scan-data B)) (scm_args_number_key (groups scm C) (scan-data B)) (scm_array_contents (groups scm C) (scan-data T)) (scm_array_copy_x (groups scm C) (scan-data T)) (scm_array_dimensions (groups scm C) (scan-data T)) (scm_array_equal_p (groups scm C) (scan-data T)) (scm_array_fill_int (groups scm C) (scan-data T)) (scm_array_fill_x (groups scm C) (scan-data T)) (scm_array_for_each (groups scm C) (scan-data T)) (scm_array_identity (groups scm C) (scan-data T)) (scm_array_in_bounds_p (groups scm C) (scan-data T)) (scm_array_index_map_x (groups scm C) (scan-data T)) (scm_array_map_x (groups scm C) (scan-data T)) (scm_array_p (groups scm C) (scan-data T)) (scm_array_prototype (groups scm C) (scan-data T)) (scm_array_rank (groups scm C) (scan-data T)) (scm_array_set_x (groups scm C) (scan-data T)) (scm_array_to_list (groups scm C) (scan-data T)) (scm_ash (groups scm C) (scan-data T)) (scm_asinh (groups scm C) (scan-data T)) (scm_assoc (groups scm C) (scan-data T)) (scm_assoc_ref (groups scm C) (scan-data T)) (scm_assoc_remove_x (groups scm C) (scan-data T)) (scm_assoc_set_x (groups scm C) (scan-data T)) (scm_assq (groups scm C) (scan-data T)) (scm_assq_ref (groups scm C) (scan-data T)) (scm_assq_remove_x (groups scm C) (scan-data T)) (scm_assq_set_x (groups scm C) (scan-data T)) (scm_assv (groups scm C) (scan-data T)) (scm_assv_ref (groups scm C) (scan-data T)) (scm_assv_remove_x (groups scm C) (scan-data T)) (scm_assv_set_x (groups scm C) (scan-data T)) (scm_async (groups scm C) (scan-data T)) (scm_async_click (groups scm C) (scan-data T)) (scm_async_mark (groups scm C) (scan-data T)) (scm_asyncs_pending_p (groups scm C) (scan-data D)) (scm_atanh (groups scm C) (scan-data T)) (scm_backtrace (groups scm C) (scan-data T)) (scm_badargsp (groups scm C) (scan-data T)) (scm_basename (groups scm C) (scan-data T)) (scm_basic_basic_make_class (groups scm C) (scan-data T)) (scm_basic_make_class (groups scm C) (scan-data T)) (scm_before_gc_c_hook (groups scm C) (scan-data B)) (scm_before_mark_c_hook (groups scm C) (scan-data B)) (scm_before_sweep_c_hook (groups scm C) (scan-data B)) (scm_big_and (groups scm C) (scan-data T)) (scm_big_ior (groups scm C) (scan-data T)) (scm_big_test (groups scm C) (scan-data T)) (scm_big_xor (groups scm C) (scan-data T)) (scm_bigcomp (groups scm C) (scan-data T)) (scm_bigequal (groups scm C) (scan-data T)) (scm_bigprint (groups scm C) (scan-data T)) (scm_bind (groups scm C) (scan-data T)) (scm_bit_count (groups scm C) (scan-data T)) (scm_bit_count_star (groups scm C) (scan-data T)) (scm_bit_extract (groups scm C) (scan-data T)) (scm_bit_invert_x (groups scm C) (scan-data T)) (scm_bit_position (groups scm C) (scan-data T)) (scm_bit_set_star_x (groups scm C) (scan-data T)) (scm_block_gc (groups scm C) (scan-data D)) (scm_body_thunk (groups scm C) (scan-data T)) (scm_boolean_p (groups scm C) (scan-data T)) (scm_boot_guile (groups scm C) (scan-data T)) (scm_boot_guile_1_live (groups scm C) (scan-data D)) (scm_c_call_with_current_module (groups scm C) (scan-data T)) (scm_c_chars2byvect (groups scm C) (scan-data T)) (scm_c_chars2scm (groups scm C) (scan-data T)) (scm_c_default_rstate (groups scm C) (scan-data T)) (scm_c_define (groups scm C) (scan-data T)) (scm_c_define_gsubr (groups scm C) (scan-data T)) (scm_c_define_gsubr_with_generic (groups scm C) (scan-data T)) (scm_c_define_module (groups scm C) (scan-data T)) (scm_c_define_subr (groups scm C) (scan-data T)) (scm_c_define_subr_with_generic (groups scm C) (scan-data T)) (scm_c_doubles2dvect (groups scm C) (scan-data T)) (scm_c_doubles2scm (groups scm C) (scan-data T)) (scm_c_environment_cell (groups scm C) (scan-data T)) (scm_c_environment_fold (groups scm C) (scan-data T)) (scm_c_environment_observe (groups scm C) (scan-data T)) (scm_c_environment_ref (groups scm C) (scan-data T)) (scm_c_eval_string (groups scm C) (scan-data T)) (scm_c_exp1 (groups scm C) (scan-data T)) (scm_c_export (groups scm C) (scan-data T)) (scm_c_floats2fvect (groups scm C) (scan-data T)) (scm_c_floats2scm (groups scm C) (scan-data T)) (scm_c_get_internal_run_time (groups scm C) (scan-data T)) (scm_c_hook_add (groups scm C) (scan-data T)) (scm_c_hook_init (groups scm C) (scan-data T)) (scm_c_hook_remove (groups scm C) (scan-data T)) (scm_c_hook_run (groups scm C) (scan-data T)) (scm_c_ints2ivect (groups scm C) (scan-data T)) (scm_c_ints2scm (groups scm C) (scan-data T)) (scm_c_issue_deprecation_warning (groups scm C) (scan-data T)) (scm_c_issue_deprecation_warning_fmt (groups scm C) (scan-data T)) (scm_c_load_extension (groups scm C) (scan-data T)) (scm_c_longs2ivect (groups scm C) (scan-data T)) (scm_c_longs2scm (groups scm C) (scan-data T)) (scm_c_lookup (groups scm C) (scan-data T)) (scm_c_make_gsubr (groups scm C) (scan-data T)) (scm_c_make_gsubr_with_generic (groups scm C) (scan-data T)) (scm_c_make_hash_table (groups scm C) (scan-data T)) (scm_c_make_keyword (groups scm C) (scan-data T)) (scm_c_make_rstate (groups scm C) (scan-data T)) (scm_c_make_subr (groups scm C) (scan-data T)) (scm_c_make_subr_with_generic (groups scm C) (scan-data T)) (scm_c_make_vector (groups scm C) (scan-data T)) (scm_c_memq (groups scm C) (scan-data T)) (scm_c_module_define (groups scm C) (scan-data T)) (scm_c_module_lookup (groups scm C) (scan-data T)) (scm_c_normal01 (groups scm C) (scan-data T)) (scm_c_primitive_load (groups scm C) (scan-data T)) (scm_c_primitive_load_path (groups scm C) (scan-data T)) (scm_c_random (groups scm C) (scan-data T)) (scm_c_random_bignum (groups scm C) (scan-data T)) (scm_c_read (groups scm C) (scan-data T)) (scm_c_read_string (groups scm C) (scan-data T)) (scm_c_register_extension (groups scm C) (scan-data T)) (scm_c_resolve_module (groups scm C) (scan-data T)) (scm_c_run_hook (groups scm C) (scan-data T)) (scm_c_scm2chars (groups scm C) (scan-data T)) (scm_c_scm2doubles (groups scm C) (scan-data T)) (scm_c_scm2floats (groups scm C) (scan-data T)) (scm_c_scm2ints (groups scm C) (scan-data T)) (scm_c_scm2longs (groups scm C) (scan-data T)) (scm_c_scm2shorts (groups scm C) (scan-data T)) (scm_c_shorts2scm (groups scm C) (scan-data T)) (scm_c_shorts2svect (groups scm C) (scan-data T)) (scm_c_source_property_breakpoint_p (groups scm C) (scan-data T)) (scm_c_string2str (groups scm C) (scan-data T)) (scm_c_substring2str (groups scm C) (scan-data T)) (scm_c_symbol2str (groups scm C) (scan-data T)) (scm_c_uints2uvect (groups scm C) (scan-data T)) (scm_c_ulongs2uvect (groups scm C) (scan-data T)) (scm_c_uniform01 (groups scm C) (scan-data T)) (scm_c_use_module (groups scm C) (scan-data T)) (scm_c_with_fluid (groups scm C) (scan-data T)) (scm_c_with_fluids (groups scm C) (scan-data T)) (scm_c_write (groups scm C) (scan-data T)) (scm_call_0 (groups scm C) (scan-data T)) (scm_call_1 (groups scm C) (scan-data T)) (scm_call_2 (groups scm C) (scan-data T)) (scm_call_3 (groups scm C) (scan-data T)) (scm_call_4 (groups scm C) (scan-data T)) (scm_call_generic_0 (groups scm C) (scan-data T)) (scm_call_generic_1 (groups scm C) (scan-data T)) (scm_call_generic_2 (groups scm C) (scan-data T)) (scm_call_generic_3 (groups scm C) (scan-data T)) (scm_call_with_dynamic_root (groups scm C) (scan-data T)) (scm_call_with_input_string (groups scm C) (scan-data T)) (scm_call_with_new_thread (groups scm C) (scan-data T)) (scm_call_with_output_string (groups scm C) (scan-data T)) (scm_casei_streq (groups scm C) (scan-data T)) (scm_catch (groups scm C) (scan-data T)) (scm_cellp (groups scm C) (scan-data T)) (scm_cells_allocated (groups scm C) (scan-data D)) (scm_ceval (groups scm C) (scan-data T)) (scm_ceval_ptr (groups scm C) (scan-data B)) (scm_change_object_class (groups scm C) (scan-data T)) (scm_char_alphabetic_p (groups scm C) (scan-data T)) (scm_char_ci_eq_p (groups scm C) (scan-data T)) (scm_char_ci_geq_p (groups scm C) (scan-data T)) (scm_char_ci_gr_p (groups scm C) (scan-data T)) (scm_char_ci_leq_p (groups scm C) (scan-data T)) (scm_char_ci_less_p (groups scm C) (scan-data T)) (scm_char_downcase (groups scm C) (scan-data T)) (scm_char_eq_p (groups scm C) (scan-data T)) (scm_char_geq_p (groups scm C) (scan-data T)) (scm_char_gr_p (groups scm C) (scan-data T)) (scm_char_is_both_p (groups scm C) (scan-data T)) (scm_char_leq_p (groups scm C) (scan-data T)) (scm_char_less_p (groups scm C) (scan-data T)) (scm_char_lower_case_p (groups scm C) (scan-data T)) (scm_char_numeric_p (groups scm C) (scan-data T)) (scm_char_p (groups scm C) (scan-data T)) (scm_char_ready_p (groups scm C) (scan-data T)) (scm_char_to_integer (groups scm C) (scan-data T)) (scm_char_upcase (groups scm C) (scan-data T)) (scm_char_upper_case_p (groups scm C) (scan-data T)) (scm_char_whitespace_p (groups scm C) (scan-data T)) (scm_charnames (groups scm C) (scan-data D)) (scm_charnums (groups scm C) (scan-data R)) (scm_chdir (groups scm C) (scan-data T)) (scm_check_apply_p (groups scm C) (scan-data B)) (scm_check_entry_p (groups scm C) (scan-data B)) (scm_check_exit_p (groups scm C) (scan-data B)) (scm_chmod (groups scm C) (scan-data T)) (scm_chown (groups scm C) (scan-data T)) (scm_chroot (groups scm C) (scan-data T)) (scm_class_accessor (groups scm C) (scan-data B)) (scm_class_boolean (groups scm C) (scan-data B)) (scm_class_char (groups scm C) (scan-data B)) (scm_class_class (groups scm C) (scan-data B)) (scm_class_complex (groups scm C) (scan-data B)) (scm_class_direct_methods (groups scm C) (scan-data T)) (scm_class_direct_slots (groups scm C) (scan-data T)) (scm_class_direct_subclasses (groups scm C) (scan-data T)) (scm_class_direct_supers (groups scm C) (scan-data T)) (scm_class_double (groups scm C) (scan-data B)) (scm_class_entity (groups scm C) (scan-data B)) (scm_class_entity_class (groups scm C) (scan-data B)) (scm_class_entity_with_setter (groups scm C) (scan-data B)) (scm_class_environment (groups scm C) (scan-data T)) (scm_class_float (groups scm C) (scan-data B)) (scm_class_foreign_class (groups scm C) (scan-data B)) (scm_class_foreign_object (groups scm C) (scan-data B)) (scm_class_foreign_slot (groups scm C) (scan-data B)) (scm_class_generic (groups scm C) (scan-data B)) (scm_class_generic_with_setter (groups scm C) (scan-data B)) (scm_class_input_output_port (groups scm C) (scan-data B)) (scm_class_input_port (groups scm C) (scan-data B)) (scm_class_int (groups scm C) (scan-data B)) (scm_class_integer (groups scm C) (scan-data B)) (scm_class_keyword (groups scm C) (scan-data B)) (scm_class_list (groups scm C) (scan-data B)) (scm_class_method (groups scm C) (scan-data B)) (scm_class_name (groups scm C) (scan-data T)) (scm_class_null (groups scm C) (scan-data B)) (scm_class_number (groups scm C) (scan-data B)) (scm_class_object (groups scm C) (scan-data B)) (scm_class_of (groups scm C) (scan-data T)) (scm_class_opaque (groups scm C) (scan-data B)) (scm_class_operator_class (groups scm C) (scan-data B)) (scm_class_operator_with_setter_class (groups scm C) (scan-data B)) (scm_class_output_port (groups scm C) (scan-data B)) (scm_class_pair (groups scm C) (scan-data B)) (scm_class_port (groups scm C) (scan-data B)) (scm_class_precedence_list (groups scm C) (scan-data T)) (scm_class_primitive_generic (groups scm C) (scan-data B)) (scm_class_procedure (groups scm C) (scan-data B)) (scm_class_procedure_class (groups scm C) (scan-data B)) (scm_class_procedure_with_setter (groups scm C) (scan-data B)) (scm_class_protected (groups scm C) (scan-data B)) (scm_class_protected_opaque (groups scm C) (scan-data B)) (scm_class_protected_read_only (groups scm C) (scan-data B)) (scm_class_read_only (groups scm C) (scan-data B)) (scm_class_real (groups scm C) (scan-data B)) (scm_class_scm (groups scm C) (scan-data B)) (scm_class_self (groups scm C) (scan-data B)) (scm_class_simple_method (groups scm C) (scan-data B)) (scm_class_slots (groups scm C) (scan-data T)) (scm_class_string (groups scm C) (scan-data B)) (scm_class_symbol (groups scm C) (scan-data B)) (scm_class_top (groups scm C) (scan-data B)) (scm_class_unknown (groups scm C) (scan-data B)) (scm_class_vector (groups scm C) (scan-data B)) (scm_close (groups scm C) (scan-data T)) (scm_close_fdes (groups scm C) (scan-data T)) (scm_close_input_port (groups scm C) (scan-data T)) (scm_close_output_port (groups scm C) (scan-data T)) (scm_close_port (groups scm C) (scan-data T)) (scm_closedir (groups scm C) (scan-data T)) (scm_closure (groups scm C) (scan-data T)) (scm_closure_p (groups scm C) (scan-data T)) (scm_compile_shell_switches (groups scm C) (scan-data T)) (scm_complex_equalp (groups scm C) (scan-data T)) (scm_components (groups scm C) (scan-data B)) (scm_compute_applicable_methods (groups scm C) (scan-data T)) (scm_connect (groups scm C) (scan-data T)) (scm_cons (groups scm C) (scan-data T)) (scm_cons2 (groups scm C) (scan-data T)) (scm_cons_source (groups scm C) (scan-data T)) (scm_cons_star (groups scm C) (scan-data T)) (scm_copy_big_dec (groups scm C) (scan-data T)) (scm_copy_file (groups scm C) (scan-data T)) (scm_copy_fluids (groups scm C) (scan-data T)) (scm_copy_random_state (groups scm C) (scan-data T)) (scm_copy_smaller (groups scm C) (scan-data T)) (scm_copy_tree (groups scm C) (scan-data T)) (scm_count_argv (groups scm C) (scan-data T)) (scm_critical_section_mutex (groups scm C) (scan-data B)) (scm_crypt (groups scm C) (scan-data T)) (scm_ctermid (groups scm C) (scan-data T)) (scm_current_error_port (groups scm C) (scan-data T)) (scm_current_input_port (groups scm C) (scan-data T)) (scm_current_load_port (groups scm C) (scan-data T)) (scm_current_module (groups scm C) (scan-data T)) (scm_current_module_lookup_closure (groups scm C) (scan-data T)) (scm_current_module_transformer (groups scm C) (scan-data T)) (scm_current_output_port (groups scm C) (scan-data T)) (scm_current_time (groups scm C) (scan-data T)) (scm_cuserid (groups scm C) (scan-data T)) (scm_cvref (groups scm C) (scan-data T)) (scm_dapply (groups scm C) (scan-data T)) (scm_dblprec (groups scm C) (scan-data B)) (scm_debug_eframe_size (groups scm C) (scan-data B)) (scm_debug_mode (groups scm C) (scan-data B)) (scm_debug_object_p (groups scm C) (scan-data T)) (scm_debug_options (groups scm C) (scan-data T)) (scm_debug_opts (groups scm C) (scan-data D)) (scm_default_init_heap_size_1 (groups scm C) (scan-data D)) (scm_default_init_heap_size_2 (groups scm C) (scan-data D)) (scm_default_max_segment_size (groups scm C) (scan-data D)) (scm_default_min_yield_1 (groups scm C) (scan-data D)) (scm_default_min_yield_2 (groups scm C) (scan-data D)) (scm_define (groups scm C) (scan-data T)) (scm_definedp (groups scm C) (scan-data T)) (scm_delete (groups scm C) (scan-data T)) (scm_delete1_x (groups scm C) (scan-data T)) (scm_delete_file (groups scm C) (scan-data T)) (scm_delete_x (groups scm C) (scan-data T)) (scm_delq (groups scm C) (scan-data T)) (scm_delq1_x (groups scm C) (scan-data T)) (scm_delq_x (groups scm C) (scan-data T)) (scm_delv (groups scm C) (scan-data T)) (scm_delv1_x (groups scm C) (scan-data T)) (scm_delv_x (groups scm C) (scan-data T)) (scm_deprecated_newcell (groups scm C) (scan-data T)) (scm_deprecated_newcell2 (groups scm C) (scan-data T)) (scm_destroy_guardian_x (groups scm C) (scan-data T)) (scm_deval (groups scm C) (scan-data T)) (scm_difference (groups scm C) (scan-data T)) (scm_dimensions_to_uniform_array (groups scm C) (scan-data T)) (scm_directory_stream_p (groups scm C) (scan-data T)) (scm_dirname (groups scm C) (scan-data T)) (scm_display (groups scm C) (scan-data T)) (scm_display_application (groups scm C) (scan-data T)) (scm_display_backtrace (groups scm C) (scan-data T)) (scm_display_error (groups scm C) (scan-data T)) (scm_display_error_message (groups scm C) (scan-data T)) (scm_divbigdig (groups scm C) (scan-data T)) (scm_divide (groups scm C) (scan-data T)) (scm_done_free (groups scm C) (scan-data T)) (scm_done_malloc (groups scm C) (scan-data T)) (scm_dot_string (groups scm C) (scan-data B)) (scm_double2num (groups scm C) (scan-data T)) (scm_doubly_weak_hash_table_p (groups scm C) (scan-data T)) (scm_dowinds (groups scm C) (scan-data T)) (scm_downcase (groups scm C) (scan-data T)) (scm_drain_input (groups scm C) (scan-data T)) (scm_dup2 (groups scm C) (scan-data T)) (scm_dup_to_fdes (groups scm C) (scan-data T)) (scm_dynamic_args_call (groups scm C) (scan-data T)) (scm_dynamic_call (groups scm C) (scan-data T)) (scm_dynamic_func (groups scm C) (scan-data T)) (scm_dynamic_link (groups scm C) (scan-data T)) (scm_dynamic_object_p (groups scm C) (scan-data T)) (scm_dynamic_root (groups scm C) (scan-data T)) (scm_dynamic_unlink (groups scm C) (scan-data T)) (scm_dynamic_wind (groups scm C) (scan-data T)) (scm_enable_primitive_generic_x (groups scm C) (scan-data T)) (scm_enclose_array (groups scm C) (scan-data T)) (scm_end_input (groups scm C) (scan-data T)) (scm_ensure_accessor (groups scm C) (scan-data T)) (scm_entity_p (groups scm C) (scan-data T)) (scm_env_module (groups scm C) (scan-data T)) (scm_env_top_level (groups scm C) (scan-data T)) (scm_environ (groups scm C) (scan-data T)) (scm_environment_bound_p (groups scm C) (scan-data T)) (scm_environment_cell (groups scm C) (scan-data T)) (scm_environment_define (groups scm C) (scan-data T)) (scm_environment_fold (groups scm C) (scan-data T)) (scm_environment_observe (groups scm C) (scan-data T)) (scm_environment_observe_weak (groups scm C) (scan-data T)) (scm_environment_p (groups scm C) (scan-data T)) (scm_environment_ref (groups scm C) (scan-data T)) (scm_environment_set_x (groups scm C) (scan-data T)) (scm_environment_undefine (groups scm C) (scan-data T)) (scm_environment_unobserve (groups scm C) (scan-data T)) (scm_environments_prehistory (groups scm C) (scan-data T)) (scm_eof_object_p (groups scm C) (scan-data T)) (scm_eq_p (groups scm C) (scan-data T)) (scm_equal_p (groups scm C) (scan-data T)) (scm_eqv_p (groups scm C) (scan-data T)) (scm_error (groups scm C) (scan-data T)) (scm_error_environment_immutable_binding (groups scm C) (scan-data T)) (scm_error_environment_immutable_location (groups scm C) (scan-data T)) (scm_error_environment_unbound (groups scm C) (scan-data T)) (scm_error_num_args_subr (groups scm C) (scan-data T)) (scm_error_revive_threads (groups scm C) (scan-data T)) (scm_error_scm (groups scm C) (scan-data T)) (scm_eval (groups scm C) (scan-data T)) (scm_eval_args (groups scm C) (scan-data T)) (scm_eval_body (groups scm C) (scan-data T)) (scm_eval_car (groups scm C) (scan-data T)) (scm_eval_closure_lookup (groups scm C) (scan-data T)) (scm_eval_environment_imported (groups scm C) (scan-data T)) (scm_eval_environment_local (groups scm C) (scan-data T)) (scm_eval_environment_p (groups scm C) (scan-data T)) (scm_eval_environment_set_imported_x (groups scm C) (scan-data T)) (scm_eval_environment_set_local_x (groups scm C) (scan-data T)) (scm_eval_options_interface (groups scm C) (scan-data T)) (scm_eval_opts (groups scm C) (scan-data D)) (scm_eval_stack (groups scm C) (scan-data B)) (scm_eval_string (groups scm C) (scan-data T)) (scm_eval_x (groups scm C) (scan-data T)) (scm_evaluator_trap_table (groups scm C) (scan-data D)) (scm_evaluator_traps (groups scm C) (scan-data T)) (scm_even_p (groups scm C) (scan-data T)) (scm_evict_ports (groups scm C) (scan-data T)) (scm_exact_p (groups scm C) (scan-data T)) (scm_exact_to_inexact (groups scm C) (scan-data T)) (scm_execl (groups scm C) (scan-data T)) (scm_execle (groups scm C) (scan-data T)) (scm_execlp (groups scm C) (scan-data T)) (scm_exit_status (groups scm C) (scan-data T)) (scm_expmem (groups scm C) (scan-data D)) (scm_export_environment_p (groups scm C) (scan-data T)) (scm_export_environment_private (groups scm C) (scan-data T)) (scm_export_environment_set_private_x (groups scm C) (scan-data T)) (scm_export_environment_set_signature_x (groups scm C) (scan-data T)) (scm_export_environment_signature (groups scm C) (scan-data T)) (scm_f_apply (groups scm C) (scan-data B)) (scm_f_gsubr_apply (groups scm C) (scan-data B)) (scm_fcntl (groups scm C) (scan-data T)) (scm_fdes_to_port (groups scm C) (scan-data T)) (scm_fdes_to_ports (groups scm C) (scan-data T)) (scm_fdopen (groups scm C) (scan-data T)) (scm_file_port_p (groups scm C) (scan-data T)) (scm_fileno (groups scm C) (scan-data T)) (scm_fill_input (groups scm C) (scan-data T)) (scm_find_executable (groups scm C) (scan-data T)) (scm_find_method (groups scm C) (scan-data T)) (scm_finish_srcprop (groups scm C) (scan-data T)) (scm_float2num (groups scm C) (scan-data T)) (scm_flock (groups scm C) (scan-data T)) (scm_fluid_p (groups scm C) (scan-data T)) (scm_fluid_ref (groups scm C) (scan-data T)) (scm_fluid_set_x (groups scm C) (scan-data T)) (scm_flush (groups scm C) (scan-data T)) (scm_flush_all_ports (groups scm C) (scan-data T)) (scm_flush_ws (groups scm C) (scan-data T)) (scm_for_each (groups scm C) (scan-data T)) (scm_force (groups scm C) (scan-data T)) (scm_force_output (groups scm C) (scan-data T)) (scm_fork (groups scm C) (scan-data T)) (scm_frame_arguments (groups scm C) (scan-data T)) (scm_frame_evaluating_args_p (groups scm C) (scan-data T)) (scm_frame_next (groups scm C) (scan-data T)) (scm_frame_number (groups scm C) (scan-data T)) (scm_frame_overflow_p (groups scm C) (scan-data T)) (scm_frame_p (groups scm C) (scan-data T)) (scm_frame_previous (groups scm C) (scan-data T)) (scm_frame_procedure (groups scm C) (scan-data T)) (scm_frame_procedure_p (groups scm C) (scan-data T)) (scm_frame_real_p (groups scm C) (scan-data T)) (scm_frame_source (groups scm C) (scan-data T)) (scm_free0 (groups scm C) (scan-data T)) (scm_free_print_state (groups scm C) (scan-data T)) (scm_free_subr_entry (groups scm C) (scan-data T)) (scm_freelist (groups scm C) (scan-data D)) (scm_freelist2 (groups scm C) (scan-data D)) (scm_fsync (groups scm C) (scan-data T)) (scm_ftell (groups scm C) (scan-data T)) (scm_gc (groups scm C) (scan-data T)) (scm_gc_cells_collected (groups scm C) (scan-data B)) (scm_gc_cells_marked_acc (groups scm C) (scan-data D)) (scm_gc_cells_swept (groups scm C) (scan-data D)) (scm_gc_cells_swept_acc (groups scm C) (scan-data D)) (scm_gc_for_newcell (groups scm C) (scan-data T)) (scm_gc_free (groups scm C) (scan-data T)) (scm_gc_heap_lock (groups scm C) (scan-data D)) (scm_gc_malloc (groups scm C) (scan-data T)) (scm_gc_malloc_collected (groups scm C) (scan-data B)) (scm_gc_mark (groups scm C) (scan-data T)) (scm_gc_mark_dependencies (groups scm C) (scan-data T)) (scm_gc_mark_time_taken (groups scm C) (scan-data D)) (scm_gc_ports_collected (groups scm C) (scan-data B)) (scm_gc_protect_object (groups scm C) (scan-data T)) (scm_gc_realloc (groups scm C) (scan-data T)) (scm_gc_register_collectable_memory (groups scm C) (scan-data T)) (scm_gc_register_root (groups scm C) (scan-data T)) (scm_gc_register_roots (groups scm C) (scan-data T)) (scm_gc_running_p (groups scm C) (scan-data D)) (scm_gc_stats (groups scm C) (scan-data T)) (scm_gc_strdup (groups scm C) (scan-data T)) (scm_gc_strndup (groups scm C) (scan-data T)) (scm_gc_sweep (groups scm C) (scan-data T)) (scm_gc_sweep_time_taken (groups scm C) (scan-data D)) (scm_gc_time_taken (groups scm C) (scan-data D)) (scm_gc_times (groups scm C) (scan-data D)) (scm_gc_unprotect_object (groups scm C) (scan-data T)) (scm_gc_unregister_collectable_memory (groups scm C) (scan-data T)) (scm_gc_unregister_root (groups scm C) (scan-data T)) (scm_gc_unregister_roots (groups scm C) (scan-data T)) (scm_gc_yield (groups scm C) (scan-data B)) (scm_gcd (groups scm C) (scan-data T)) (scm_generic_capability_p (groups scm C) (scan-data T)) (scm_generic_function_methods (groups scm C) (scan-data T)) (scm_generic_function_name (groups scm C) (scan-data T)) (scm_gensym (groups scm C) (scan-data T)) (scm_geq_p (groups scm C) (scan-data T)) (scm_get_internal_real_time (groups scm C) (scan-data T)) (scm_get_internal_run_time (groups scm C) (scan-data T)) (scm_get_keyword (groups scm C) (scan-data T)) (scm_get_meta_args (groups scm C) (scan-data T)) (scm_get_one_zombie (groups scm C) (scan-data T)) (scm_get_output_string (groups scm C) (scan-data T)) (scm_get_pre_modules_obarray (groups scm C) (scan-data T)) (scm_get_print_state (groups scm C) (scan-data T)) (scm_get_stack_base (groups scm C) (scan-data T)) (scm_getc (groups scm C) (scan-data T)) (scm_getcwd (groups scm C) (scan-data T)) (scm_getegid (groups scm C) (scan-data T)) (scm_getenv (groups scm C) (scan-data T)) (scm_geteuid (groups scm C) (scan-data T)) (scm_getgid (groups scm C) (scan-data T)) (scm_getgrgid (groups scm C) (scan-data T)) (scm_getgroups (groups scm C) (scan-data T)) (scm_gethost (groups scm C) (scan-data T)) (scm_gethostname (groups scm C) (scan-data T)) (scm_getitimer (groups scm C) (scan-data T)) (scm_getlogin (groups scm C) (scan-data T)) (scm_getnet (groups scm C) (scan-data T)) (scm_getpass (groups scm C) (scan-data T)) (scm_getpeername (groups scm C) (scan-data T)) (scm_getpgrp (groups scm C) (scan-data T)) (scm_getpid (groups scm C) (scan-data T)) (scm_getppid (groups scm C) (scan-data T)) (scm_getpriority (groups scm C) (scan-data T)) (scm_getproto (groups scm C) (scan-data T)) (scm_getpwuid (groups scm C) (scan-data T)) (scm_getserv (groups scm C) (scan-data T)) (scm_getsockname (groups scm C) (scan-data T)) (scm_getsockopt (groups scm C) (scan-data T)) (scm_gettimeofday (groups scm C) (scan-data T)) (scm_getuid (groups scm C) (scan-data T)) (scm_gmtime (groups scm C) (scan-data T)) (scm_gr_p (groups scm C) (scan-data T)) (scm_grow_tok_buf (groups scm C) (scan-data T)) (scm_gsubr_apply (groups scm C) (scan-data T)) (scm_guard (groups scm C) (scan-data T)) (scm_guardian_destroyed_p (groups scm C) (scan-data T)) (scm_guardian_greedy_p (groups scm C) (scan-data T)) (scm_handle_by_message (groups scm C) (scan-data T)) (scm_handle_by_message_noexit (groups scm C) (scan-data T)) (scm_handle_by_proc (groups scm C) (scan-data T)) (scm_handle_by_proc_catching_all (groups scm C) (scan-data T)) (scm_handle_by_throw (groups scm C) (scan-data T)) (scm_hash (groups scm C) (scan-data T)) (scm_hash_create_handle_x (groups scm C) (scan-data T)) (scm_hash_fn_create_handle_x (groups scm C) (scan-data T)) (scm_hash_fn_get_handle (groups scm C) (scan-data T)) (scm_hash_fn_ref (groups scm C) (scan-data T)) (scm_hash_fn_remove_x (groups scm C) (scan-data T)) (scm_hash_fn_set_x (groups scm C) (scan-data T)) (scm_hash_fold (groups scm C) (scan-data T)) (scm_hash_get_handle (groups scm C) (scan-data T)) (scm_hash_ref (groups scm C) (scan-data T)) (scm_hash_remove_x (groups scm C) (scan-data T)) (scm_hash_set_x (groups scm C) (scan-data T)) (scm_hasher (groups scm C) (scan-data T)) (scm_hashq (groups scm C) (scan-data T)) (scm_hashq_create_handle_x (groups scm C) (scan-data T)) (scm_hashq_get_handle (groups scm C) (scan-data T)) (scm_hashq_ref (groups scm C) (scan-data T)) (scm_hashq_remove_x (groups scm C) (scan-data T)) (scm_hashq_set_x (groups scm C) (scan-data T)) (scm_hashv (groups scm C) (scan-data T)) (scm_hashv_create_handle_x (groups scm C) (scan-data T)) (scm_hashv_get_handle (groups scm C) (scan-data T)) (scm_hashv_ref (groups scm C) (scan-data T)) (scm_hashv_remove_x (groups scm C) (scan-data T)) (scm_hashv_set_x (groups scm C) (scan-data T)) (scm_hashx_create_handle_x (groups scm C) (scan-data T)) (scm_hashx_get_handle (groups scm C) (scan-data T)) (scm_hashx_ref (groups scm C) (scan-data T)) (scm_hashx_remove_x (groups scm C) (scan-data T)) (scm_hashx_set_x (groups scm C) (scan-data T)) (scm_heap_org (groups scm C) (scan-data B)) (scm_heap_table (groups scm C) (scan-data D)) (scm_hook_empty_p (groups scm C) (scan-data T)) (scm_hook_p (groups scm C) (scan-data T)) (scm_hook_to_list (groups scm C) (scan-data T)) (scm_htonl (groups scm C) (scan-data T)) (scm_htons (groups scm C) (scan-data T)) (scm_i_adjbig (groups scm libguile-internal C) (scan-data T)) (scm_i_big2dbl (groups scm libguile-internal C) (scan-data T)) (scm_i_big2inum (groups scm libguile-internal C) (scan-data T)) (scm_i_copy_rstate (groups scm libguile-internal C) (scan-data T)) (scm_i_copybig (groups scm libguile-internal C) (scan-data T)) (scm_i_dbl2big (groups scm libguile-internal C) (scan-data T)) (scm_i_display_error (groups scm libguile-internal C) (scan-data T)) (scm_i_dummy (groups scm libguile-internal C) (scan-data B)) (scm_i_eval (groups scm libguile-internal C) (scan-data T)) (scm_i_eval_x (groups scm libguile-internal C) (scan-data T)) (scm_i_get_keyword (groups scm libguile-internal C) (scan-data T)) (scm_i_init_rstate (groups scm libguile-internal C) (scan-data T)) (scm_i_int2big (groups scm libguile-internal C) (scan-data T)) (scm_i_long2big (groups scm libguile-internal C) (scan-data T)) (scm_i_long_long2big (groups scm libguile-internal C) (scan-data T)) (scm_i_make_class_object (groups scm libguile-internal C) (scan-data T)) (scm_i_mem2number (groups scm libguile-internal C) (scan-data T)) (scm_i_mkbig (groups scm libguile-internal C) (scan-data T)) (scm_i_normbig (groups scm libguile-internal C) (scan-data T)) (scm_i_procedure_arity (groups scm libguile-internal C) (scan-data T)) (scm_i_ptrdiff2big (groups scm libguile-internal C) (scan-data T)) (scm_i_short2big (groups scm libguile-internal C) (scan-data T)) (scm_i_size2big (groups scm libguile-internal C) (scan-data T)) (scm_i_terminating (groups scm libguile-internal C) (scan-data B)) (scm_i_uint2big (groups scm libguile-internal C) (scan-data T)) (scm_i_ulong2big (groups scm libguile-internal C) (scan-data T)) (scm_i_ulong_long2big (groups scm libguile-internal C) (scan-data T)) (scm_i_uniform32 (groups scm libguile-internal C) (scan-data T)) (scm_i_ushort2big (groups scm libguile-internal C) (scan-data T)) (scm_i_variable_print (groups scm libguile-internal C) (scan-data T)) (scm_ice_9_already_loaded (groups scm C) (scan-data D)) (scm_igc (groups scm C) (scan-data T)) (scm_ihash (groups scm C) (scan-data T)) (scm_ihashq (groups scm C) (scan-data T)) (scm_ihashv (groups scm C) (scan-data T)) (scm_iint2str (groups scm C) (scan-data T)) (scm_ilength (groups scm C) (scan-data T)) (scm_ilookup (groups scm C) (scan-data T)) (scm_imag_part (groups scm C) (scan-data T)) (scm_import_environment_imports (groups scm C) (scan-data T)) (scm_import_environment_p (groups scm C) (scan-data T)) (scm_import_environment_set_imports_x (groups scm C) (scan-data T)) (scm_include_deprecated_features (groups scm C) (scan-data T)) (scm_inet_aton (groups scm C) (scan-data T)) (scm_inet_makeaddr (groups scm C) (scan-data T)) (scm_inet_netof (groups scm C) (scan-data T)) (scm_inet_ntoa (groups scm C) (scan-data T)) (scm_inet_ntop (groups scm C) (scan-data T)) (scm_inet_pton (groups scm C) (scan-data T)) (scm_inexact_p (groups scm C) (scan-data T)) (scm_inexact_to_exact (groups scm C) (scan-data T)) (scm_inf (groups scm C) (scan-data T)) (scm_inf_p (groups scm C) (scan-data T)) (scm_init_alist (groups scm C) (scan-data T)) (scm_init_arbiters (groups scm C) (scan-data T)) (scm_init_async (groups scm C) (scan-data T)) (scm_init_backtrace (groups scm C) (scan-data T)) (scm_init_boolean (groups scm C) (scan-data T)) (scm_init_chars (groups scm C) (scan-data T)) (scm_init_continuations (groups scm C) (scan-data T)) (scm_init_debug (groups scm C) (scan-data T)) (scm_init_deprecation (groups scm C) (scan-data T)) (scm_init_dynamic_linking (groups scm C) (scan-data T)) (scm_init_dynwind (groups scm C) (scan-data T)) (scm_init_environments (groups scm C) (scan-data T)) (scm_init_eq (groups scm C) (scan-data T)) (scm_init_error (groups scm C) (scan-data T)) (scm_init_eval (groups scm C) (scan-data T)) (scm_init_evalext (groups scm C) (scan-data T)) (scm_init_extensions (groups scm C) (scan-data T)) (scm_init_feature (groups scm C) (scan-data T)) (scm_init_filesys (groups scm C) (scan-data T)) (scm_init_fluids (groups scm C) (scan-data T)) (scm_init_fports (groups scm C) (scan-data T)) (scm_init_gc (groups scm C) (scan-data T)) (scm_init_gdbint (groups scm C) (scan-data T)) (scm_init_goops (groups scm C) (scan-data T)) (scm_init_goops_builtins (groups scm C) (scan-data T)) (scm_init_gsubr (groups scm C) (scan-data T)) (scm_init_guardians (groups scm C) (scan-data T)) (scm_init_guile (groups scm C) (scan-data T)) (scm_init_hash (groups scm C) (scan-data T)) (scm_init_hashtab (groups scm C) (scan-data T)) (scm_init_hooks (groups scm C) (scan-data T)) (scm_init_ioext (groups scm C) (scan-data T)) (scm_init_iselect (groups scm C) (scan-data T)) (scm_init_keywords (groups scm C) (scan-data T)) (scm_init_lang (groups scm C) (scan-data T)) (scm_init_list (groups scm C) (scan-data T)) (scm_init_load (groups scm C) (scan-data T)) (scm_init_load_path (groups scm C) (scan-data T)) (scm_init_macros (groups scm C) (scan-data T)) (scm_init_mallocs (groups scm C) (scan-data T)) (scm_init_modules (groups scm C) (scan-data T)) (scm_init_net_db (groups scm C) (scan-data T)) (scm_init_numbers (groups scm C) (scan-data T)) (scm_init_objects (groups scm C) (scan-data T)) (scm_init_objprop (groups scm C) (scan-data T)) (scm_init_options (groups scm C) (scan-data T)) (scm_init_opts (groups scm C) (scan-data T)) (scm_init_pairs (groups scm C) (scan-data T)) (scm_init_ports (groups scm C) (scan-data T)) (scm_init_posix (groups scm C) (scan-data T)) (scm_init_print (groups scm C) (scan-data T)) (scm_init_procprop (groups scm C) (scan-data T)) (scm_init_procs (groups scm C) (scan-data T)) (scm_init_properties (groups scm C) (scan-data T)) (scm_init_ramap (groups scm C) (scan-data T)) (scm_init_random (groups scm C) (scan-data T)) (scm_init_rdelim (groups scm C) (scan-data T)) (scm_init_rdelim_builtins (groups scm C) (scan-data T)) (scm_init_read (groups scm C) (scan-data T)) (scm_init_regex_posix (groups scm C) (scan-data T)) (scm_init_root (groups scm C) (scan-data T)) (scm_init_rw (groups scm C) (scan-data T)) (scm_init_rw_builtins (groups scm C) (scan-data T)) (scm_init_scmsigs (groups scm C) (scan-data T)) (scm_init_script (groups scm C) (scan-data T)) (scm_init_simpos (groups scm C) (scan-data T)) (scm_init_socket (groups scm C) (scan-data T)) (scm_init_sort (groups scm C) (scan-data T)) (scm_init_srcprop (groups scm C) (scan-data T)) (scm_init_stackchk (groups scm C) (scan-data T)) (scm_init_stacks (groups scm C) (scan-data T)) (scm_init_stime (groups scm C) (scan-data T)) (scm_init_storage (groups scm C) (scan-data T)) (scm_init_strings (groups scm C) (scan-data T)) (scm_init_strop (groups scm C) (scan-data T)) (scm_init_strorder (groups scm C) (scan-data T)) (scm_init_strports (groups scm C) (scan-data T)) (scm_init_struct (groups scm C) (scan-data T)) (scm_init_subr_table (groups scm C) (scan-data T)) (scm_init_symbols (groups scm C) (scan-data T)) (scm_init_threads (groups scm C) (scan-data T)) (scm_init_throw (groups scm C) (scan-data T)) (scm_init_unif (groups scm C) (scan-data T)) (scm_init_values (groups scm C) (scan-data T)) (scm_init_variable (groups scm C) (scan-data T)) (scm_init_vectors (groups scm C) (scan-data T)) (scm_init_version (groups scm C) (scan-data T)) (scm_init_vports (groups scm C) (scan-data T)) (scm_init_weaks (groups scm C) (scan-data T)) (scm_initialized_p (groups scm C) (scan-data D)) (scm_input_port_p (groups scm C) (scan-data T)) (scm_instance_p (groups scm C) (scan-data T)) (scm_int2num (groups scm C) (scan-data T)) (scm_integer_expt (groups scm C) (scan-data T)) (scm_integer_length (groups scm C) (scan-data T)) (scm_integer_p (groups scm C) (scan-data T)) (scm_integer_to_char (groups scm C) (scan-data T)) (scm_interaction_environment (groups scm C) (scan-data T)) (scm_internal_catch (groups scm C) (scan-data T)) (scm_internal_cwdr (groups scm C) (scan-data T)) (scm_internal_dynamic_wind (groups scm C) (scan-data T)) (scm_internal_hash_fold (groups scm C) (scan-data T)) (scm_internal_lazy_catch (groups scm C) (scan-data T)) (scm_internal_parse_path (groups scm C) (scan-data T)) (scm_internal_select (groups scm C) (scan-data T)) (scm_internal_stack_catch (groups scm C) (scan-data T)) (scm_intprint (groups scm C) (scan-data T)) (scm_ints_disabled (groups scm C) (scan-data D)) (scm_iprin1 (groups scm C) (scan-data T)) (scm_iprlist (groups scm C) (scan-data T)) (scm_ipruk (groups scm C) (scan-data T)) (scm_isatty_p (groups scm C) (scan-data T)) (scm_issue_deprecation_warning (groups scm C) (scan-data T)) (scm_istr2bve (groups scm C) (scan-data T)) (scm_isymnames (groups scm C) (scan-data D)) (scm_ithrow (groups scm C) (scan-data T)) (scm_join_thread (groups scm C) (scan-data T)) (scm_keyword_dash_symbol (groups scm C) (scan-data T)) (scm_keyword_p (groups scm C) (scan-data T)) (scm_kill (groups scm C) (scan-data T)) (scm_last_pair (groups scm C) (scan-data T)) (scm_last_stack_frame (groups scm C) (scan-data T)) (scm_lazy_catch (groups scm C) (scan-data T)) (scm_lcm (groups scm C) (scan-data T)) (scm_leaf_environment_p (groups scm C) (scan-data T)) (scm_length (groups scm C) (scan-data T)) (scm_leq_p (groups scm C) (scan-data T)) (scm_less_p (groups scm C) (scan-data T)) (scm_lfwrite (groups scm C) (scan-data T)) (scm_link (groups scm C) (scan-data T)) (scm_list (groups scm C) (scan-data T)) (scm_list_1 (groups scm C) (scan-data T)) (scm_list_2 (groups scm C) (scan-data T)) (scm_list_3 (groups scm C) (scan-data T)) (scm_list_4 (groups scm C) (scan-data T)) (scm_list_5 (groups scm C) (scan-data T)) (scm_list_cdr_set_x (groups scm C) (scan-data T)) (scm_list_copy (groups scm C) (scan-data T)) (scm_list_head (groups scm C) (scan-data T)) (scm_list_n (groups scm C) (scan-data T)) (scm_list_p (groups scm C) (scan-data T)) (scm_list_ref (groups scm C) (scan-data T)) (scm_list_set_x (groups scm C) (scan-data T)) (scm_list_tail (groups scm C) (scan-data T)) (scm_list_to_uniform_array (groups scm C) (scan-data T)) (scm_listen (groups scm C) (scan-data T)) (scm_listofnullstr (groups scm C) (scan-data B)) (scm_lnaof (groups scm C) (scan-data T)) (scm_load_extension (groups scm C) (scan-data T)) (scm_load_goops (groups scm C) (scan-data T)) (scm_load_startup_files (groups scm C) (scan-data T)) (scm_local_eval (groups scm C) (scan-data T)) (scm_localtime (groups scm C) (scan-data T)) (scm_lock_mutex (groups scm C) (scan-data T)) (scm_logand (groups scm C) (scan-data T)) (scm_logbit_p (groups scm C) (scan-data T)) (scm_logcount (groups scm C) (scan-data T)) (scm_logior (groups scm C) (scan-data T)) (scm_lognot (groups scm C) (scan-data T)) (scm_logtest (groups scm C) (scan-data T)) (scm_logxor (groups scm C) (scan-data T)) (scm_long2num (groups scm C) (scan-data T)) (scm_long_long2num (groups scm C) (scan-data T)) (scm_lookup (groups scm C) (scan-data T)) (scm_lookup_closure_module (groups scm C) (scan-data T)) (scm_lookupcar (groups scm C) (scan-data T)) (scm_lreadparen (groups scm C) (scan-data T)) (scm_lreadr (groups scm C) (scan-data T)) (scm_lreadrecparen (groups scm C) (scan-data T)) (scm_lstat (groups scm C) (scan-data T)) (scm_m_and (groups scm C) (scan-data T)) (scm_m_apply (groups scm C) (scan-data T)) (scm_m_at_call_with_values (groups scm C) (scan-data T)) (scm_m_atbind (groups scm C) (scan-data T)) (scm_m_atdispatch (groups scm C) (scan-data T)) (scm_m_atfop (groups scm C) (scan-data T)) (scm_m_atslot_ref (groups scm C) (scan-data T)) (scm_m_atslot_set_x (groups scm C) (scan-data T)) (scm_m_begin (groups scm C) (scan-data T)) (scm_m_case (groups scm C) (scan-data T)) (scm_m_cond (groups scm C) (scan-data T)) (scm_m_cont (groups scm C) (scan-data T)) (scm_m_define (groups scm C) (scan-data T)) (scm_m_delay (groups scm C) (scan-data T)) (scm_m_do (groups scm C) (scan-data T)) (scm_m_expand_body (groups scm C) (scan-data T)) (scm_m_generalized_set_x (groups scm C) (scan-data T)) (scm_m_if (groups scm C) (scan-data T)) (scm_m_lambda (groups scm C) (scan-data T)) (scm_m_let (groups scm C) (scan-data T)) (scm_m_letrec (groups scm C) (scan-data T)) (scm_m_letstar (groups scm C) (scan-data T)) (scm_m_nil_cond (groups scm C) (scan-data T)) (scm_m_or (groups scm C) (scan-data T)) (scm_m_quasiquote (groups scm C) (scan-data T)) (scm_m_quote (groups scm C) (scan-data T)) (scm_m_set_x (groups scm C) (scan-data T)) (scm_m_undefine (groups scm C) (scan-data T)) (scm_macro_name (groups scm C) (scan-data T)) (scm_macro_p (groups scm C) (scan-data T)) (scm_macro_transformer (groups scm C) (scan-data T)) (scm_macro_type (groups scm C) (scan-data T)) (scm_macroexp (groups scm C) (scan-data T)) (scm_magnitude (groups scm C) (scan-data T)) (scm_major_version (groups scm C) (scan-data T)) (scm_makacro (groups scm C) (scan-data T)) (scm_makcclo (groups scm C) (scan-data T)) (scm_make (groups scm C) (scan-data T)) (scm_make_arbiter (groups scm C) (scan-data T)) (scm_make_class (groups scm C) (scan-data T)) (scm_make_class_object (groups scm C) (scan-data T)) (scm_make_complex (groups scm C) (scan-data T)) (scm_make_condition_variable (groups scm C) (scan-data T)) (scm_make_continuation (groups scm C) (scan-data T)) (scm_make_debugobj (groups scm C) (scan-data T)) (scm_make_doubly_weak_hash_table (groups scm C) (scan-data T)) (scm_make_environment (groups scm C) (scan-data T)) (scm_make_eval_environment (groups scm C) (scan-data T)) (scm_make_export_environment (groups scm C) (scan-data T)) (scm_make_extended_class (groups scm C) (scan-data T)) (scm_make_fluid (groups scm C) (scan-data T)) (scm_make_foreign_object (groups scm C) (scan-data T)) (scm_make_guardian (groups scm C) (scan-data T)) (scm_make_hook (groups scm C) (scan-data T)) (scm_make_import_environment (groups scm C) (scan-data T)) (scm_make_initial_fluids (groups scm C) (scan-data T)) (scm_make_keyword_from_dash_symbol (groups scm C) (scan-data T)) (scm_make_leaf_environment (groups scm C) (scan-data T)) (scm_make_memoized (groups scm C) (scan-data T)) (scm_make_method_cache (groups scm C) (scan-data T)) (scm_make_mutex (groups scm C) (scan-data T)) (scm_make_polar (groups scm C) (scan-data T)) (scm_make_port_classes (groups scm C) (scan-data T)) (scm_make_port_type (groups scm C) (scan-data T)) (scm_make_print_state (groups scm C) (scan-data T)) (scm_make_procedure_with_setter (groups scm C) (scan-data T)) (scm_make_ra (groups scm C) (scan-data T)) (scm_make_real (groups scm C) (scan-data T)) (scm_make_rectangular (groups scm C) (scan-data T)) (scm_make_regexp (groups scm C) (scan-data T)) (scm_make_root (groups scm C) (scan-data T)) (scm_make_shared_array (groups scm C) (scan-data T)) (scm_make_smob (groups scm C) (scan-data T)) (scm_make_smob_type (groups scm C) (scan-data T)) (scm_make_soft_port (groups scm C) (scan-data T)) (scm_make_srcprops (groups scm C) (scan-data T)) (scm_make_stack (groups scm C) (scan-data T)) (scm_make_string (groups scm C) (scan-data T)) (scm_make_struct (groups scm C) (scan-data T)) (scm_make_struct_layout (groups scm C) (scan-data T)) (scm_make_subclass_object (groups scm C) (scan-data T)) (scm_make_symbol (groups scm C) (scan-data T)) (scm_make_synt (groups scm C) (scan-data T)) (scm_make_undefined_variable (groups scm C) (scan-data T)) (scm_make_uve (groups scm C) (scan-data T)) (scm_make_variable (groups scm C) (scan-data T)) (scm_make_vector (groups scm C) (scan-data T)) (scm_make_vtable_vtable (groups scm C) (scan-data T)) (scm_make_weak_key_hash_table (groups scm C) (scan-data T)) (scm_make_weak_value_hash_table (groups scm C) (scan-data T)) (scm_make_weak_vector (groups scm C) (scan-data T)) (scm_makfrom0str (groups scm C) (scan-data T)) (scm_makfrom0str_opt (groups scm C) (scan-data T)) (scm_makfromstrs (groups scm C) (scan-data T)) (scm_makmacro (groups scm C) (scan-data T)) (scm_makmmacro (groups scm C) (scan-data T)) (scm_makprom (groups scm C) (scan-data T)) (scm_malloc (groups scm C) (scan-data T)) (scm_malloc_obj (groups scm C) (scan-data T)) (scm_mallocated (groups scm C) (scan-data D)) (scm_map (groups scm C) (scan-data T)) (scm_mark0 (groups scm C) (scan-data T)) (scm_mark_locations (groups scm C) (scan-data T)) (scm_mark_subr_table (groups scm C) (scan-data T)) (scm_markcdr (groups scm C) (scan-data T)) (scm_markstream (groups scm C) (scan-data T)) (scm_mask_ints (groups scm C) (scan-data D)) (scm_mask_signals (groups scm C) (scan-data T)) (scm_masktab (groups scm C) (scan-data B)) (scm_master_freelist (groups scm C) (scan-data D)) (scm_master_freelist2 (groups scm C) (scan-data D)) (scm_max (groups scm C) (scan-data T)) (scm_max_segment_size (groups scm C) (scan-data B)) (scm_mcache_compute_cmethod (groups scm C) (scan-data T)) (scm_mcache_lookup_cmethod (groups scm C) (scan-data T)) (scm_mem2string (groups scm C) (scan-data T)) (scm_mem2symbol (groups scm C) (scan-data T)) (scm_mem2uninterned_symbol (groups scm C) (scan-data T)) (scm_member (groups scm C) (scan-data T)) (scm_memoize_method (groups scm C) (scan-data T)) (scm_memoized_environment (groups scm C) (scan-data T)) (scm_memoized_p (groups scm C) (scan-data T)) (scm_memory_alloc_key (groups scm C) (scan-data B)) (scm_memory_error (groups scm C) (scan-data T)) (scm_memq (groups scm C) (scan-data T)) (scm_memv (groups scm C) (scan-data T)) (scm_merge (groups scm C) (scan-data T)) (scm_merge_x (groups scm C) (scan-data T)) (scm_metaclass_operator (groups scm C) (scan-data B)) (scm_metaclass_standard (groups scm C) (scan-data B)) (scm_method_generic_function (groups scm C) (scan-data T)) (scm_method_procedure (groups scm C) (scan-data T)) (scm_method_specializers (groups scm C) (scan-data T)) (scm_micro_version (groups scm C) (scan-data T)) (scm_min (groups scm C) (scan-data T)) (scm_minor_version (groups scm C) (scan-data T)) (scm_misc_error (groups scm C) (scan-data T)) (scm_misc_error_key (groups scm C) (scan-data B)) (scm_mkdir (groups scm C) (scan-data T)) (scm_mknod (groups scm C) (scan-data T)) (scm_mkstemp (groups scm C) (scan-data T)) (scm_mkstrport (groups scm C) (scan-data T)) (scm_mktime (groups scm C) (scan-data T)) (scm_mode_bits (groups scm C) (scan-data T)) (scm_module_define (groups scm C) (scan-data T)) (scm_module_goops (groups scm C) (scan-data B)) (scm_module_lookup (groups scm C) (scan-data T)) (scm_module_lookup_closure (groups scm C) (scan-data T)) (scm_module_reverse_lookup (groups scm C) (scan-data T)) (scm_module_system_booted_p (groups scm C) (scan-data D)) (scm_module_tag (groups scm C) (scan-data B)) (scm_module_transformer (groups scm C) (scan-data T)) (scm_modules_prehistory (groups scm C) (scan-data T)) (scm_modulo (groups scm C) (scan-data T)) (scm_mtrigger (groups scm C) (scan-data B)) (scm_mulbig (groups scm C) (scan-data T)) (scm_must_free (groups scm C) (scan-data T)) (scm_must_malloc (groups scm C) (scan-data T)) (scm_must_realloc (groups scm C) (scan-data T)) (scm_must_strdup (groups scm C) (scan-data T)) (scm_must_strndup (groups scm C) (scan-data T)) (scm_n_charnames (groups scm C) (scan-data D)) (scm_n_heap_segs (groups scm C) (scan-data D)) (scm_nan (groups scm C) (scan-data T)) (scm_nan_p (groups scm C) (scan-data T)) (scm_nconc2last (groups scm C) (scan-data T)) (scm_negative_p (groups scm C) (scan-data T)) (scm_newline (groups scm C) (scan-data T)) (scm_nice (groups scm C) (scan-data T)) (scm_no_applicable_method (groups scm C) (scan-data B)) (scm_noop (groups scm C) (scan-data T)) (scm_not (groups scm C) (scan-data T)) (scm_ntohl (groups scm C) (scan-data T)) (scm_ntohs (groups scm C) (scan-data T)) (scm_null_p (groups scm C) (scan-data T)) (scm_num2dbl (groups scm C) (scan-data T)) (scm_num2double (groups scm C) (scan-data T)) (scm_num2float (groups scm C) (scan-data T)) (scm_num2int (groups scm C) (scan-data T)) (scm_num2long (groups scm C) (scan-data T)) (scm_num2long_long (groups scm C) (scan-data T)) (scm_num2ptrdiff (groups scm C) (scan-data T)) (scm_num2short (groups scm C) (scan-data T)) (scm_num2size (groups scm C) (scan-data T)) (scm_num2uint (groups scm C) (scan-data T)) (scm_num2ulong (groups scm C) (scan-data T)) (scm_num2ulong_long (groups scm C) (scan-data T)) (scm_num2ushort (groups scm C) (scan-data T)) (scm_num_eq_p (groups scm C) (scan-data T)) (scm_num_overflow (groups scm C) (scan-data T)) (scm_num_overflow_key (groups scm C) (scan-data B)) (scm_number_p (groups scm C) (scan-data T)) (scm_number_to_string (groups scm C) (scan-data T)) (scm_numptob (groups scm C) (scan-data B)) (scm_numsmob (groups scm C) (scan-data B)) (scm_object_address (groups scm C) (scan-data T)) (scm_object_properties (groups scm C) (scan-data T)) (scm_object_property (groups scm C) (scan-data T)) (scm_object_to_string (groups scm C) (scan-data T)) (scm_odd_p (groups scm C) (scan-data T)) (scm_open (groups scm C) (scan-data T)) (scm_open_fdes (groups scm C) (scan-data T)) (scm_open_file (groups scm C) (scan-data T)) (scm_open_input_string (groups scm C) (scan-data T)) (scm_open_output_string (groups scm C) (scan-data T)) (scm_opendir (groups scm C) (scan-data T)) (scm_operator_p (groups scm C) (scan-data T)) (scm_options (groups scm C) (scan-data T)) (scm_out_of_range (groups scm C) (scan-data T)) (scm_out_of_range_key (groups scm C) (scan-data B)) (scm_out_of_range_pos (groups scm C) (scan-data T)) (scm_output_port_p (groups scm C) (scan-data T)) (scm_pair_p (groups scm C) (scan-data T)) (scm_parse_path (groups scm C) (scan-data T)) (scm_pause (groups scm C) (scan-data T)) (scm_peek_char (groups scm C) (scan-data T)) (scm_permanent_object (groups scm C) (scan-data T)) (scm_pipe (groups scm C) (scan-data T)) (scm_port_class (groups scm C) (scan-data D)) (scm_port_closed_p (groups scm C) (scan-data T)) (scm_port_column (groups scm C) (scan-data T)) (scm_port_filename (groups scm C) (scan-data T)) (scm_port_for_each (groups scm C) (scan-data T)) (scm_port_line (groups scm C) (scan-data T)) (scm_port_mode (groups scm C) (scan-data T)) (scm_port_non_buffer (groups scm C) (scan-data T)) (scm_port_p (groups scm C) (scan-data T)) (scm_port_print (groups scm C) (scan-data T)) (scm_port_revealed (groups scm C) (scan-data T)) (scm_port_table (groups scm C) (scan-data B)) (scm_port_table_room (groups scm C) (scan-data D)) (scm_port_table_size (groups scm C) (scan-data D)) (scm_port_with_print_state (groups scm C) (scan-data T)) (scm_ports_prehistory (groups scm C) (scan-data T)) (scm_positive_p (groups scm C) (scan-data T)) (scm_pre_modules_obarray (groups scm C) (scan-data B)) (scm_primitive_eval (groups scm C) (scan-data T)) (scm_primitive_eval_x (groups scm C) (scan-data T)) (scm_primitive_exit (groups scm C) (scan-data T)) (scm_primitive_generic_generic (groups scm C) (scan-data T)) (scm_primitive_load (groups scm C) (scan-data T)) (scm_primitive_load_path (groups scm C) (scan-data T)) (scm_primitive_make_property (groups scm C) (scan-data T)) (scm_primitive_move_to_fdes (groups scm C) (scan-data T)) (scm_primitive_property_del_x (groups scm C) (scan-data T)) (scm_primitive_property_ref (groups scm C) (scan-data T)) (scm_primitive_property_set_x (groups scm C) (scan-data T)) (scm_prin1 (groups scm C) (scan-data T)) (scm_print_carefully_p (groups scm C) (scan-data B)) (scm_print_complex (groups scm C) (scan-data T)) (scm_print_options (groups scm C) (scan-data T)) (scm_print_opts (groups scm C) (scan-data D)) (scm_print_port_mode (groups scm C) (scan-data T)) (scm_print_real (groups scm C) (scan-data T)) (scm_print_state_vtable (groups scm C) (scan-data D)) (scm_print_struct (groups scm C) (scan-data T)) (scm_print_symbol_name (groups scm C) (scan-data T)) (scm_printer_apply (groups scm C) (scan-data T)) (scm_procedure (groups scm C) (scan-data T)) (scm_procedure_documentation (groups scm C) (scan-data T)) (scm_procedure_environment (groups scm C) (scan-data T)) (scm_procedure_name (groups scm C) (scan-data T)) (scm_procedure_p (groups scm C) (scan-data T)) (scm_procedure_properties (groups scm C) (scan-data T)) (scm_procedure_property (groups scm C) (scan-data T)) (scm_procedure_source (groups scm C) (scan-data T)) (scm_procedure_with_setter_p (groups scm C) (scan-data T)) (scm_product (groups scm C) (scan-data T)) (scm_program_arguments (groups scm C) (scan-data T)) (scm_promise_p (groups scm C) (scan-data T)) (scm_pseudolong (groups scm C) (scan-data T)) (scm_ptobs (groups scm C) (scan-data B)) (scm_ptrdiff2num (groups scm C) (scan-data T)) (scm_putc (groups scm C) (scan-data T)) (scm_putenv (groups scm C) (scan-data T)) (scm_puts (groups scm C) (scan-data T)) (scm_quotient (groups scm C) (scan-data T)) (scm_ra2contig (groups scm C) (scan-data T)) (scm_ra_difference (groups scm C) (scan-data T)) (scm_ra_divide (groups scm C) (scan-data T)) (scm_ra_eqp (groups scm C) (scan-data T)) (scm_ra_greqp (groups scm C) (scan-data T)) (scm_ra_grp (groups scm C) (scan-data T)) (scm_ra_leqp (groups scm C) (scan-data T)) (scm_ra_lessp (groups scm C) (scan-data T)) (scm_ra_matchp (groups scm C) (scan-data T)) (scm_ra_product (groups scm C) (scan-data T)) (scm_ra_set_contp (groups scm C) (scan-data T)) (scm_ra_sum (groups scm C) (scan-data T)) (scm_raequal (groups scm C) (scan-data T)) (scm_raise (groups scm C) (scan-data T)) (scm_ramapc (groups scm C) (scan-data T)) (scm_random (groups scm C) (scan-data T)) (scm_random_exp (groups scm C) (scan-data T)) (scm_random_hollow_sphere_x (groups scm C) (scan-data T)) (scm_random_normal (groups scm C) (scan-data T)) (scm_random_normal_vector_x (groups scm C) (scan-data T)) (scm_random_solid_sphere_x (groups scm C) (scan-data T)) (scm_random_uniform (groups scm C) (scan-data T)) (scm_raprin1 (groups scm C) (scan-data T)) (scm_read (groups scm C) (scan-data T)) (scm_read_char (groups scm C) (scan-data T)) (scm_read_delimited_x (groups scm C) (scan-data T)) (scm_read_hash_extend (groups scm C) (scan-data T)) (scm_read_line (groups scm C) (scan-data T)) (scm_read_options (groups scm C) (scan-data T)) (scm_read_opts (groups scm C) (scan-data D)) (scm_read_string_x_partial (groups scm C) (scan-data T)) (scm_read_token (groups scm C) (scan-data T)) (scm_readdir (groups scm C) (scan-data T)) (scm_readlink (groups scm C) (scan-data T)) (scm_real_equalp (groups scm C) (scan-data T)) (scm_real_p (groups scm C) (scan-data T)) (scm_real_part (groups scm C) (scan-data T)) (scm_realloc (groups scm C) (scan-data T)) (scm_recv (groups scm C) (scan-data T)) (scm_recvfrom (groups scm C) (scan-data T)) (scm_redirect_port (groups scm C) (scan-data T)) (scm_regexp_exec (groups scm C) (scan-data T)) (scm_regexp_p (groups scm C) (scan-data T)) (scm_release_arbiter (groups scm C) (scan-data T)) (scm_remainder (groups scm C) (scan-data T)) (scm_remember_upto_here (groups scm C) (scan-data T)) (scm_remember_upto_here_1 (groups scm C) (scan-data T)) (scm_remember_upto_here_2 (groups scm C) (scan-data T)) (scm_remove_from_port_table (groups scm C) (scan-data T)) (scm_remove_hook_x (groups scm C) (scan-data T)) (scm_rename (groups scm C) (scan-data T)) (scm_report_stack_overflow (groups scm C) (scan-data T)) (scm_reset_hook_x (groups scm C) (scan-data T)) (scm_resolve_module (groups scm C) (scan-data T)) (scm_restore_signals (groups scm C) (scan-data T)) (scm_restricted_vector_sort_x (groups scm C) (scan-data T)) (scm_return_first (groups scm C) (scan-data T)) (scm_return_first_int (groups scm C) (scan-data T)) (scm_revealed_count (groups scm C) (scan-data T)) (scm_reverse (groups scm C) (scan-data T)) (scm_reverse_lookup (groups scm C) (scan-data T)) (scm_reverse_x (groups scm C) (scan-data T)) (scm_rewinddir (groups scm C) (scan-data T)) (scm_rmdir (groups scm C) (scan-data T)) (scm_round (groups scm C) (scan-data T)) (scm_run_asyncs (groups scm C) (scan-data T)) (scm_run_hook (groups scm C) (scan-data T)) (scm_s_bindings (groups scm C) (scan-data R)) (scm_s_body (groups scm C) (scan-data R)) (scm_s_clauses (groups scm C) (scan-data R)) (scm_s_duplicate_bindings (groups scm C) (scan-data R)) (scm_s_duplicate_formals (groups scm C) (scan-data R)) (scm_s_expression (groups scm C) (scan-data R)) (scm_s_formals (groups scm C) (scan-data R)) (scm_s_set_x (groups scm C) (scan-data R)) (scm_s_slot_set_x (groups scm C) (scan-data D)) (scm_s_test (groups scm C) (scan-data R)) (scm_s_variable (groups scm C) (scan-data R)) (scm_search_path (groups scm C) (scan-data T)) (scm_seed_to_random_state (groups scm C) (scan-data T)) (scm_seek (groups scm C) (scan-data T)) (scm_select (groups scm C) (scan-data T)) (scm_send (groups scm C) (scan-data T)) (scm_sendto (groups scm C) (scan-data T)) (scm_set_car_x (groups scm C) (scan-data T)) (scm_set_cdr_x (groups scm C) (scan-data T)) (scm_set_current_error_port (groups scm C) (scan-data T)) (scm_set_current_input_port (groups scm C) (scan-data T)) (scm_set_current_module (groups scm C) (scan-data T)) (scm_set_current_output_port (groups scm C) (scan-data T)) (scm_set_object_procedure_x (groups scm C) (scan-data T)) (scm_set_object_properties_x (groups scm C) (scan-data T)) (scm_set_object_property_x (groups scm C) (scan-data T)) (scm_set_port_close (groups scm C) (scan-data T)) (scm_set_port_column_x (groups scm C) (scan-data T)) (scm_set_port_end_input (groups scm C) (scan-data T)) (scm_set_port_equalp (groups scm C) (scan-data T)) (scm_set_port_filename_x (groups scm C) (scan-data T)) (scm_set_port_flush (groups scm C) (scan-data T)) (scm_set_port_free (groups scm C) (scan-data T)) (scm_set_port_input_waiting (groups scm C) (scan-data T)) (scm_set_port_line_x (groups scm C) (scan-data T)) (scm_set_port_mark (groups scm C) (scan-data T)) (scm_set_port_print (groups scm C) (scan-data T)) (scm_set_port_revealed_x (groups scm C) (scan-data T)) (scm_set_port_seek (groups scm C) (scan-data T)) (scm_set_port_truncate (groups scm C) (scan-data T)) (scm_set_procedure_properties_x (groups scm C) (scan-data T)) (scm_set_procedure_property_x (groups scm C) (scan-data T)) (scm_set_program_arguments (groups scm C) (scan-data T)) (scm_set_smob_apply (groups scm C) (scan-data T)) (scm_set_smob_equalp (groups scm C) (scan-data T)) (scm_set_smob_free (groups scm C) (scan-data T)) (scm_set_smob_mark (groups scm C) (scan-data T)) (scm_set_smob_print (groups scm C) (scan-data T)) (scm_set_source_properties_x (groups scm C) (scan-data T)) (scm_set_source_property_x (groups scm C) (scan-data T)) (scm_set_struct_vtable_name_x (groups scm C) (scan-data T)) (scm_setegid (groups scm C) (scan-data T)) (scm_seteuid (groups scm C) (scan-data T)) (scm_setgid (groups scm C) (scan-data T)) (scm_setgrent (groups scm C) (scan-data T)) (scm_sethost (groups scm C) (scan-data T)) (scm_sethostname (groups scm C) (scan-data T)) (scm_setitimer (groups scm C) (scan-data T)) (scm_setlocale (groups scm C) (scan-data T)) (scm_setnet (groups scm C) (scan-data T)) (scm_setpgid (groups scm C) (scan-data T)) (scm_setpriority (groups scm C) (scan-data T)) (scm_setproto (groups scm C) (scan-data T)) (scm_setpwent (groups scm C) (scan-data T)) (scm_setserv (groups scm C) (scan-data T)) (scm_setsid (groups scm C) (scan-data T)) (scm_setsockopt (groups scm C) (scan-data T)) (scm_setter (groups scm C) (scan-data T)) (scm_setuid (groups scm C) (scan-data T)) (scm_setvbuf (groups scm C) (scan-data T)) (scm_shap2ra (groups scm C) (scan-data T)) (scm_shared_array_increments (groups scm C) (scan-data T)) (scm_shared_array_offset (groups scm C) (scan-data T)) (scm_shared_array_root (groups scm C) (scan-data T)) (scm_shell (groups scm C) (scan-data T)) (scm_shell_usage (groups scm C) (scan-data T)) (scm_short2num (groups scm C) (scan-data T)) (scm_shutdown (groups scm C) (scan-data T)) (scm_sigaction (groups scm C) (scan-data T)) (scm_signal_condition_variable (groups scm C) (scan-data T)) (scm_simple_format (groups scm C) (scan-data T)) (scm_single_thread_p (groups scm C) (scan-data T)) (scm_size2num (groups scm C) (scan-data T)) (scm_sleep (groups scm C) (scan-data T)) (scm_sloppy_assoc (groups scm C) (scan-data T)) (scm_sloppy_assq (groups scm C) (scan-data T)) (scm_sloppy_assv (groups scm C) (scan-data T)) (scm_slot_bound_p (groups scm C) (scan-data T)) (scm_slot_bound_using_class_p (groups scm C) (scan-data T)) (scm_slot_exists_p (groups scm C) (scan-data T)) (scm_slot_exists_using_class_p (groups scm C) (scan-data T)) (scm_slot_ref (groups scm C) (scan-data T)) (scm_slot_ref_using_class (groups scm C) (scan-data T)) (scm_slot_set_using_class_x (groups scm C) (scan-data T)) (scm_slot_set_x (groups scm C) (scan-data T)) (scm_smob_class (groups scm C) (scan-data D)) (scm_smob_free (groups scm C) (scan-data T)) (scm_smob_prehistory (groups scm C) (scan-data T)) (scm_smob_print (groups scm C) (scan-data T)) (scm_smobs (groups scm C) (scan-data B)) (scm_socket (groups scm C) (scan-data T)) (scm_socketpair (groups scm C) (scan-data T)) (scm_sort (groups scm C) (scan-data T)) (scm_sort_list (groups scm C) (scan-data T)) (scm_sort_list_x (groups scm C) (scan-data T)) (scm_sort_x (groups scm C) (scan-data T)) (scm_sorted_p (groups scm C) (scan-data T)) (scm_source_properties (groups scm C) (scan-data T)) (scm_source_property (groups scm C) (scan-data T)) (scm_spawn_thread (groups scm C) (scan-data T)) (scm_srcprops_to_plist (groups scm C) (scan-data T)) (scm_stable_sort (groups scm C) (scan-data T)) (scm_stable_sort_x (groups scm C) (scan-data T)) (scm_stack_checking_enabled_p (groups scm C) (scan-data B)) (scm_stack_id (groups scm C) (scan-data T)) (scm_stack_length (groups scm C) (scan-data T)) (scm_stack_p (groups scm C) (scan-data T)) (scm_stack_ref (groups scm C) (scan-data T)) (scm_stack_report (groups scm C) (scan-data T)) (scm_stack_size (groups scm C) (scan-data T)) (scm_stack_type (groups scm C) (scan-data B)) (scm_standard_eval_closure (groups scm C) (scan-data T)) (scm_standard_interface_eval_closure (groups scm C) (scan-data T)) (scm_start_stack (groups scm C) (scan-data T)) (scm_stat (groups scm C) (scan-data T)) (scm_status_exit_val (groups scm C) (scan-data T)) (scm_status_stop_sig (groups scm C) (scan-data T)) (scm_status_term_sig (groups scm C) (scan-data T)) (scm_str2string (groups scm C) (scan-data T)) (scm_str2symbol (groups scm C) (scan-data T)) (scm_strdup (groups scm C) (scan-data T)) (scm_strerror (groups scm C) (scan-data T)) (scm_strftime (groups scm C) (scan-data T)) (scm_string (groups scm C) (scan-data T)) (scm_string_append (groups scm C) (scan-data T)) (scm_string_capitalize (groups scm C) (scan-data T)) (scm_string_capitalize_x (groups scm C) (scan-data T)) (scm_string_ci_equal_p (groups scm C) (scan-data T)) (scm_string_ci_geq_p (groups scm C) (scan-data T)) (scm_string_ci_gr_p (groups scm C) (scan-data T)) (scm_string_ci_leq_p (groups scm C) (scan-data T)) (scm_string_ci_less_p (groups scm C) (scan-data T)) (scm_string_ci_to_symbol (groups scm C) (scan-data T)) (scm_string_copy (groups scm C) (scan-data T)) (scm_string_downcase (groups scm C) (scan-data T)) (scm_string_downcase_x (groups scm C) (scan-data T)) (scm_string_equal_p (groups scm C) (scan-data T)) (scm_string_fill_x (groups scm C) (scan-data T)) (scm_string_geq_p (groups scm C) (scan-data T)) (scm_string_gr_p (groups scm C) (scan-data T)) (scm_string_hash (groups scm C) (scan-data T)) (scm_string_index (groups scm C) (scan-data T)) (scm_string_length (groups scm C) (scan-data T)) (scm_string_leq_p (groups scm C) (scan-data T)) (scm_string_less_p (groups scm C) (scan-data T)) (scm_string_null_p (groups scm C) (scan-data T)) (scm_string_p (groups scm C) (scan-data T)) (scm_string_ref (groups scm C) (scan-data T)) (scm_string_rindex (groups scm C) (scan-data T)) (scm_string_set_x (groups scm C) (scan-data T)) (scm_string_split (groups scm C) (scan-data T)) (scm_string_to_list (groups scm C) (scan-data T)) (scm_string_to_number (groups scm C) (scan-data T)) (scm_string_to_symbol (groups scm C) (scan-data T)) (scm_string_upcase (groups scm C) (scan-data T)) (scm_string_upcase_x (groups scm C) (scan-data T)) (scm_strndup (groups scm C) (scan-data T)) (scm_strport_to_string (groups scm C) (scan-data T)) (scm_strptime (groups scm C) (scan-data T)) (scm_struct_create_handle (groups scm C) (scan-data T)) (scm_struct_free_0 (groups scm C) (scan-data T)) (scm_struct_free_entity (groups scm C) (scan-data T)) (scm_struct_free_light (groups scm C) (scan-data T)) (scm_struct_free_standard (groups scm C) (scan-data T)) (scm_struct_ihashq (groups scm C) (scan-data T)) (scm_struct_p (groups scm C) (scan-data T)) (scm_struct_prehistory (groups scm C) (scan-data T)) (scm_struct_ref (groups scm C) (scan-data T)) (scm_struct_set_x (groups scm C) (scan-data T)) (scm_struct_table (groups scm C) (scan-data B)) (scm_struct_vtable (groups scm C) (scan-data T)) (scm_struct_vtable_name (groups scm C) (scan-data T)) (scm_struct_vtable_p (groups scm C) (scan-data T)) (scm_struct_vtable_tag (groups scm C) (scan-data T)) (scm_structs_to_free (groups scm C) (scan-data B)) (scm_subr_p (groups scm C) (scan-data T)) (scm_subr_table (groups scm C) (scan-data B)) (scm_subr_table_room (groups scm C) (scan-data D)) (scm_subr_table_size (groups scm C) (scan-data D)) (scm_substring (groups scm C) (scan-data T)) (scm_substring_fill_x (groups scm C) (scan-data T)) (scm_substring_move_x (groups scm C) (scan-data T)) (scm_sum (groups scm C) (scan-data T)) (scm_swap_bindings (groups scm C) (scan-data T)) (scm_swap_fluids (groups scm C) (scan-data T)) (scm_swap_fluids_reverse (groups scm C) (scan-data T)) (scm_switch_counter (groups scm C) (scan-data D)) (scm_sym2var (groups scm C) (scan-data T)) (scm_sym_and (groups scm C) (scan-data B)) (scm_sym_apply (groups scm C) (scan-data B)) (scm_sym_apply_frame (groups scm C) (scan-data B)) (scm_sym_arity (groups scm C) (scan-data B)) (scm_sym_arrow (groups scm C) (scan-data B)) (scm_sym_at_call_with_values (groups scm C) (scan-data B)) (scm_sym_atapply (groups scm C) (scan-data B)) (scm_sym_atcall_cc (groups scm C) (scan-data B)) (scm_sym_begin (groups scm C) (scan-data B)) (scm_sym_breakpoint (groups scm C) (scan-data B)) (scm_sym_case (groups scm C) (scan-data B)) (scm_sym_column (groups scm C) (scan-data B)) (scm_sym_cond (groups scm C) (scan-data B)) (scm_sym_copy (groups scm C) (scan-data B)) (scm_sym_define (groups scm C) (scan-data B)) (scm_sym_delay (groups scm C) (scan-data B)) (scm_sym_do (groups scm C) (scan-data B)) (scm_sym_dot (groups scm C) (scan-data B)) (scm_sym_else (groups scm C) (scan-data B)) (scm_sym_enter_frame (groups scm C) (scan-data B)) (scm_sym_exit_frame (groups scm C) (scan-data B)) (scm_sym_filename (groups scm C) (scan-data B)) (scm_sym_if (groups scm C) (scan-data B)) (scm_sym_lambda (groups scm C) (scan-data B)) (scm_sym_let (groups scm C) (scan-data B)) (scm_sym_letrec (groups scm C) (scan-data B)) (scm_sym_letstar (groups scm C) (scan-data B)) (scm_sym_line (groups scm C) (scan-data B)) (scm_sym_name (groups scm C) (scan-data B)) (scm_sym_or (groups scm C) (scan-data B)) (scm_sym_quasiquote (groups scm C) (scan-data B)) (scm_sym_quote (groups scm C) (scan-data B)) (scm_sym_set_x (groups scm C) (scan-data B)) (scm_sym_system_procedure (groups scm C) (scan-data B)) (scm_sym_trace (groups scm C) (scan-data B)) (scm_sym_unquote (groups scm C) (scan-data B)) (scm_sym_uq_splicing (groups scm C) (scan-data B)) (scm_symbol_fref (groups scm C) (scan-data T)) (scm_symbol_fset_x (groups scm C) (scan-data T)) (scm_symbol_hash (groups scm C) (scan-data T)) (scm_symbol_interned_p (groups scm C) (scan-data T)) (scm_symbol_p (groups scm C) (scan-data T)) (scm_symbol_pref (groups scm C) (scan-data T)) (scm_symbol_pset_x (groups scm C) (scan-data T)) (scm_symbol_to_string (groups scm C) (scan-data T)) (scm_symbols_prehistory (groups scm C) (scan-data T)) (scm_symlink (groups scm C) (scan-data T)) (scm_sync (groups scm C) (scan-data T)) (scm_sys_allocate_instance (groups scm C) (scan-data T)) (scm_sys_atan2 (groups scm C) (scan-data T)) (scm_sys_compute_applicable_methods (groups scm C) (scan-data T)) (scm_sys_compute_slots (groups scm C) (scan-data T)) (scm_sys_expt (groups scm C) (scan-data T)) (scm_sys_fast_slot_ref (groups scm C) (scan-data T)) (scm_sys_fast_slot_set_x (groups scm C) (scan-data T)) (scm_sys_inherit_magic_x (groups scm C) (scan-data T)) (scm_sys_initialize_object (groups scm C) (scan-data T)) (scm_sys_invalidate_class (groups scm C) (scan-data T)) (scm_sys_invalidate_method_cache_x (groups scm C) (scan-data T)) (scm_sys_library_dir (groups scm C) (scan-data T)) (scm_sys_make_void_port (groups scm C) (scan-data T)) (scm_sys_method_more_specific_p (groups scm C) (scan-data T)) (scm_sys_modify_class (groups scm C) (scan-data T)) (scm_sys_modify_instance (groups scm C) (scan-data T)) (scm_sys_package_data_dir (groups scm C) (scan-data T)) (scm_sys_prep_layout_x (groups scm C) (scan-data T)) (scm_sys_protects (groups scm C) (scan-data B)) (scm_sys_search_load_path (groups scm C) (scan-data T)) (scm_sys_set_object_setter_x (groups scm C) (scan-data T)) (scm_sys_site_dir (groups scm C) (scan-data T)) (scm_sys_tag_body (groups scm C) (scan-data T)) (scm_syserror (groups scm C) (scan-data T)) (scm_syserror_msg (groups scm C) (scan-data T)) (scm_system (groups scm C) (scan-data T)) (scm_system_async (groups scm C) (scan-data T)) (scm_system_async_mark (groups scm C) (scan-data T)) (scm_system_async_mark_from_signal_handler (groups scm C) (scan-data T)) (scm_system_environment (groups scm C) (scan-data B)) (scm_system_error_key (groups scm C) (scan-data B)) (scm_system_module_env_p (groups scm C) (scan-data T)) (scm_tables_prehistory (groups scm C) (scan-data T)) (scm_take0str (groups scm C) (scan-data T)) (scm_take_from_input_buffers (groups scm C) (scan-data T)) (scm_take_str (groups scm C) (scan-data T)) (scm_tc16_allocated (groups scm C) (scan-data B)) (scm_tc16_array (groups scm C) (scan-data B)) (scm_tc16_condvar (groups scm C) (scan-data B)) (scm_tc16_continuation (groups scm C) (scan-data B)) (scm_tc16_debugobj (groups scm C) (scan-data B)) (scm_tc16_dir (groups scm C) (scan-data B)) (scm_tc16_dynamic_obj (groups scm C) (scan-data B)) (scm_tc16_environment (groups scm C) (scan-data B)) (scm_tc16_eval_closure (groups scm C) (scan-data B)) (scm_tc16_fluid (groups scm C) (scan-data B)) (scm_tc16_fport (groups scm C) (scan-data B)) (scm_tc16_hook (groups scm C) (scan-data B)) (scm_tc16_keyword (groups scm C) (scan-data B)) (scm_tc16_macro (groups scm C) (scan-data B)) (scm_tc16_malloc (groups scm C) (scan-data B)) (scm_tc16_memoized (groups scm C) (scan-data B)) (scm_tc16_mutex (groups scm C) (scan-data B)) (scm_tc16_observer (groups scm C) (scan-data B)) (scm_tc16_port_with_ps (groups scm C) (scan-data B)) (scm_tc16_promise (groups scm C) (scan-data B)) (scm_tc16_regex (groups scm C) (scan-data B)) (scm_tc16_root (groups scm C) (scan-data B)) (scm_tc16_rstate (groups scm C) (scan-data B)) (scm_tc16_srcprops (groups scm C) (scan-data B)) (scm_tc16_strport (groups scm C) (scan-data B)) (scm_tc16_thread (groups scm C) (scan-data B)) (scm_tc16_void_port (groups scm C) (scan-data D)) (scm_tcgetpgrp (groups scm C) (scan-data T)) (scm_tcsetpgrp (groups scm C) (scan-data T)) (scm_the_last_stack_fluid_var (groups scm C) (scan-data B)) (scm_the_rng (groups scm C) (scan-data B)) (scm_thread_count (groups scm C) (scan-data D)) (scm_thread_sleep (groups scm C) (scan-data T)) (scm_thread_usleep (groups scm C) (scan-data T)) (scm_threads_init (groups scm C) (scan-data T)) (scm_threads_mark_stacks (groups scm C) (scan-data T)) (scm_throw (groups scm C) (scan-data T)) (scm_thunk_p (groups scm C) (scan-data T)) (scm_times (groups scm C) (scan-data T)) (scm_tmpnam (groups scm C) (scan-data T)) (scm_top_level_env (groups scm C) (scan-data T)) (scm_transpose_array (groups scm C) (scan-data T)) (scm_truncate (groups scm C) (scan-data T)) (scm_truncate_file (groups scm C) (scan-data T)) (scm_try_arbiter (groups scm C) (scan-data T)) (scm_ttyname (groups scm C) (scan-data T)) (scm_type_eval_environment (groups scm C) (scan-data D)) (scm_type_export_environment (groups scm C) (scan-data D)) (scm_type_import_environment (groups scm C) (scan-data D)) (scm_type_leaf_environment (groups scm C) (scan-data D)) (scm_tzset (groups scm C) (scan-data T)) (scm_uint2num (groups scm C) (scan-data T)) (scm_ulong2num (groups scm C) (scan-data T)) (scm_ulong_long2num (groups scm C) (scan-data T)) (scm_umask (groups scm C) (scan-data T)) (scm_uname (groups scm C) (scan-data T)) (scm_ungetc (groups scm C) (scan-data T)) (scm_ungets (groups scm C) (scan-data T)) (scm_uniform_array_read_x (groups scm C) (scan-data T)) (scm_uniform_array_write (groups scm C) (scan-data T)) (scm_uniform_element_size (groups scm C) (scan-data T)) (scm_uniform_vector_length (groups scm C) (scan-data T)) (scm_uniform_vector_ref (groups scm C) (scan-data T)) (scm_unlock_mutex (groups scm C) (scan-data T)) (scm_unmask_signals (groups scm C) (scan-data T)) (scm_unmemocar (groups scm C) (scan-data T)) (scm_unmemocopy (groups scm C) (scan-data T)) (scm_unmemoize (groups scm C) (scan-data T)) (scm_unread_char (groups scm C) (scan-data T)) (scm_unread_string (groups scm C) (scan-data T)) (scm_upcase (groups scm C) (scan-data T)) (scm_usage_name (groups scm C) (scan-data D)) (scm_ushort2num (groups scm C) (scan-data T)) (scm_usleep (groups scm C) (scan-data T)) (scm_utime (groups scm C) (scan-data T)) (scm_valid_object_procedure_p (groups scm C) (scan-data T)) (scm_valid_oport_value_p (groups scm C) (scan-data T)) (scm_values (groups scm C) (scan-data T)) (scm_values_vtable (groups scm C) (scan-data B)) (scm_var_random_state (groups scm C) (scan-data B)) (scm_variable_bound_p (groups scm C) (scan-data T)) (scm_variable_p (groups scm C) (scan-data T)) (scm_variable_ref (groups scm C) (scan-data T)) (scm_variable_set_x (groups scm C) (scan-data T)) (scm_vector (groups scm C) (scan-data T)) (scm_vector_equal_p (groups scm C) (scan-data T)) (scm_vector_fill_x (groups scm C) (scan-data T)) (scm_vector_length (groups scm C) (scan-data T)) (scm_vector_move_left_x (groups scm C) (scan-data T)) (scm_vector_move_right_x (groups scm C) (scan-data T)) (scm_vector_p (groups scm C) (scan-data T)) (scm_vector_ref (groups scm C) (scan-data T)) (scm_vector_set_x (groups scm C) (scan-data T)) (scm_vector_to_list (groups scm C) (scan-data T)) (scm_version (groups scm C) (scan-data T)) (scm_void_port (groups scm C) (scan-data T)) (scm_wait_condition_variable (groups scm C) (scan-data T)) (scm_waitpid (groups scm C) (scan-data T)) (scm_weak_key_hash_table_p (groups scm C) (scan-data T)) (scm_weak_value_hash_table_p (groups scm C) (scan-data T)) (scm_weak_vector (groups scm C) (scan-data T)) (scm_weak_vector_p (groups scm C) (scan-data T)) (scm_weak_vectors (groups scm C) (scan-data B)) (scm_weaks_prehistory (groups scm C) (scan-data T)) (scm_with_fluids (groups scm C) (scan-data T)) (scm_with_traps (groups scm C) (scan-data T)) (scm_wrap_component (groups scm C) (scan-data T)) (scm_wrap_object (groups scm C) (scan-data T)) (scm_write (groups scm C) (scan-data T)) (scm_write_char (groups scm C) (scan-data T)) (scm_write_line (groups scm C) (scan-data T)) (scm_write_string_partial (groups scm C) (scan-data T)) (scm_wrong_num_args (groups scm C) (scan-data T)) (scm_wrong_type_arg (groups scm C) (scan-data T)) (scm_wrong_type_arg_msg (groups scm C) (scan-data T)) (scm_yield (groups scm C) (scan-data T)) (scm_your_base (groups scm C) (scan-data D)) (scm_zero_p (groups scm C) (scan-data T)) (search-path (groups Scheme) (scan-data "#")) (seed->random-state (groups Scheme) (scan-data "#random-state>")) (seek (groups Scheme) (scan-data "#")) (select (groups POSIX Scheme) (scan-data "#")) (send (groups Scheme) (scan-data "#")) (sendto (groups Scheme) (scan-data "#")) (servent:aliases (groups Scheme) (scan-data "#")) (servent:name (groups Scheme) (scan-data "#")) (servent:port (groups Scheme) (scan-data "#")) (servent:proto (groups Scheme) (scan-data "#")) (set! (groups Scheme) (scan-data "")) (set-autoloaded! (groups Scheme) (scan-data "#")) (set-batch-mode?! (groups Scheme) (scan-data "#")) (set-car! (groups Scheme) (scan-data "#")) (set-cdr! (groups Scheme) (scan-data "#")) (set-current-error-port (groups Scheme) (scan-data "#")) (set-current-input-port (groups Scheme) (scan-data "#")) (set-current-module (groups Scheme) (scan-data "#")) (set-current-output-port (groups Scheme) (scan-data "#")) (set-defmacro-transformer! (groups Scheme) (scan-data "#")) (set-module-binder! (groups Scheme) (scan-data "#")) (set-module-eval-closure! (groups Scheme) (scan-data "#")) (set-module-kind! (groups Scheme) (scan-data "#")) (set-module-name! (groups Scheme) (scan-data "#")) (set-module-obarray! (groups Scheme) (scan-data "#")) (set-module-observer-id! (groups Scheme) (scan-data "#")) (set-module-observers! (groups Scheme) (scan-data "#")) (set-module-public-interface! (groups Scheme) (scan-data "#")) (set-module-transformer! (groups Scheme) (scan-data "#")) (set-module-uses! (groups Scheme) (scan-data "#")) (set-object-procedure! (groups Scheme) (scan-data "#")) (set-object-properties! (groups Scheme) (scan-data "#")) (set-object-property! (groups Scheme) (scan-data "#")) (set-port-column! (groups Scheme) (scan-data "#")) (set-port-filename! (groups Scheme) (scan-data "#")) (set-port-line! (groups Scheme) (scan-data "#")) (set-port-revealed! (groups POSIX Scheme) (scan-data "#")) (set-procedure-properties! (groups Scheme) (scan-data "#")) (set-procedure-property! (groups Scheme) (scan-data "#")) (set-repl-prompt! (groups Scheme) (scan-data "#")) (set-source-properties! (groups Scheme) (scan-data "#")) (set-source-property! (groups Scheme) (scan-data "#")) (set-struct-vtable-name! (groups Scheme) (scan-data "#")) (set-symbol-property! (groups Scheme) (scan-data "#")) (set-system-module! (groups Scheme) (scan-data "#")) (set-tm:gmtoff (groups POSIX Scheme) (scan-data "#")) (set-tm:hour (groups POSIX Scheme) (scan-data "#")) (set-tm:isdst (groups POSIX Scheme) (scan-data "#")) (set-tm:mday (groups POSIX Scheme) (scan-data "#")) (set-tm:min (groups POSIX Scheme) (scan-data "#")) (set-tm:mon (groups POSIX Scheme) (scan-data "#")) (set-tm:sec (groups POSIX Scheme) (scan-data "#")) (set-tm:wday (groups POSIX Scheme) (scan-data "#")) (set-tm:yday (groups POSIX Scheme) (scan-data "#")) (set-tm:year (groups POSIX Scheme) (scan-data "#")) (set-tm:zone (groups POSIX Scheme) (scan-data "#")) (setegid (groups POSIX Scheme) (scan-data "#")) (setenv (groups POSIX Scheme) (scan-data "#")) (seteuid (groups POSIX Scheme) (scan-data "#")) (setgid (groups POSIX Scheme) (scan-data "#")) (setgr (groups POSIX Scheme) (scan-data "#")) (setgrent (groups POSIX Scheme) (scan-data "#")) (sethost (groups Scheme) (scan-data "#")) (sethostent (groups Scheme) (scan-data "#")) (sethostname (groups POSIX Scheme) (scan-data "#")) (setitimer (groups POSIX Scheme) (scan-data "#")) (setlocale (groups POSIX Scheme) (scan-data "#")) (setnet (groups Scheme) (scan-data "#")) (setnetent (groups Scheme) (scan-data "#")) (setpgid (groups POSIX Scheme) (scan-data "#")) (setpriority (groups POSIX Scheme) (scan-data "#")) (setproto (groups Scheme) (scan-data "#")) (setprotoent (groups Scheme) (scan-data "#")) (setpw (groups POSIX Scheme) (scan-data "#")) (setpwent (groups POSIX Scheme) (scan-data "#")) (setserv (groups Scheme) (scan-data "#")) (setservent (groups Scheme) (scan-data "#")) (setsid (groups POSIX Scheme) (scan-data "#")) (setsockopt (groups Scheme) (scan-data "#")) (setter (groups Scheme) (scan-data "#")) (setuid (groups POSIX Scheme) (scan-data "#")) (setvbuf (groups POSIX Scheme) (scan-data "#")) (shared-array-increments (groups Scheme) (scan-data "#")) (shared-array-offset (groups Scheme) (scan-data "#")) (shared-array-root (groups Scheme) (scan-data "#")) (shutdown (groups Scheme) (scan-data "#")) (sigaction (groups POSIX Scheme) (scan-data "#")) (signal-condition-variable (groups Scheme) (scan-data "#")) (signal-handlers (groups Scheme) (scan-data "")) (simple-format (groups Scheme) (scan-data "#")) (sin (groups Scheme) (scan-data "#")) (single-active-thread? (groups Scheme) (scan-data "#")) (sinh (groups Scheme) (scan-data "#")) (sleep (groups POSIX Scheme) (scan-data "#")) (sloppy-assoc (groups Scheme) (scan-data "#")) (sloppy-assq (groups Scheme) (scan-data "#")) (sloppy-assv (groups Scheme) (scan-data "#")) (sockaddr:addr (groups Scheme) (scan-data "#")) (sockaddr:fam (groups Scheme) (scan-data "#")) (sockaddr:path (groups Scheme) (scan-data "#")) (sockaddr:port (groups Scheme) (scan-data "#")) (socket (groups Scheme) (scan-data "#")) (socketpair (groups Scheme) (scan-data "#")) (sort (groups Scheme) (scan-data "#")) (sort! (groups Scheme) (scan-data "#")) (sort-list (groups Scheme) (scan-data "#")) (sort-list! (groups Scheme) (scan-data "#")) (sorted? (groups Scheme) (scan-data "#")) (source-properties (groups Scheme) (scan-data "#")) (source-property (groups Scheme) (scan-data "#")) (source-whash (groups Scheme) (scan-data "")) (sqrt (groups Scheme) (scan-data "#")) (stable-sort (groups Scheme) (scan-data "#")) (stable-sort! (groups Scheme) (scan-data "#")) (stack-id (groups Scheme) (scan-data "#")) (stack-length (groups Scheme) (scan-data "#")) (stack-ref (groups Scheme) (scan-data "#")) (stack-saved? (groups Scheme) (scan-data "")) (stack? (groups Scheme) (scan-data "#")) (standard-eval-closure (groups Scheme) (scan-data "#")) (standard-interface-eval-closure (groups Scheme) (scan-data "#")) (start-stack (groups Scheme) (scan-data "")) (stat (groups POSIX Scheme) (scan-data "#")) (stat:atime (groups POSIX Scheme) (scan-data "#")) (stat:blksize (groups POSIX Scheme) (scan-data "#")) (stat:blocks (groups POSIX Scheme) (scan-data "#")) (stat:ctime (groups POSIX Scheme) (scan-data "#")) (stat:dev (groups POSIX Scheme) (scan-data "#")) (stat:gid (groups POSIX Scheme) (scan-data "#")) (stat:ino (groups POSIX Scheme) (scan-data "#")) (stat:mode (groups POSIX Scheme) (scan-data "#")) (stat:mtime (groups POSIX Scheme) (scan-data "#")) (stat:nlink (groups POSIX Scheme) (scan-data "#")) (stat:perms (groups POSIX Scheme) (scan-data "#")) (stat:rdev (groups POSIX Scheme) (scan-data "#")) (stat:size (groups POSIX Scheme) (scan-data "#")) (stat:type (groups POSIX Scheme) (scan-data "#")) (stat:uid (groups POSIX Scheme) (scan-data "#")) (status:exit-val (groups POSIX Scheme) (scan-data "#")) (status:stop-sig (groups POSIX Scheme) (scan-data "#")) (status:term-sig (groups POSIX Scheme) (scan-data "#")) (strerror (groups Scheme) (scan-data "#")) (strftime (groups POSIX Scheme) (scan-data "#")) (string (groups Scheme) (scan-data "#")) (string->list (groups Scheme) (scan-data "#list>")) (string->number (groups Scheme) (scan-data "#number>")) (string->symbol (groups Scheme) (scan-data "#symbol>")) (string-append (groups Scheme) (scan-data "#")) (string-capitalize (groups Scheme) (scan-data "#")) (string-capitalize! (groups Scheme) (scan-data "#")) (string-ci->symbol (groups Scheme) (scan-data "#symbol>")) (string-ci<=? (groups Scheme) (scan-data "#")) (string-ci")) (string-ci=? (groups Scheme) (scan-data "#")) (string-ci>=? (groups Scheme) (scan-data "#=?>")) (string-ci>? (groups Scheme) (scan-data "#?>")) (string-copy (groups Scheme) (scan-data "#")) (string-downcase (groups Scheme) (scan-data "#")) (string-downcase! (groups Scheme) (scan-data "#")) (string-fill! (groups Scheme) (scan-data "#")) (string-index (groups Scheme) (scan-data "#")) (string-length (groups Scheme) (scan-data "#")) (string-null? (groups Scheme) (scan-data "#")) (string-ref (groups Scheme) (scan-data "#")) (string-rindex (groups Scheme) (scan-data "#")) (string-set! (groups Scheme) (scan-data "#")) (string-split (groups Scheme) (scan-data "#")) (string-upcase (groups Scheme) (scan-data "#")) (string-upcase! (groups Scheme) (scan-data "#")) (string<=? (groups Scheme) (scan-data "#")) (string")) (string=? (groups Scheme) (scan-data "#")) (string>=? (groups Scheme) (scan-data "#=?>")) (string>? (groups Scheme) (scan-data "#?>")) (string? (groups Scheme) (scan-data "#")) (strptime (groups POSIX Scheme) (scan-data "#")) (struct-layout (groups Scheme) (scan-data "#")) (struct-ref (groups Scheme) (scan-data "#")) (struct-set! (groups Scheme) (scan-data "#")) (struct-vtable (groups Scheme) (scan-data "#")) (struct-vtable-name (groups Scheme) (scan-data "#")) (struct-vtable-tag (groups Scheme) (scan-data "#")) (struct-vtable? (groups Scheme) (scan-data "#")) (struct? (groups Scheme) (scan-data "#")) (substring (groups Scheme) (scan-data "#")) (substring-fill! (groups Scheme) (scan-data "#")) (substring-move! (groups Scheme) (scan-data "#")) (symbol (groups Scheme) (scan-data "#")) (symbol->keyword (groups Scheme) (scan-data "#keyword (symbol)>")) (symbol->string (groups Scheme) (scan-data "#string>")) (symbol-append (groups Scheme) (scan-data "#")) (symbol-fref (groups Scheme) (scan-data "#")) (symbol-fset! (groups Scheme) (scan-data "#")) (symbol-hash (groups Scheme) (scan-data "#")) (symbol-interned? (groups Scheme) (scan-data "#")) (symbol-pref (groups Scheme) (scan-data "#")) (symbol-prefix-proc (groups Scheme) (scan-data "#")) (symbol-property (groups Scheme) (scan-data "#")) (symbol-property-remove! (groups Scheme) (scan-data "#")) (symbol-pset! (groups Scheme) (scan-data "#")) (symbol? (groups Scheme) (scan-data "#")) (symlink (groups POSIX Scheme) (scan-data "#")) (sync (groups POSIX Scheme) (scan-data "#")) (system (groups POSIX Scheme) (scan-data "#")) (system-async (groups Scheme) (scan-data "#")) (system-async-mark (groups Scheme) (scan-data "#")) (system-error-errno (groups Scheme) (scan-data "#")) (tan (groups Scheme) (scan-data "#")) (tanh (groups Scheme) (scan-data "#")) (tcgetpgrp (groups POSIX Scheme) (scan-data "#")) (tcsetpgrp (groups POSIX Scheme) (scan-data "#")) (the-environment (groups Scheme) (scan-data "")) (the-eof-object (groups Scheme) (scan-data "")) (the-last-stack (groups Scheme) (scan-data "")) (the-root-environment (groups Scheme) (scan-data "")) (the-root-module (groups Scheme) (scan-data "")) (the-scm-module (groups Scheme) (scan-data "")) (throw (groups Scheme) (scan-data "#")) (thunk? (groups Scheme) (scan-data "#")) (times (groups POSIX Scheme) (scan-data "#")) (tm:gmtoff (groups POSIX Scheme) (scan-data "#")) (tm:hour (groups POSIX Scheme) (scan-data "#")) (tm:isdst (groups POSIX Scheme) (scan-data "#")) (tm:mday (groups POSIX Scheme) (scan-data "#")) (tm:min (groups POSIX Scheme) (scan-data "#")) (tm:mon (groups POSIX Scheme) (scan-data "#")) (tm:sec (groups POSIX Scheme) (scan-data "#")) (tm:wday (groups POSIX Scheme) (scan-data "#")) (tm:yday (groups POSIX Scheme) (scan-data "#")) (tm:year (groups POSIX Scheme) (scan-data "#")) (tm:zone (groups POSIX Scheme) (scan-data "#")) (tmpnam (groups POSIX Scheme) (scan-data "#")) (tms:clock (groups POSIX Scheme) (scan-data "#")) (tms:cstime (groups POSIX Scheme) (scan-data "#")) (tms:cutime (groups POSIX Scheme) (scan-data "#")) (tms:stime (groups POSIX Scheme) (scan-data "#")) (tms:utime (groups POSIX Scheme) (scan-data "#")) (top-repl (groups Scheme) (scan-data "#")) (transform-usage-lambda (groups Scheme) (scan-data "#")) (transpose-array (groups Scheme) (scan-data "#")) (trap-disable (groups Scheme) (scan-data "#")) (trap-enable (groups Scheme) (scan-data "#")) (trap-set! (groups Scheme) (scan-data "")) (traps (groups Scheme) (scan-data "#")) (truncate (groups Scheme) (scan-data "#")) (truncate-file (groups Scheme) (scan-data "#")) (try-arbiter (groups Scheme) (scan-data "#")) (try-load-module (groups Scheme) (scan-data "#")) (try-module-autoload (groups Scheme) (scan-data "#")) (ttyname (groups POSIX Scheme) (scan-data "#")) (turn-on-debugging (groups Scheme) (scan-data "#")) (tzset (groups POSIX Scheme) (scan-data "#")) (umask (groups POSIX Scheme) (scan-data "#")) (uname (groups POSIX Scheme) (scan-data "#")) (undefine (groups Scheme) (scan-data "")) (uniform-array-read! (groups Scheme) (scan-data "#")) (uniform-array-set1! (groups Scheme) (scan-data "#")) (uniform-array-write (groups Scheme) (scan-data "#")) (uniform-vector-fill! (groups Scheme) (scan-data "#")) (uniform-vector-length (groups Scheme) (scan-data "#")) (uniform-vector-read! (groups Scheme) (scan-data "#")) (uniform-vector-ref (groups Scheme) (scan-data "#")) (uniform-vector-set! (groups Scheme) (scan-data "#")) (uniform-vector-write (groups Scheme) (scan-data "#")) (uniform-vector? (groups Scheme) (scan-data "#")) (unlock-mutex (groups Scheme) (scan-data "#")) (unmask-signals (groups Scheme) (scan-data "#")) (unmemoize (groups Scheme) (scan-data "#")) (unread-char (groups POSIX Scheme) (scan-data "#")) (unread-string (groups POSIX Scheme) (scan-data "#")) (unsetenv (groups Scheme) (scan-data "#")) (unspecified? (groups Scheme) (scan-data "#")) (use-emacs-interface (groups Scheme) (scan-data "")) (use-modules (groups Scheme) (scan-data "")) (use-srfis (groups Scheme) (scan-data "#")) (use-syntax (groups Scheme) (scan-data "")) (using-readline? (groups Scheme) (scan-data "#")) (usleep (groups POSIX Scheme) (scan-data "#")) (utime (groups POSIX Scheme) (scan-data "#")) (utsname:machine (groups POSIX Scheme) (scan-data "#")) (utsname:nodename (groups POSIX Scheme) (scan-data "#")) (utsname:release (groups POSIX Scheme) (scan-data "#")) (utsname:sysname (groups POSIX Scheme) (scan-data "#")) (utsname:version (groups POSIX Scheme) (scan-data "#")) (valid-object-procedure? (groups Scheme) (scan-data "#")) (values (groups Scheme) (scan-data "#")) (variable-bound? (groups Scheme) (scan-data "#")) (variable-ref (groups Scheme) (scan-data "#")) (variable-set! (groups Scheme) (scan-data "#")) (variable? (groups Scheme) (scan-data "#")) (vector (groups Scheme) (scan-data "#")) (vector->list (groups Scheme) (scan-data "#list>")) (vector-fill! (groups Scheme) (scan-data "#")) (vector-length (groups Scheme) (scan-data "#")) (vector-move-left! (groups Scheme) (scan-data "#")) (vector-move-right! (groups Scheme) (scan-data "#")) (vector-ref (groups Scheme) (scan-data "#")) (vector-set! (groups Scheme) (scan-data "#")) (vector? (groups Scheme) (scan-data "#")) (version (groups Scheme) (scan-data "#")) (vtable-index-layout (groups Scheme) (scan-data "")) (vtable-index-printer (groups Scheme) (scan-data "")) (vtable-index-vtable (groups Scheme) (scan-data "")) (vtable-offset-user (groups Scheme) (scan-data "")) (wait-condition-variable (groups Scheme) (scan-data "#")) (waitpid (groups POSIX Scheme) (scan-data "#")) (warn (groups Scheme) (scan-data "#")) (weak-key-hash-table? (groups Scheme) (scan-data "#")) (weak-value-hash-table? (groups Scheme) (scan-data "#")) (weak-vector (groups Scheme) (scan-data "#")) (weak-vector? (groups Scheme) (scan-data "#")) (while (groups Scheme) (scan-data "")) (with-error-to-file (groups Scheme) (scan-data "#")) (with-error-to-port (groups Scheme) (scan-data "#")) (with-error-to-string (groups Scheme) (scan-data "#")) (with-fluids (groups Scheme) (scan-data "")) (with-fluids* (groups Scheme) (scan-data "#")) (with-input-from-file (groups Scheme) (scan-data "#")) (with-input-from-port (groups Scheme) (scan-data "#")) (with-input-from-string (groups Scheme) (scan-data "#")) (with-output-to-file (groups Scheme) (scan-data "#")) (with-output-to-port (groups Scheme) (scan-data "#")) (with-output-to-string (groups Scheme) (scan-data "#")) (with-traps (groups Scheme) (scan-data "#")) (write (groups Scheme) (scan-data "#")) (write-char (groups Scheme) (scan-data "#")) (xformer-table (groups Scheme) (scan-data "")) (yield (groups Scheme) (scan-data "#")) (zero? (groups Scheme) (scan-data "#")) ) ;; end of interface ) ;; eof guile-1.8-1.8.8+1.orig/doc/guile.1000066400000000000000000000056251155472604000162040ustar00rootroot00000000000000.\" Written by Robert Merkel (rgmerk@mira.net) .\" augmented by Rob Browning .\" Process this file with .\" groff -man -Tascii foo.1 .\" .TH GUILE 1 .SH NAME guile \- a Scheme interpreter .SH SYNOPSIS .B guile [-q] [-ds] [--help] [--version] [--emacs] [--debug] .B [-l FILE] [-e FUNCTION] [\] .B [-c EXPR] [-s SCRIPT] [--] .SH DESCRIPTION GNU Guile is an interpreter for the Scheme programming language. It implements R5RS, providing additional features necessary for real-world use. It is extremely simple to embed guile into a C program, calling C from Scheme and Scheme from C. Guile's design makes it very suitable for use as an "extension" or "glue" language, but it also works well as a stand-alone scheme development environment. The .B guile executable itself provides a stand-alone interpreter for scheme programs, for either interactive use or executing scripts. This manpage provides only brief instruction in invoking .B guile from the command line. Please consult the guile info documentation (type .B info guile at a command prompt) for more information. There is also a tutorial .B (info guile-tut) available. .SH OPTIONS .IP -l FILE Load scheme source code from file. .IP -e FUNCTION After reading script, apply FUNCTION to command-line arguments .IP -ds do -s SCRIPT at this point (note that this argument must be used in conjuction with -s) .IP --help Describe command line options and exit .IP --debug Start guile with debugging evaluator and backtraces enabled (useful for debugging guile scripts) .IP --version Display guile version and exit. .IP --emacs Enable emacs protocol for use from within emacs (experimental) .IP -- Stop argument processing, start guile in interactive mode. .IP -c EXPR Stop argument processing, evaluate EXPR as a scheme expression. .IP -s SCRIPT-FILE Load Scheme source from SCRIPT-FILE and execute as a script. .SH ENVIRONMENT .\".TP \w'MANROFFSEQ\ \ 'u .TP .B GUILE_LOAD_PATH If .RB $ GUILE_LOAD_PATH is set, its value is used to agument the path to search for scheme files when loading. It should be a colon separated list of directories which will be prepended to the default %load-path. .SH FILES .I ~/.guile is a guile script that is executed before any other processing occurs. For example, the following .guile activates guile's readline interface: .RS 4 (use-modules (ice-9 readline)) .RS 0 (activate-readline) .SH "SEE ALSO" The full documentation for guile is maintained as a Texinfo manual. If the info and guile programs are properly installed at your site, the command .IP .B info guile .PP should give you access to the complete manual. http://www.schemers.org provides a general introduction to the Scheme language. .SH AUTHORS Robert Merkel wrote this manpage. Rob Browning has added to it. .B guile is GNU software. Guile is originally based on Aubrey Jaffer's SCM interpreter, and is the work of many individuals. guile-1.8-1.8.8+1.orig/doc/hacks.el000066400000000000000000000007551155472604000164270ustar00rootroot00000000000000;;;; hacks.el --- a few functions to help me work on the manual ;;;; Jim Blandy --- October 1998 (defun jh-exemplify-region (start end) (interactive "r") (save-excursion (save-restriction (narrow-to-region start end) ;; Texinfo doesn't handle tabs well. (untabify (point-min) (point-max)) ;; Quote any characters special to texinfo. (goto-char (point-min)) (while (re-search-forward "[{}@]" nil t) (replace-match "@\\&"))))) guile-1.8-1.8.8+1.orig/doc/maint/000077500000000000000000000000001155472604000161155ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/doc/maint/ChangeLog-2008000066400000000000000000000044131155472604000202600ustar00rootroot000000000000002004-08-25 Marius Vollmer * docstring.el (docstring-process-alist): Consider entries in reverse order. That puts them in new-docstrings.texi in the same order as in the C source. 2004-08-23 Marius Vollmer * docstring.el: Replaced all "@c module" markers with "@c module-for-docstring", making it less likely to collide with a real commentary. 2002-10-19 Neil Jerram * guile.texi: Replaced by regenerated libguile version. 2002-07-10 Gary Houston * docstring.el: optional 2nd environment variable to locate built files. 2002-07-09 Gary Houston * docstring.el: defined caddr, used in several places but missing for some reason. 2002-04-02 Thien-Thi Nguyen * doctring.el: List commands in commentary; nfc. 2002-03-15 Neil Jerram * guile.texi: Replaced by regenerated libguile version. 2002-03-12 Neil Jerram * guile.texi: Replaced by regenerated libguile version. 2002-03-08 Neil Jerram * docstring.el (docstring-libguile-directory, docstring-display-location, docstring-show-source): New. 2001-11-16 Neil Jerram * guile.texi: Replaced by regenerated libguile version. * docstring.el (make-module-description-list): Exclude @deffn's with category {C Function}. (docstring-process-alist): Bind key "d" to docstring-ediff-this-line in the docstring output buffer. 2001-11-13 Neil Jerram * guile.texi: Replaced by libguile version (after automatically updating docstrings in the reference manual). 2001-11-07 Neil Jerram * guile.texi: Replaced by libguile version (after automatically updating docstrings in the reference manual). * docstring.el (docstring-manual-directory): Added "/ref" to end. (docstring-manual-files): Now calculated automatically, since by definition all the .texi files in doc/ref are reference manual files. 2001-04-03 Martin Grabmueller * guile.texi: Automated docstring merging. 2001-03-23 Neil Jerram * ChangeLog, README, docstring.el, guile.texi: New files. guile-1.8-1.8.8+1.orig/doc/maint/README000066400000000000000000000024131155472604000167750ustar00rootroot00000000000000README for guile-core/doc/maint -*- text -*- The files in this directory are used by the maintainers to automate the process of updating the Guile reference manual when the docstrings in the libguile C source change. - ChangeLog is the change log for files in this directory. - README is this file. - docstring.el is a helpful Emacs Lisp library (see source for customization). The two key entry points are: `docstring-process-module' and `docstring-ediff-this-line'. - guile.texi is a snapshot of the built file libguile/guile.texi, copied last time the reference manual was determined to be in sync with the libguile source. docstring.el requires the setting of an environment variable, e.g., export GUILE_MAINTAINER_GUILE_CORE_DIR=$HOME/guile/guile-core If the build directory differs from the source directory, an additional variable is required: export GUILE_MAINTAINER_BUILD_CORE_DIR=$HOME/guile/guile-core-build If you've just fixed a docstring in, say, ../libguile/strop.c, do in emacs: M-x load-file RET .../doc/maint/docstring.el RET M-x docstring-process-module RET (guile) RET Save all modified .texi files and copy the current ../libguile/guile.texi to ./guile.texi, then commit. See elisp var `docstring-snarfed-roots'. guile-1.8-1.8.8+1.orig/doc/maint/docstring.el000066400000000000000000000607651155472604000204510ustar00rootroot00000000000000;;; docstring.el --- utilities for Guile docstring maintenance ;;; ;;; Copyright (C) 2001, 2004 Neil Jerram ;;; ;;; This file is not part of GNU Emacs, but the same permissions apply. ;;; ;;; GNU Emacs is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; ;;; GNU Emacs is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Emacs; see the file COPYING. If not, write to the ;;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; The basic premise of these utilities is that - at least in the ;; short term - we can get a lot of reference manual mileage by ;; co-opting the docstrings that are snarfed automatically from ;; Guile's C and Scheme source code. But this leads to problems of ;; synchronization... How do you track when a docstring has been ;; updated in the source and so needs updating in the reference ;; manual. What if a procedure is removed from the Guile source? And ;; so on. To complicate matters, the exact snarfed docstring text ;; will probably need to be modified so that it fits into the flow of ;; the manual section in which it appears. Can we design solutions to ;; synchronization problems that continue to work even when the manual ;; text has been enhanced in this way? ;; ;; This file implements an approach to this problem that I have found ;; useful. It involves keeping track of three copies of each ;; docstring: ;; ;; "MANUAL" = the docstring as it appears in the reference manual. ;; ;; "SNARFED" = the docstring as snarfed from the current C or Scheme ;; source. ;; ;; "TRACKING" = the docstring as it appears in a tracking file whose ;; purpose is to record the most recent snarfed docstrings ;; that are known to be in sync with the reference manual. ;; ;; The approaches are as follows. ;; ;; 1. Comparison of MANUAL-DOC, SOURCE-DOC and TRACK-DOC, to produce a ;; summary output buffer in which keystrokes are defined to bring up ;; detailed comparisons. ;; ;; 2. Comparison of MANUAL-DOC, SOURCE-DOC and TRACK-DOC using Ediff. ;; ;; Here is a brief list of commands available (via "M-x COMMAND"): ;; ;; docstring-process-current-buffer ;; docstring-process-current-region BEG END ;; docstring-process-module MODULE ;; docstring-ediff-this-line ;; docstring-show-source (defvar guile-core-dir (or (getenv "GUILE_MAINTAINER_GUILE_CORE_DIR") (error "GUILE_MAINTAINER_GUILE_CORE_DIR not set")) "*Full path of guile-core source directory.") (defvar guile-build-dir (or (getenv "GUILE_MAINTAINER_BUILD_CORE_DIR") guile-core-dir) "*Full path of guile-core build directory. Defaults to guile-core-dir.") (defvar docstring-manual-directory (expand-file-name "doc/ref" guile-core-dir) "*The directory containing the Texinfo source for the Guile reference manual.") (defvar docstring-tracking-root (expand-file-name "doc/maint" guile-core-dir) "*Root directory for docstring tracking files. The tracking file for module (a b c) is expected to be in the file /a/b/c.texi.") (defvar docstring-snarfed-roots (mapcar #'(lambda (frag) (expand-file-name frag guile-build-dir)) '("libguile" "ice-9" "oop")) "*List of possible root directories for snarfed docstring files. For each entry in this list, the snarfed docstring file for module (a b c) is looked for in the file /a/b/c.texi.") (defvar docstring-manual-files (directory-files docstring-manual-directory nil "\\.texi$" t) "List of Texinfo source files that comprise the Guile reference manual.") (defvar docstring-new-docstrings-file "new-docstrings.texi" "The name of a file in the Guile reference manual source directory to which new docstrings should be added.") ;; Apply FN in turn to each element in the list CANDIDATES until the ;; first application that returns non-nil. (defun or-map (fn candidates args) (let ((result nil)) (while candidates (setq result (apply fn (car candidates) args)) (if result (setq result (cons (car candidates) result) candidates nil) (setq candidates (cdr candidates)))) result)) ;; Return t if the current buffer position is in the scope of the ;; specified MODULE, as determined by "@c module-for-docstring ..." comments in the ;; buffer. DEFAULT-OK specifies the return value in the case that ;; there are no preceding module comments at all. (defun docstring-in-module (module default-ok) (save-excursion (if (re-search-backward "^@c module-for-docstring " nil t) (progn (search-forward "@c module-for-docstring ") (equal module (read (current-buffer)))) default-ok))) ;; Find a docstring in the specified FILE-NAME for the item in module ;; MODULE and with description DESCRIPTION. MODULE should be a list ;; of symbols, Guile-style, for example: '(ice-9 session). ;; DESCRIPTION should be the string that is expected after the @deffn, ;; for example "primitive acons" or "syntax let*". (defun find-docstring (file-name module description) (and (file-exists-p file-name) (let ((buf (find-file-noselect file-name)) (deffn-regexp (concat "^@deffnx? " (regexp-quote description) "[ \n\t]")) found result) (save-excursion (set-buffer buf) (goto-char (point-min)) (while (and (not found) (re-search-forward deffn-regexp nil t)) (save-excursion (goto-char (match-beginning 0)) (beginning-of-line) (if (docstring-in-module module t) (setq found t)))) (if found (setq result (list (current-buffer) (progn (re-search-backward "^@deffn ") (beginning-of-line) (point)) (progn (re-search-forward "^@end deffn") (forward-line 1) (point)))))) result))) ;; Find the reference manual version of the specified docstring. ;; MODULE and DESCRIPTION specify the docstring as per ;; `find-docstring'. The set of files that `find-manual-docstring' ;; searches is determined by the value of the `docstring-manual-files' ;; variable. (defun find-manual-docstring (module description) (let* ((result (or-map 'find-docstring (mapcar (function (lambda (file-name) (concat docstring-manual-directory "/" file-name))) (cons docstring-new-docstrings-file docstring-manual-files)) (list module description))) (matched-file-name (and (cdr result) (file-name-nondirectory (car result))))) (if matched-file-name (setq docstring-manual-files (cons matched-file-name (delete matched-file-name docstring-manual-files)))) (cdr result))) ;; Convert MODULE to a directory subpath. (defun module-to-path (module) (mapconcat (function (lambda (component) (symbol-name component))) module "/")) ;; Find the current snarfed version of the specified docstring. ;; MODULE and DESCRIPTION specify the docstring as per ;; `find-docstring'. The file that `find-snarfed-docstring' looks in ;; is automatically generated from MODULE. (defun find-snarfed-docstring (module description) (let ((modpath (module-to-path module))) (cdr (or-map (function (lambda (root) (find-docstring (concat root "/" modpath ".texi") module description))) docstring-snarfed-roots nil)))) ;; Find the tracking version of the specified docstring. MODULE and ;; DESCRIPTION specify the docstring as per `find-docstring'. The ;; file that `find-tracking-docstring' looks in is automatically ;; generated from MODULE. (defun find-tracking-docstring (module description) (find-docstring (concat docstring-tracking-root "/" (module-to-path module) ".texi") module description)) ;; Extract an alist of modules and descriptions from the current ;; buffer. (defun make-module-description-list () (let ((alist nil) (module '(guile))) (save-excursion (goto-char (point-min)) (while (re-search-forward "^\\(@c module-for-docstring \\|@deffnx? \\({[^}]+}\\|[^ ]+\\) \\([^ \n]+\\)\\)" nil t) (let ((matched (buffer-substring (match-beginning 1) (match-end 1)))) (if (string-equal matched "@c module-for-docstring ") (setq module (read (current-buffer))) (let ((type (buffer-substring (match-beginning 2) (match-end 2)))) (if (string-equal type "{C Function}") nil (setq matched (concat type " " (buffer-substring (match-beginning 3) (match-end 3)))) (message "Found docstring: %S: %s" module matched) (let ((descriptions (assoc module alist))) (setq alist (cons (cons module (cons matched (cdr-safe descriptions))) (if descriptions (delete descriptions alist) alist)))))))))) alist)) ;; missing in some environments? (defun caddr (list) (nth 2 list)) ;; Return the docstring from the specified LOCATION. LOCATION is a ;; list of three elements: buffer, start position and end position. (defun location-to-docstring (location) (and location (save-excursion (set-buffer (car location)) (buffer-substring (cadr location) (caddr location))))) ;; Perform a comparison of the specified docstring. MODULE and ;; DESCRIPTION are as per usual. (defun docstring-compare (module description) (let* ((manual-location (find-manual-docstring module description)) (snarf-location (find-snarfed-docstring module description)) (track-location (find-tracking-docstring module description)) (manual-docstring (location-to-docstring manual-location)) (snarf-docstring (location-to-docstring snarf-location)) (track-docstring (location-to-docstring track-location)) action issue) ;; Decide what to do. (cond ((null snarf-location) (setq action nil issue (if manual-location 'consider-removal nil))) ((null manual-location) (setq action 'add-to-manual issue nil)) ((null track-location) (setq action nil issue (if (string-equal manual-docstring snarf-docstring) nil 'check-needed))) ((string-equal track-docstring snarf-docstring) (setq action nil issue nil)) ((string-equal track-docstring manual-docstring) (setq action 'auto-update-manual issue nil)) (t (setq action nil issue 'update-needed))) ;; Return a pair indicating any automatic action that can be ;; taken, and any issue for resolution. (cons action issue))) ;; Add the specified docstring to the manual. (defun docstring-add-to-manual (module description) (let ((buf (find-file-noselect (concat docstring-manual-directory "/" docstring-new-docstrings-file)))) (save-excursion (set-buffer buf) (goto-char (point-max)) (or (docstring-in-module module nil) (insert "\n@c module-for-docstring " (prin1-to-string module) "\n")) (insert "\n" (location-to-docstring (find-snarfed-docstring module description)))))) ;; Auto-update the specified docstring in the manual. (defun docstring-auto-update-manual (module description) (let ((manual-location (find-manual-docstring module description)) (track-location (find-tracking-docstring module description))) (save-excursion (set-buffer (car manual-location)) (goto-char (cadr manual-location)) (delete-region (cadr manual-location) (caddr manual-location)) (insert (location-to-docstring (find-snarfed-docstring module description)))))) ;; Process an alist of modules and descriptions, and produce a summary ;; buffer describing actions taken and issues to be resolved. (defun docstring-process-alist (alist) (let (check-needed-list update-needed-list consider-removal-list added-to-manual-list auto-updated-manual-list) (mapcar (function (lambda (module-list) (let ((module (car module-list))) (message "Module: %S" module) (mapcar (function (lambda (description) (message "Comparing docstring: %S: %s" module description) (let* ((ai (docstring-compare module description)) (action (car ai)) (issue (cdr ai))) (cond ((eq action 'add-to-manual) (docstring-add-to-manual module description) (setq added-to-manual-list (cons (cons module description) added-to-manual-list))) ((eq action 'auto-update-manual) (docstring-auto-update-manual module description) (setq auto-updated-manual-list (cons (cons module description) auto-updated-manual-list)))) (cond ((eq issue 'check-needed) (setq check-needed-list (cons (cons module description) check-needed-list))) ((eq issue 'update-needed) (setq update-needed-list (cons (cons module description) update-needed-list))) ((eq issue 'consider-removal) (setq consider-removal-list (cons (cons module description) consider-removal-list))))))) (reverse (cdr module-list)))))) alist) ;; Prepare a buffer describing the results. (set-buffer (get-buffer-create "*Docstring Results*")) (erase-buffer) (insert " The following items have been automatically added to the manual in file `" docstring-manual-directory "/" docstring-new-docstrings-file "'.\n\n") (if added-to-manual-list (mapcar (function (lambda (moddesc) (insert (prin1-to-string (car moddesc)) ": " (cdr moddesc) "\n"))) added-to-manual-list) (insert "(none)\n")) (insert " The following items have been automatically updated in the manual.\n\n") (if auto-updated-manual-list (mapcar (function (lambda (moddesc) (insert (prin1-to-string (car moddesc)) ": " (cdr moddesc) "\n"))) auto-updated-manual-list) (insert "(none)\n")) (insert " The following items are already documented in the manual but are not mentioned in the reference copy of the snarfed docstrings file. You should check that the manual documentation matches the docstring in the current snarfed docstrings file.\n\n") (if check-needed-list (mapcar (function (lambda (moddesc) (insert (prin1-to-string (car moddesc)) ": " (cdr moddesc) "\n"))) check-needed-list) (insert "(none)\n")) (insert " The following items have manual documentation that is different from the docstring in the reference copy of the snarfed docstrings file, and the snarfed docstring has changed. You need to update the manual documentation by hand with reference to the snarfed docstring changes.\n\n") (if update-needed-list (mapcar (function (lambda (moddesc) (insert (prin1-to-string (car moddesc)) ": " (cdr moddesc) "\n"))) update-needed-list) (insert "(none)\n")) (insert " The following items are documented in the manual but are no longer present in the snarfed docstrings file. You should consider whether the existing manual documentation is still pertinent. If it is, its docstring module comment may need updating, to connect it with a new snarfed docstring file.\n\n") (if consider-removal-list (mapcar (function (lambda (moddesc) (insert (prin1-to-string (car moddesc)) ": " (cdr moddesc) "\n"))) consider-removal-list) (insert "(none)\n")) (insert "\n") (goto-char (point-min)) (local-set-key "d" 'docstring-ediff-this-line) ;; Popup the issues buffer. (let ((pop-up-frames t)) (set-window-point (display-buffer (current-buffer)) (point-min))))) (defun docstring-process-current-buffer () (interactive) (docstring-process-alist (make-module-description-list))) (defun docstring-process-current-region (beg end) (interactive "r") (narrow-to-region beg end) (unwind-protect (save-excursion (docstring-process-alist (make-module-description-list))) (widen))) (defun docstring-process-module (module) (interactive "xModule: ") (let ((modpath (module-to-path module)) (mdlist nil)) (mapcar (function (lambda (root) (let ((fn (concat root "/" modpath ".texi"))) (if (file-exists-p fn) (save-excursion (find-file fn) (message "Getting docstring list from %s" fn) (setq mdlist (append mdlist (make-module-description-list)))))))) docstring-snarfed-roots) (docstring-process-alist mdlist))) (defun docstring-ediff-this-line () (interactive) (let (module description) (save-excursion (beginning-of-line) (setq module (read (current-buffer))) (forward-char 2) (setq description (buffer-substring (point) (progn (end-of-line) (point))))) (message "Ediff docstring: %S: %s" module description) (let ((track-location (or (find-tracking-docstring module description) (docstring-temp-location "No docstring in tracking file"))) (snarf-location (or (find-snarfed-docstring module description) (docstring-temp-location "No docstring in snarfed file"))) (manual-location (or (find-manual-docstring module description) (docstring-temp-location "No docstring in manual")))) (setq docstring-ediff-buffers (list (car track-location) (car snarf-location) (car manual-location))) (docstring-narrow-to-location track-location) (docstring-narrow-to-location snarf-location) (docstring-narrow-to-location manual-location) (add-hook 'ediff-quit-hook 'docstring-widen-ediff-buffers) (ediff-buffers3 (nth 0 docstring-ediff-buffers) (nth 1 docstring-ediff-buffers) (nth 2 docstring-ediff-buffers))))) (defun docstring-narrow-to-location (location) (save-excursion (set-buffer (car location)) (narrow-to-region (cadr location) (caddr location)))) (defun docstring-temp-location (str) (let ((buf (generate-new-buffer "*Docstring Temp*"))) (save-excursion (set-buffer buf) (erase-buffer) (insert str "\n") (list buf (point-min) (point-max))))) (require 'ediff) (defvar docstring-ediff-buffers '()) (defun docstring-widen-ediff-buffers () (remove-hook 'ediff-quit-hook 'docstring-widen-ediff-buffers) (save-excursion (mapcar (function (lambda (buffer) (set-buffer buffer) (widen))) docstring-ediff-buffers))) ;;; Tests: ;(find-docstring "/home/neil/Guile/cvs/guile-core/doc/maint/guile.texi" nil "primitive sloppy-assq") ;(find-manual-docstring '(guile) "primitive sloppy-assq") ;(find-tracking-docstring '(guile) "primitive sloppy-assq") ;(find-snarfed-docstring '(guile) "primitive sloppy-assq") (defvar docstring-libguile-directory (expand-file-name "libguile" guile-core-dir) "*The directory containing the C source for libguile.") (defvar docstring-libguile-build-directory (expand-file-name "libguile" guile-build-dir) "*The directory containing the libguile build directory.") (defun docstring-display-location (file line) (let ((buffer (find-file-noselect (expand-file-name file docstring-libguile-directory)))) (if buffer (let* ((window (or (get-buffer-window buffer) (display-buffer buffer))) (pos (save-excursion (set-buffer buffer) (goto-line line) (point)))) (set-window-point window pos))))) (defun docstring-show-source () "Given that point is sitting in a docstring in one of the Texinfo source files for the Guile manual, and that that docstring may be snarfed automatically from a libguile C file, determine whether the docstring is from libguile and, if it is, display the relevant C file at the line from which the docstring was snarfed. Why? When updating snarfed docstrings, you should usually edit the C source rather than the Texinfo source, so that your updates benefit Guile's online help as well. This function locates the C source for a docstring so that it is easy for you to do this." (interactive) (let* ((deffn-line (save-excursion (end-of-line) (or (re-search-backward "^@deffn " nil t) (error "No docstring here!")) (buffer-substring (point) (progn (end-of-line) (point))))) (guile-texi-file (expand-file-name "guile.texi" docstring-libguile-build-directory)) (source-location (save-excursion (set-buffer (find-file-noselect guile-texi-file)) (save-excursion (goto-char (point-min)) (or (re-search-forward (concat "^" (regexp-quote deffn-line) "$") nil t) (error "Docstring not from libguile")) (forward-line -1) (if (looking-at "^@c snarfed from \\([^:]+\\):\\([0-9]+\\)$") (cons (match-string 1) (string-to-int (match-string 2))) (error "Corrupt docstring entry in guile.texi")))))) (docstring-display-location (car source-location) (cdr source-location)))) (provide 'docstring) ;;; docstring.el ends here guile-1.8-1.8.8+1.orig/doc/mbapi.texi000066400000000000000000001320361155472604000167750ustar00rootroot00000000000000\input texinfo @setfilename mbapi.info @settitle Multibyte API @setchapternewpage off @c Open issues: @c What's the best way to report errors? Should functions return a @c magic value, according to C tradition, or should they signal a @c Guile exception? @c @node Working With Multibyte Strings in C @chapter Working With Multibyte Strings in C Guile allows strings to contain characters drawn from a wide variety of languages, including many Asian, Eastern European, and Middle Eastern languages, in a uniform and unrestricted way. The string representation normally used in C code --- an array of @sc{ASCII} characters --- is not sufficient for Guile strings, since they may contain characters not present in @sc{ASCII}. Instead, Guile uses a very large character set, and encodes each character as a sequence of one or more bytes. We call this variable-width encoding a @dfn{multibyte} encoding. Guile uses this single encoding internally for all strings, symbol names, error messages, etc., and performs appropriate conversions upon input and output. The use of this variable-width encoding is almost invisible to Scheme code. Strings are still indexed by character number, not by byte offset; @code{string-length} still returns the length of a string in characters, not in bytes. @code{string-ref} and @code{string-set!} are no longer guaranteed to be constant-time operations, but Guile uses various strategies to reduce the impact of this change. However, the encoding is visible via Guile's C interface, which gives the user direct access to a string's bytes. This chapter explains how to work with Guile multibyte text in C code. Since variable-width encodings are clumsier to work with than simple fixed-width encodings, Guile provides a set of standard macros and functions for manipulating multibyte text to make the job easier. Furthermore, Guile makes some promises about the encoding which you can use in writing your own text processing code. While we discuss guaranteed properties of Guile's encoding, and provide functions to operate on its character set, we do not actually specify either the character set or encoding here. This is because we expect both of them to change in the future: currently, Guile uses the same encoding as GNU Emacs 20.4, but we hope to change Guile (and GNU Emacs as well) to use Unicode and UTF-8, with some extensions. This will make it more comfortable to use Guile with other systems which use UTF-8, like the GTk user interface toolkit. @menu * Multibyte String Terminology:: * Promised Properties of the Guile Multibyte Encoding:: * Functions for Operating on Multibyte Text:: * Multibyte Text Processing Errors:: * Why Guile Does Not Use a Fixed-Width Encoding:: @end menu @node Multibyte String Terminology, Promised Properties of the Guile Multibyte Encoding, Working With Multibyte Strings in C, Working With Multibyte Strings in C @section Multibyte String Terminology In the descriptions which follow, we make the following definitions: @table @dfn @item byte A @dfn{byte} is a number between 0 and 255. It has no inherent textual interpretation. So 65 is a byte, not a character. @item character A @dfn{character} is a unit of text. It has no inherent numeric value. @samp{A} and @samp{.} are characters, not bytes. (This is different from the C language's definition of @dfn{character}; in this chapter, we will always use a phrase like ``the C language's @code{char} type'' when that's what we mean.) @item character set A @dfn{character set} is an invertible mapping between numbers and a given set of characters. @sc{ASCII} is a character set assigning characters to the numbers 0 through 127. It maps @samp{A} onto the number 65, and @samp{.} onto 46. Note that a character set maps characters onto numbers, @emph{not necessarily} onto bytes. For example, the Unicode character set maps the Greek lower-case @samp{alpha} character onto the number 945, which is not a byte. (This is what Internet standards would call a "coding character set".) @item encoding An encoding maps numbers onto sequences of bytes. For example, the UTF-8 encoding, defined in the Unicode Standard, would map the number 945 onto the sequence of bytes @samp{206 177}. When using the @sc{ASCII} character set, every number assigned also happens to be a byte, so there is an obvious trivial encoding for @sc{ASCII} in bytes. (This is what Internet standards would call a "character encoding scheme".) @end table Thus, to turn a character into a sequence of bytes, you need a character set to assign a number to that character, and then an encoding to turn that number into a sequence of bytes. Likewise, to interpret a sequence of bytes as a sequence of characters, you use an encoding to extract a sequence of numbers from the bytes, and then a character set to turn the numbers into characters. Errors can occur while carrying out either of these processes. For example, under a particular encoding, a given string of bytes might not correspond to any number. For example, the byte sequence @samp{128 128} is not a valid encoding of any number under UTF-8. Having carefully defined our terminology, we will now abuse it. We will sometimes use the word @dfn{character} to refer to the number assigned to a character by a character set, in contexts where it's obvious we mean a number. Sometimes there is a close association between a particular encoding and a particular character set. Thus, we may sometimes refer to the character set and encoding together as an @dfn{encoding}. @node Promised Properties of the Guile Multibyte Encoding, Functions for Operating on Multibyte Text, Multibyte String Terminology, Working With Multibyte Strings in C @section Promised Properties of the Guile Multibyte Encoding Internally, Guile uses a single encoding for all text --- symbols, strings, error messages, etc. Here we list a number of helpful properties of Guile's encoding. It is correct to write code which assumes these properties; code which uses these assumptions will be portable to all future versions of Guile, as far as we know. @b{Every @sc{ASCII} character is encoded as a single byte from 0 to 127, in the obvious way.} This means that a standard C string containing only @sc{ASCII} characters is a valid Guile string (except for the terminator; Guile strings store the length explicitly, so they can contain null characters). @b{The encodings of non-@sc{ASCII} characters use only bytes between 128 and 255.} That is, when we turn a non-@sc{ASCII} character into a series of bytes, none of those bytes can ever be mistaken for the encoding of an @sc{ASCII} character. This means that you can search a Guile string for an @sc{ASCII} character using the standard @code{memchr} library function. By extension, you can search for an @sc{ASCII} substring in a Guile string using a traditional substring search algorithm --- you needn't add special checks to verify encoding boundaries, etc. @b{No character encoding is a subsequence of any other character encoding.} (This is just a stronger version of the previous promise.) This means that you can search for occurrences of one Guile string within another Guile string just as if they were raw byte strings. You can use the stock @code{memmem} function (provided on GNU systems, at least) for such searches. If you don't need the ability to represent null characters in your text, you can still use null-termination for strings, and use the traditional string-handling functions like @code{strlen}, @code{strstr}, and @code{strcat}. @b{You can always determine the full length of a character's encoding from its first byte.} Guile provides the macro @code{scm_mb_len} which computes the encoding's length from its first byte. Given the first rule, you can see that @code{scm_mb_len (@var{b})}, for any @code{0 <= @var{b} <= 127}, returns 1. @b{Given an arbitrary byte position in a Guile string, you can always find the beginning and end of the character containing that byte without scanning too far in either direction.} This means that, if you are sure a byte sequence is a valid encoding of a character sequence, you can find character boundaries without keeping track of the beginning and ending of the overall string. This promise relies on the fact that, in addition to storing the string's length explicitly, Guile always either terminates the string's storage with a zero byte, or shares it with another string which is terminated this way. @node Functions for Operating on Multibyte Text, Multibyte Text Processing Errors, Promised Properties of the Guile Multibyte Encoding, Working With Multibyte Strings in C @section Functions for Operating on Multibyte Text Guile provides a variety of functions, variables, and types for working with multibyte text. @menu * Basic Multibyte Character Processing:: * Finding Character Encoding Boundaries:: * Multibyte String Functions:: * Exchanging Guile Text With the Outside World in C:: * Implementing Your Own Text Conversions:: @end menu @node Basic Multibyte Character Processing, Finding Character Encoding Boundaries, Functions for Operating on Multibyte Text, Functions for Operating on Multibyte Text @subsection Basic Multibyte Character Processing Here are the essential types and functions for working with Guile text. Guile uses the C type @code{unsigned char *} to refer to text encoded with Guile's encoding. Note that any operation marked here as a ``Libguile Macro'' might evaluate its argument multiple times. @deftp {Libguile Type} scm_char_t This is a signed integral type large enough to hold any character in Guile's character set. All character numbers are positive. @end deftp @deftypefn {Libguile Macro} scm_char_t scm_mb_get (const unsigned char *@var{p}) Return the character whose encoding starts at @var{p}. If @var{p} does not point at a valid character encoding, the behavior is undefined. @end deftypefn @deftypefn {Libguile Macro} int scm_mb_put (unsigned char *@var{p}, scm_char_t @var{c}) Place the encoded form of the Guile character @var{c} at @var{p}, and return its length in bytes. If @var{c} is not a Guile character, the behavior is undefined. @end deftypefn @deftypevr {Libguile Constant} int scm_mb_max_len The maximum length of any character's encoding, in bytes. You may assume this is relatively small --- less than a dozen or so. @end deftypevr @deftypefn {Libguile Macro} int scm_mb_len (unsigned char @var{b}) If @var{b} is the first byte of a character's encoding, return the full length of the character's encoding, in bytes. If @var{b} is not a valid leading byte, the behavior is undefined. @end deftypefn @deftypefn {Libguile Macro} int scm_mb_char_len (scm_char_t @var{c}) Return the length of the encoding of the character @var{c}, in bytes. If @var{c} is not a valid Guile character, the behavior is undefined. @end deftypefn @deftypefn {Libguile Function} scm_char_t scm_mb_get_func (const unsigned char *@var{p}) @deftypefnx {Libguile Function} int scm_mb_put_func (unsigned char *@var{p}, scm_char_t @var{c}) @deftypefnx {Libguile Function} int scm_mb_len_func (unsigned char @var{b}) @deftypefnx {Libguile Function} int scm_mb_char_len_func (scm_char_t @var{c}) These are functions identical to the corresponding macros. You can use them in situations where the overhead of a function call is acceptable, and the cleaner semantics of function application are desireable. @end deftypefn @node Finding Character Encoding Boundaries, Multibyte String Functions, Basic Multibyte Character Processing, Functions for Operating on Multibyte Text @subsection Finding Character Encoding Boundaries These are functions for finding the boundaries between characters in multibyte text. Note that any operation marked here as a ``Libguile Macro'' might evaluate its argument multiple times, unless the definition promises otherwise. @deftypefn {Libguile Macro} int scm_mb_boundary_p (const unsigned char *@var{p}) Return non-zero iff @var{p} points to the start of a character in multibyte text. This macro will evaluate its argument only once. @end deftypefn @deftypefn {Libguile Function} {const unsigned char *} scm_mb_floor (const unsigned char *@var{p}) ``Round'' @var{p} to the previous character boundary. That is, if @var{p} points to the middle of the encoding of a Guile character, return a pointer to the first byte of the encoding. If @var{p} points to the start of the encoding of a Guile character, return @var{p} unchanged. @end deftypefn @deftypefn {libguile Function} {const unsigned char *} scm_mb_ceiling (const unsigned char *@var{p}) ``Round'' @var{p} to the next character boundary. That is, if @var{p} points to the middle of the encoding of a Guile character, return a pointer to the first byte of the encoding of the next character. If @var{p} points to the start of the encoding of a Guile character, return @var{p} unchanged. @end deftypefn Note that it is usually not friendly for functions to silently correct byte offsets that point into the middle of a character's encoding. Such offsets almost always indicate a programming error, and they should be reported as early as possible. So, when you write code which operates on multibyte text, you should not use functions like these to ``clean up'' byte offsets which the originator believes to be correct; instead, your code should signal a @code{text:not-char-boundary} error as soon as it detects an invalid offset. @xref{Multibyte Text Processing Errors}. @node Multibyte String Functions, Exchanging Guile Text With the Outside World in C, Finding Character Encoding Boundaries, Functions for Operating on Multibyte Text @subsection Multibyte String Functions These functions allow you to operate on multibyte strings: sequences of character encodings. @deftypefn {Libguile Function} int scm_mb_count (const unsigned char *@var{p}, int @var{len}) Return the number of Guile characters encoded by the @var{len} bytes at @var{p}. If the sequence contains any invalid character encodings, or ends with an incomplete character encoding, signal a @code{text:bad-encoding} error. @end deftypefn @deftypefn {Libguile Macro} scm_char_t scm_mb_walk (unsigned char **@var{pp}) Return the character whose encoding starts at @code{*@var{pp}}, and advance @code{*@var{pp}} to the start of the next character. Return -1 if @code{*@var{pp}} does not point to a valid character encoding. @end deftypefn @deftypefn {Libguile Function} {const unsigned char *} scm_mb_prev (const unsigned char *@var{p}) If @var{p} points to the middle of the encoding of a Guile character, return a pointer to the first byte of the encoding. If @var{p} points to the start of the encoding of a Guile character, return the start of the previous character's encoding. This is like @code{scm_mb_floor}, but the returned pointer will always be before @var{p}. If you use this function to drive an iteration, it guarantees backward progress. @end deftypefn @deftypefn {Libguile Function} {const unsigned char *} scm_mb_next (const unsigned char *@var{p}) If @var{p} points to the encoding of a Guile character, return a pointer to the first byte of the encoding of the next character. This is like @code{scm_mb_ceiling}, but the returned pointer will always be after @var{p}. If you use this function to drive an iteration, it guarantees forward progress. @end deftypefn @deftypefn {Libguile Function} {const unsigned char *} scm_mb_index (const unsigned char *@var{p}, int @var{len}, int @var{i}) Assuming that the @var{len} bytes starting at @var{p} are a concatenation of valid character encodings, return a pointer to the start of the @var{i}'th character encoding in the sequence. This function scans the sequence from the beginning to find the @var{i}'th character, and will generally require time proportional to the distance from @var{p} to the returned address. If the sequence contains any invalid character encodings, or ends with an incomplete character encoding, signal a @code{text:bad-encoding} error. @end deftypefn It is common to process the characters in a string from left to right. However, if you fetch each character using @code{scm_mb_index}, each call will scan the text from the beginning, so your loop will require time proportional to at least the square of the length of the text. To avoid this poor performance, you can use an @code{scm_mb_cache} structure and the @code{scm_mb_index_cached} macro. @deftp {Libguile Type} {struct scm_mb_cache} This structure holds information that allows a string scanning operation to use the results from a previous scan of the string. It has the following members: @table @code @item character An index, in characters, into the string. @item byte The index, in bytes, of the start of that character. @end table In other words, @code{byte} is the byte offset of the @code{character}'th character of the string. Note that if @code{byte} and @code{character} are equal, then all characters before that point must have encodings exactly one byte long, and the string can be indexed normally. All elements of a @code{struct scm_mb_cache} structure should be initialized to zero before its first use, and whenever the string's text changes. @end deftp @deftypefn {Libguile Macro} const unsigned char *scm_mb_index_cached (const unsigned char *@var{p}, int @var{len}, int @var{i}, struct scm_mb_cache *@var{cache}) @deftypefnx {Libguile Function} const unsigned char *scm_mb_index_cached_func (const unsigned char *@var{p}, int @var{len}, int @var{i}, struct scm_mb_cache *@var{cache}) This macro and this function are identical to @code{scm_mb_index}, except that they may consult and update *@var{cache} in order to avoid scanning the string from the beginning. @code{scm_mb_index_cached} is a macro, so it may have less overhead than @code{scm_mb_index_cached_func}, but it may evaluate its arguments more than once. Using @code{scm_mb_index_cached} or @code{scm_mb_index_cached_func}, you can scan a string from left to right, or from right to left, in time proportional to the length of the string. As long as each character fetched is less than some constant distance before or after the previous character fetched with @var{cache}, each access will require constant time. @end deftypefn Guile also provides functions to convert between an encoded sequence of characters, and an array of @code{scm_char_t} objects. @deftypefn {Libguile Function} scm_char_t *scm_mb_multibyte_to_fixed (const unsigned char *@var{p}, int @var{len}, int *@var{result_len}) Convert the variable-width text in the @var{len} bytes at @var{p} to an array of @code{scm_char_t} values. Return a pointer to the array, and set @code{*@var{result_len}} to the number of elements it contains. The returned array is allocated with @code{malloc}, and it is the caller's responsibility to free it. If the text is not a sequence of valid character encodings, this function will signal a @code{text:bad-encoding} error. @end deftypefn @deftypefn {Libguile Function} unsigned char *scm_mb_fixed_to_multibyte (const scm_char_t *@var{fixed}, int @var{len}, int *@var{result_len}) Convert the array of @code{scm_char_t} values to a sequence of variable-width character encodings. Return a pointer to the array of bytes, and set @code{*@var{result_len}} to its length, in bytes. The returned byte sequence is terminated with a zero byte, which is not counted in the length returned in @code{*@var{result_len}}. The returned byte sequence is allocated with @code{malloc}; it is the caller's responsibility to free it. If the text is not a sequence of valid character encodings, this function will signal a @code{text:bad-encoding} error. @end deftypefn @node Exchanging Guile Text With the Outside World in C, Implementing Your Own Text Conversions, Multibyte String Functions, Functions for Operating on Multibyte Text @subsection Exchanging Guile Text With the Outside World in C [[This is kind of a heavy-weight model, given that one end of the conversion is always going to be the Guile encoding. Any way to shorten things a bit?]] Guile provides functions for converting between Guile's internal text representation and encodings popular in the outside world. These functions are closely modeled after the @code{iconv} functions available on some systems. To convert text between two encodings, you should first call @code{scm_mb_iconv_open} to indicate the source and destination encodings; this function returns a context object which records the conversion to perform. Then, you should call @code{scm_mb_iconv} to actually convert the text. This function expects input and output buffers, and a pointer to the context you got from @var{scm_mb_iconv_open}. You don't need to pass all your input to @code{scm_mb_iconv} at once; you can invoke it on successive blocks of input (as you read it from a file, say), and it will convert as much as it can each time, indicating when you should grow your output buffer. An encoding may be @dfn{stateless}, or @dfn{stateful}. In most encodings, a contiguous group of bytes from the sequence completely specifies a particular character; these are stateless encodings. However, some encodings require you to look back an unbounded number of bytes in the stream to assign a meaning to a particular byte sequence; such encodings are stateful. For example, in the @samp{ISO-2022-JP} encoding for Japanese text, the byte sequence @samp{27 36 66} indicates that subsequent bytes should be taken in pairs and interpreted as characters from the JIS-0208 character set. An arbitrary number of byte pairs may follow this sequence. The byte sequence @samp{27 40 66} indicates that subsequent bytes should be interpreted as @sc{ASCII}. In this encoding, you cannot tell whether a given byte is an @sc{ASCII} character without looking back an arbitrary distance for the most recent escape sequence, so it is a stateful encoding. In Guile, if a conversion involves a stateful encoding, the context object carries any necessary state. Thus, you can have many independent conversions to or from stateful encodings taking place simultaneously, as long as each data stream uses its own context object for the conversion. @deftp {Libguile Type} {struct scm_mb_iconv} This is the type for context objects, which represent the encodings and current state of an ongoing text conversion. A @code{struct scm_mb_iconv} records the source and destination encodings, and keeps track of any information needed to handle stateful encodings. @end deftp @deftypefn {Libguile Function} {struct scm_mb_iconv *} scm_mb_iconv_open (const char *@var{tocode}, const char *@var{fromcode}) Return a pointer to a new @code{struct scm_mb_iconv} context object, ready to convert from the encoding named @var{fromcode} to the encoding named @var{tocode}. For stateful encodings, the context object is in some appropriate initial state, ready for use with the @code{scm_mb_iconv} function. When you are done using a context object, you may call @code{scm_mb_iconv_close} to free it. If either @var{tocode} or @var{fromcode} is not the name of a known encoding, this function will signal the @code{text:unknown-conversion} error, described below. @c Try to use names here from the IANA list: @c see ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets Guile supports at least these encodings: @table @samp @item US-ASCII @sc{US-ASCII}, in the standard one-character-per-byte encoding. @item ISO-8859-1 The usual character set for Western European languages, in its usual one-character-per-byte encoding. @item Guile-MB Guile's current internal multibyte encoding. The actual encoding this name refers to will change from one version of Guile to the next. You should use this when converting data between external sources and the encoding used by Guile objects. You should @emph{not} use this as the encoding for data presented to the outside world, for two reasons. 1) Its meaning will change over time, so data written using the @samp{guile} encoding with one version of Guile might not be readable with the @samp{guile} encoding in another version of Guile. 2) It currently corresponds to @samp{Emacs-Mule}, which invented for Emacs's internal use, and was never intended to serve as an exchange medium. @item Guile-Wide Guile's character set, as an array of @code{scm_char_t} values. Note that this encoding is even less suitable for public use than @samp{Guile}, since the exact sequence of bytes depends heavily on the size and endianness the host system uses for @code{scm_char_t}. Using this encoding is very much like calling the @code{scm_mb_multibyte_to_fixed} or @code{scm_mb_fixed_to_multibyte} functions, except that @code{scm_mb_iconv} gives you more control over buffer allocation and management. @item Emacs-Mule This is the variable-length encoding for multi-lingual text by GNU Emacs, at least through version 20.4. You probably should not use this encoding, as it is designed only for Emacs's internal use. However, we provide it here because it's trivial to support, and some people probably do have @samp{emacs-mule}-format files lying around. @end table (At the moment, this list doesn't include any character sets suitable for external use that can actually handle multilingual data; this is unfortunate, as it encourages users to write data in Emacs-Mule format, which nobody but Emacs and Guile understands. We hope to add support for Unicode in UTF-8 soon, which should solve this problem.) Case is not significant in encoding names. You can define your own conversions; see @ref{Implementing Your Own Text Conversions}. @end deftypefn @deftypefn {Libguile Function} int scm_mb_have_encoding (const char *@var{encoding}) Return a non-zero value if Guile supports the encoding named @var{encoding}[[]] @end deftypefn @deftypefn {Libguile Function} size_t scm_mb_iconv (struct scm_mb_iconv *@var{context}, const char **@var{inbuf}, size_t *@var{inbytesleft}, char **@var{outbuf}, size_t *@var{outbytesleft}) Convert a sequence of characters from one encoding to another. The argument @var{context} specifies the encodings to use for the input and output, and carries state for stateful encodings; use @code{scm_mb_iconv_open} to create a @var{context} object for a particular conversion. Upon entry to the function, @code{*@var{inbuf}} should point to the input buffer, and @code{*@var{inbytesleft}} should hold the number of input bytes present in the buffer; @code{*@var{outbuf}} should point to the output buffer, and @code{*@var{outbytesleft}} should hold the number of bytes available to hold the conversion results in that buffer. Upon exit from the function, @code{*@var{inbuf}} points to the first unconsumed byte of input, and @code{*@var{inbytesleft}} holds the number of unconsumed input bytes; @code{*@var{outbuf}} points to the byte after the last output byte, and @code{*@var{outbyteleft}} holds the number of bytes left unused in the output buffer. For stateful encodings, @var{context} carries encoding state from one call to @code{scm_mb_iconv} to the next. Thus, successive calls to @var{scm_mb_iconv} which use the same context object can convert a stream of data one chunk at a time. If @var{inbuf} is zero or @code{*@var{inbuf}} is zero, then the call is taken as a request to reset the states of the input and the output encodings. If @var{outbuf} is non-zero and @code{*@var{outbuf}} is non-zero, then @code{scm_mb_iconv} stores a byte sequence in the output buffer to put the output encoding in its initial state. If the output buffer is not large enough to hold this byte sequence, @code{scm_mb_iconv} returns @code{scm_mb_iconv_too_big}, and leaves the shift states of @var{context}'s input and output encodings unchanged. The @code{scm_mb_iconv} function always consumes only complete characters or shift sequences from the input buffer, and the output buffer always contains a sequence of complete characters or escape sequences. If the input sequence contains characters which are not expressible in the output encoding, @code{scm_mb_iconv} converts it in an implementation-defined way. It may simply delete the character. Some encodings use byte sequences which do not correspond to any textual character. For example, the escape sequence of a stateful encoding has no textual meaning. When converting from such an encoding, a call to @code{scm_mb_iconv} might consume input but produce no output, since the input sequence might contain only escape sequences. Normally, @code{scm_mb_iconv} returns the number of input characters it could not convert perfectly to the ouput encoding. However, it may return one of the @code{scm_mb_iconv_} codes described below, to indicate an error. All of these codes are negative values. If the input sequence contains an invalid character encoding, conversion stops before the invalid input character, and @code{scm_mb_iconv} returns the constant value @code{scm_mb_iconv_bad_encoding}. If the input sequence ends with an incomplete character encoding, @code{scm_mb_iconv} will leave it in the input buffer, unconsumed, and return the constant value @code{scm_mb_iconv_incomplete_encoding}. This is not necessarily an error, if you expect to call @code{scm_mb_iconv} again with more data which might contain the rest of the encoding fragment. If the output buffer does not contain enough room to hold the converted form of the complete input text, @code{scm_mb_iconv} converts as much as it can, changes the input and output pointers to reflect the amount of text successfully converted, and then returns @code{scm_mb_iconv_too_big}. @end deftypefn Here are the status codes that might be returned by @code{scm_mb_iconv}. They are all negative integers. @table @code @item scm_mb_iconv_too_big The conversion needs more room in the output buffer. Some characters may have been consumed from the input buffer, and some characters may have been placed in the available space in the output buffer. @item scm_mb_iconv_bad_encoding @code{scm_mb_iconv} encountered an invalid character encoding in the input buffer. Conversion stopped before the invalid character, so there may be some characters consumed from the input buffer, and some converted text in the output buffer. @item scm_mb_iconv_incomplete_encoding The input buffer ends with an incomplete character encoding. The incomplete encoding is left in the input buffer, unconsumed. This is not necessarily an error, if you expect to call @code{scm_mb_iconv} again with more data which might contain the rest of the incomplete encoding. @end table Finally, Guile provides a function for destroying conversion contexts. @deftypefn {Libguile Function} void scm_mb_iconv_close (struct scm_mb_iconv *@var{context}) Deallocate the conversion context object @var{context}, and all other resources allocated by the call to @code{scm_mb_iconv_open} which returned @var{context}. @end deftypefn @node Implementing Your Own Text Conversions, , Exchanging Guile Text With the Outside World in C, Functions for Operating on Multibyte Text @subsection Implementing Your Own Text Conversions [[note that conversions to and from Guile must produce streams containing only valid character encodings, or else Guile will crash]] This section describes the interface for adding your own encoding conversions for use with @code{scm_mb_iconv}. The interface here is borrowed from the GNOME Project's @file{libunicode} library. Guile's @code{scm_mb_iconv} function works by converting the input text to a stream of @code{scm_char_t} characters, and then converting those characters to the desired output encoding. This makes it easy for Guile to choose the appropriate conversion back ends for an arbitrary pair of input and output encodings, but it also means that the accuracy and quality of the conversions depends on the fidelity of Guile's internal character set to the source and destination encodings. Since @code{scm_mb_iconv} will be used almost exclusively for converting to and from Guile's internal character set, this shouldn't be a problem. To add support for a particular encoding to Guile, you must provide one function (called the @dfn{read} function) which converts from your encoding to an array of @code{scm_char_t}'s, and another function (called the @dfn{write} function) to convert from an array of @code{scm_char_t}'s back into your encoding. To convert from some encoding @var{a} to some other encoding @var{b}, Guile pairs up @var{a}'s read function with @var{b}'s write function. Each call to @code{scm_mb_iconv} passes text in encoding @var{a} through the read function, to produce an array of @code{scm_char_t}'s, and then passes that array to the write function, to produce text in encoding @var{b}. For stateful encodings, a read or write function can hang its own data structures off the conversion object, and provide its own functions to allocate and destroy them; this allows read and write functions to maintain whatever state they like. The Guile conversion back end represents each available encoding with a @code{struct scm_mb_encoding} object. @deftp {Libguile Type} {struct scm_mb_encoding} This data structure describes an encoding. It has the following members: @table @code @item char **names An array of strings, giving the various names for this encoding. The array should be terminated by a zero pointer. Case is not significant in encoding names. The @code{scm_mb_iconv_open} function searches the list of registered encodings for an encoding whose @code{names} array matches its @var{tocode} or @var{fromcode} argument. @item int (*init) (void **@var{cookie}) An initialization function for the encoding's private data. @code{scm_mb_iconv_open} will call this function, passing it the address of the cookie for this encoding in this context. (We explain cookies below.) There is no way for the @code{init} function to tell whether the encoding will be used for reading or writing. Note that @code{init} receives a @emph{pointer} to the cookie, not the cookie itself. Because the type of @var{cookie} is @code{void **}, the C compiler will not check it as carefully as it would other types. The @code{init} member may be zero, indicating that no initialization is necessary for this encoding. @item int (*destroy) (void **@var{cookie}) A deallocation function for the encoding's private data. @code{scm_mb_iconv_close} calls this function, passing it the address of the cookie for this encoding in this context. The @code{destroy} function should free any data the @code{init} function allocated. Note that @code{destroy} receives a @emph{pointer} to the cookie, not the cookie itself. Because the type of @var{cookie} is @code{void **}, the C compiler will not check it as carefully as it would other types. The @code{destroy} member may be zero, indicating that this encoding doesn't need to perform any special action to destroy its local data. @item int (*reset) (void *@var{cookie}, char **@var{outbuf}, size_t *@var{outbytesleft}) Put the encoding into its initial shift state. Guile calls this function whether the encoding is being used for input or output, so this should take appropriate steps for both directions. If @var{outbuf} and @var{outbytesleft} are valid, the reset function should emit an escape sequence to reset the output stream to its initial state; @var{outbuf} and @var{outbytesleft} should be handled just as for @code{scm_mb_iconv}. This function can return an @code{scm_mb_iconv_} error code (@pxref{Exchanging Guile Text With the Outside World in C}). If it returns @code{scm_mb_iconv_too_big}, then the output buffer's shift state must be left unchanged. Note that @code{reset} receives the cookie's value itself, not a pointer to the cookie, as the @code{init} and @code{destroy} functions do. The @code{reset} member may be zero, indicating that this encoding doesn't use a shift state. @item enum scm_mb_read_result (*read) (void *@var{cookie}, const char **@var{inbuf}, size_t *@var{inbytesleft}, scm_char_t **@var{outbuf}, size_t *@var{outcharsleft}) Read some bytes and convert into an array of Guile characters. This is the encoding's read function. On entry, there are *@var{inbytesleft} bytes of text at *@var{inbuf} to be converted, and *@var{outcharsleft} characters available at *@var{outbuf} to hold the results. On exit, *@var{inbytesleft} and *@var{inbuf} indicate the input bytes still not consumed. *@var{outcharsleft} and *@var{outbuf} indicate the output buffer space still not filled. (By exclusion, these indicate which input bytes were consumed, and which output characters were produced.) Return one of the @code{enum scm_mb_read_result} values, described below. Note that @code{read} receives the cookie's value itself, not a pointer to the cookie, as the @code{init} and @code{destroy} functions do. @item enum scm_mb_write_result (*write) (void *@var{cookie}, scm_char_t **@var{inbuf}, size_t *@var{incharsleft}, **@var{outbuf}, size_t *@var{outbytesleft}) Convert an array of Guile characters to output bytes. This is the encoding's write function. On entry, there are *@var{incharsleft} Guile characters available at *@var{inbuf}, and *@var{outbytesleft} bytes available to store output at *@var{outbuf}. On exit, *@var{incharsleft} and *@var{inbuf} indicate the number of Guile characters left unconverted (because there was insufficient room in the output buffer to hold their converted forms), and *@var{outbytesleft} and *@var{outbuf} indicate the unused portion of the output buffer. Return one of the @code{scm_mb_write_result} values, described below. Note that @code{write} receives the cookie's value itself, not a pointer to the cookie, as the @code{init} and @code{destroy} functions do. @item struct scm_mb_encoding *next This is used by Guile to maintain a linked list of encodings. It is filled in when you call @code{scm_mb_register_encoding} to add your encoding to the list. @end table @end deftp Here is the enumerated type for the values an encoding's read function can return: @deftp {Libguile Type} {enum scm_mb_read_result} This type represents the result of a call to an encoding's read function. It has the following values: @table @code @item scm_mb_read_ok The read function consumed at least one byte of input. @item scm_mb_read_incomplete The data present in the input buffer does not contain a complete character encoding. No input was consumed, and no characters were produced as output. This is not necessarily an error status, if there is more data to pass through. @item scm_mb_read_error The input contains an invalid character encoding. @end table @end deftp Here is the enumerated type for the values an encoding's write function can return: @deftp {Libguile Type} {enum scm_mb_write_result} This type represents the result of a call to an encoding's write function. It has the following values: @table @code @item scm_mb_write_ok The write function was able to convert all the characters in @var{inbuf} successfully. @item scm_mb_write_too_big The write function filled the output buffer, but there are still characters in @var{inbuf} left unconsumed; @var{inbuf} and @var{incharsleft} indicate the unconsumed portion of the input buffer. @end table @end deftp Conversions to or from stateful encodings need to keep track of each encoding's current state. Each conversion context contains two @code{void *} variables called @dfn{cookies}, one for the input encoding, and one for the output encoding. These cookies are passed to the encodings' functions, for them to use however they please. A stateful encoding can use its cookie to hold a pointer to some object which maintains the context's current shift state. Stateless encodings will probably not use their cookies. The cookies' lifetime is the same as that of the context object. When the user calls @code{scm_mb_iconv_close} to destroy a context object, @code{scm_mb_iconv_close} calls the input and output encodings' @code{destroy} functions, passing them their respective cookies, so each encoding can free any data it allocated for that context. Note that, if a read or write function returns a successful result code like @code{scm_mb_read_ok} or @code{scm_mb_write_ok}, then the remaining input, together with the output, must together represent the complete input text; the encoding may not store any text temporarily in its cookie. This is because, if @code{scm_mb_iconv} returns a successful result to the user, it is correct for the user to assume that all the consumed input has been converted and placed in the output buffer. There is no ``flush'' operation to push any final results out of the encodings' buffers. Here is the function you call to register a new encoding with the conversion system: @deftypefn {Libguile Function} void scm_mb_register_encoding (struct scm_mb_encoding *@var{encoding}) Add the encoding described by @code{*@var{encoding}} to the set understood by @code{scm_mb_iconv_open}. Once you have registered your encoding, you can use it by calling @code{scm_mb_iconv_open} with one of the names in @code{@var{encoding}->names}. @end deftypefn @node Multibyte Text Processing Errors, Why Guile Does Not Use a Fixed-Width Encoding, Functions for Operating on Multibyte Text, Working With Multibyte Strings in C @section Multibyte Text Processing Errors This section describes error conditions which code can signal to indicate problems encountered while processing multibyte text. In each case, the arguments @var{message} and @var{args} are an error format string and arguments to be substituted into the string, as accepted by the @code{display-error} function. @deffn Condition text:not-char-boundary func message args object offset By calling @var{func}, the program attempted to access a character at byte offset @var{offset} in the Guile object @var{object}, but @var{offset} is not the start of a character's encoding in @var{object}. Typically, @var{object} is a string or symbol. If the function signalling the error cannot find the Guile object that contains the text it is inspecting, it should use @code{#f} for @var{object}. @end deffn @deffn Condition text:bad-encoding func message args object By calling @var{func}, the program attempted to interpret the text in @var{object}, but @var{object} contains a byte sequence which is not a valid encoding for any character. @end deffn @deffn Condition text:not-guile-char func message args number By calling @var{func}, the program attempted to treat @var{number} as the number of a character in the Guile character set, but @var{number} does not correspond to any character in the Guile character set. @end deffn @deffn Condition text:unknown-conversion func message args from to By calling @var{func}, the program attempted to convert from an encoding named @var{from} to an encoding named @var{to}, but Guile does not support such a conversion. @end deffn @deftypevr {Libguile Variable} SCM scm_text_not_char_boundary @deftypevrx {Libguile Variable} SCM scm_text_bad_encoding @deftypevrx {Libguile Variable} SCM scm_text_not_guile_char These variables hold the scheme symbol objects whose names are the condition symbols above. You can use these when signalling these errors, instead of looking them up yourself. @end deftypevr @node Why Guile Does Not Use a Fixed-Width Encoding, , Multibyte Text Processing Errors, Working With Multibyte Strings in C @section Why Guile Does Not Use a Fixed-Width Encoding Multibyte encodings are clumsier to work with than encodings which use a fixed number of bytes for every character. For example, using a fixed-width encoding, we can extract the @var{i}th character of a string in constant time, and we can always substitute the @var{i}th character of a string with any other character without reallocating or copying the string. However, there are no fixed-width encodings which include the characters we wish to include, and also fit in a reasonable amount of space. Despite the Unicode standard's claims to the contrary, Unicode is not really a fixed-width encoding. Unicode uses surrogate pairs to represent characters outside the 16-bit range; a surrogate pair must be treated as a single character, but occupies two 16-bit spaces. As of this writing, there are already plans to assign characters to the surrogate character codes. Three- and four-byte encodings are too wasteful for a majority of Guile's users, who only need @sc{ASCII} and a few accented characters. Another alternative would be to have several different fixed-width string representations, each with a different element size. For each string, Guile would use the smallest element size capable of accomodating the string's text. This would allow users of English and the Western European languages to use the traditional memory-efficient encodings. However, if Guile has @var{n} string representations, then users must write @var{n} versions of any code which manipulates text directly --- one for each element size. And if a user wants to operate on two strings simultaneously, and wants to avoid testing the string sizes within the loop, she must make @var{n}*@var{n} copies of the loop. Most users will simply not bother. Instead, they will write code which supports only one string size, leaving us back where we started. By using a single internal representation, Guile makes it easier for users to write multilingual code. [[What about tagging each string with its encoding? "Every extension must be written to deal with every encoding"]] [[You don't really want to index strings anyway.]] Finally, Guile's multibyte encoding is not so bad. Unlike a two- or four-byte encoding, it is efficient in space for American and European users. Furthermore, the properties described above mean that many functions can be coded just as they would for a single-byte encoding; see @ref{Promised Properties of the Guile Multibyte Encoding}. @bye guile-1.8-1.8.8+1.orig/doc/mltext.texi000066400000000000000000000132541155472604000172220ustar00rootroot00000000000000@node Working with Multilingual Text @chapter Working with Multilingual Text @node Guile Character Properties, Exchanging Text With The Outside World, Multibyte String Functions, Functions for Operating on Multibyte Text @section Guile Character Properties These functions give information about the nature of a given Guile character. These are defined for any @code{scm_mb_char_t} value. @deftypefn {Libguile Function} int scm_mb_isalnum (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is an alphabetic or numeric character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_is_alpha (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is an alphabetic character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_iscntrl (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a control character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isdigit (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a digit. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isgraph (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a visible character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isupper (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is an upper-case character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_islower (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a lower-case character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_istitle (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a title-case character. See the Unicode standard for an explanation of title case. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isprint (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a printable character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_ispunct (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a punctuation character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isspace (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a whitespace character. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isxdigit (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a hexadecimal digit. @end deftypefn @deftypefn {Libguile Function} int scm_mb_isdefined (scm_mb_char_t @var{c}) Return non-zero iff @var{c} is a valid character. @end deftypefn @deftypefn {Libguile Function} scm_mb_char_t scm_mb_char_toupper (scm_mb_char_t @var{c}) @deftypefnx {Libguile Function} scm_mb_char_t scm_mb_char_tolower (scm_mb_char_t @var{c}) @deftypefnx {Libguile Function} scm_mb_char_t scm_mb_char_totitle (scm_mb_char_t @var{c}) Convert @var{c} to upper, lower, or title case. If @var{c} has no equivalent in the requested case, or is already in that case, return it unchanged. @end deftypefn @deftypefn {Libguile Function} in scm_mb_digit_value (scm_mb_char_t @var{c}) If @var{c} is a hexadecimal digit (according to @code{scm_mb_isxdigit}), then return its numeric value. Otherwise return -1. @end deftypefn @deftypefn {Libguile Function} in scm_mb_digit_value (scm_mb_char_t @var{c}) If @var{c} is a digit (according to @code{scm_mb_isdigit}), then return its numeric value. Otherwise return -1. @end deftypefn @node Multibyte Character Tables, Multibyte Character Categories, Exchanging Text With The Outside World, Functions for Operating on Multibyte Text @section Multibyte Character Tables A @dfn{character table} is a table mapping @code{scm_mb_char_t} values onto Guile objects. Guile provides functions for creating character tables, setting entries, and looking up characters. Character tables are Guile objects, so they are managed by Guile's garbage collector. A character table can have a ``parent'' table, from which it inherits values for characters. If a character table @var{child}, with a parent table @var{parent} maps some character @var{c} to the value @code{SCM_UNDEFINED}, then @code{scm_c_char_table_ref (@var{child}, @var{c})} will look up @var{c} in @var{parent}, and return the value it finds there. This section describes only the C API for working with character tables. For the Scheme-level API, see @ref{some other section}. @deftypefn {Libguile Function} scm_make_char_table (SCM @var{init}, SCM @var{parent}) Return a new character table object which maps every character to @var{init}. If @var{parent} is a character table, then @var{parent} is the new table's parent. If @var{parent} table is @code{SCM_UNDEFINED}, then the new table has no parent. Otherwise, signal a type error. @end deffn @deftypefn {Libguile Function} SCM scm_c_char_table_ref (SCM @var{table}, scm_mb_char_t @var{c}) Look up the character @var{c} in the character table @var{table}, and return the value found there. If @var{table} maps @var{c} to @code{SCM_UNDEFINED}, and @var{table} has a parent, then look up @var{c} in the parent. If @var{table} is not a character table, signal an error. @end deftypefn @deftypefn {Libguile Function} SCM scm_c_char_table_set_x (SCM @var{table}, scm_mb_char_t @var{c}, SCM @var{value}) Set @var{table}'s value for the character @var{c} to @var{value}. If @var{value} is @code{SCM_UNDEFINED}, then @var{table}'s parent's value will show through for @var{c}. If @var{table} is not a character table, signal an error. This function changes only @var{table} itself, never @var{table}'s parent. @end deftypefn [[this is all wrong. what about default values?]] @node Multibyte Character Categories, , Multibyte Character Tables, Functions for Operating on Multibyte Text @section Multibyte Character Categories [[This will describe an ADT representing subsets of the Guile character set.]] @node Exchanging Guile Text With the Outside World @subsection Exchanging Guile Text With the Outside World [[Scheme-level functions for converting between encodings]] guile-1.8-1.8.8+1.orig/doc/oldfmt.c000066400000000000000000000123201155472604000164340ustar00rootroot00000000000000/* Copyright (C) 2000,2001, 2006, 2008 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* From NEWS: * * * New primitive: `simple-format', affects `scm-error', scm_display_error, & scm_error message strings * * (ice-9 boot) makes `format' an alias for `simple-format' until possibly * extended by the more sophisticated version in (ice-9 format) * * (simple-format port message . args) * Write MESSAGE to DESTINATION, defaulting to `current-output-port'. * MESSAGE can contain ~A (was %s) and ~S (was %S) escapes. When printed, * the escapes are replaced with corresponding members of ARGS: * ~A formats using `display' and ~S formats using `write'. * If DESTINATION is #t, then use the `current-output-port', * if DESTINATION is #f, then return a string containing the formatted text. * Does not add a trailing newline." * * The two C procedures: scm_display_error and scm_error, as well as the * primitive `scm-error', now use scm_format to do their work. This means * that the message strings of all code must be updated to use ~A where %s * was used before, and ~S where %S was used before. * * During the period when there still are a lot of old Guiles out there, * you might want to support both old and new versions of Guile. * * There are basically two methods to achieve this. Both methods use * autoconf. Put * * AC_CHECK_FUNCS(scm_simple_format) * * in your configure.in. * * Method 1: Use the string concatenation features of ANSI C's * preprocessor. * * In C: * * #ifdef HAVE_SCM_SIMPLE_FORMAT * #define FMT_S "~S" * #else * #define FMT_S "%S" * #endif * * Then represent each of your error messages using a preprocessor macro: * * #define E_SPIDER_ERROR "There's a spider in your " ## FMT_S ## "!!!" * * In Scheme: * * (define fmt-s (if (defined? 'simple-format) "~S" "%S")) * (define make-message string-append) * * (define e-spider-error * (make-message "There's a spider in your " fmt-s "!!!")) * * Method 2: Use the oldfmt function found in doc/oldfmt.c. * * In C: * * scm_misc_error ("picnic", scm_c_oldfmt0 ("There's a spider in your ~S!!!"), * ...); * * In Scheme: * * (scm-error 'misc-error "picnic" (oldfmt "There's a spider in your ~S!!!") * ...) * */ /* * Take a format string FROM adhering to the new standard format (~A and ~S * as placeholders) of length N and return a string which is adapted * to the format used by the Guile interpreter which you are running. * * On successive calls with similar strings but different storage, the * same string with same storage is returned. This is necessary since * the existence of a garbage collector in the system may cause the same * format string to be represented with different storage at different * calls. */ char * scm_c_oldfmt (char *from, int n) { #ifdef HAVE_SCM_SIMPLE_FORMAT return from; #else static struct { int n; char *from; char *to; } *strings; static int size = 0; static int n_strings = 0; char *to; int i; for (i = 0; i < n_strings; ++i) if (n == strings[i].n && strncmp (from, strings[i].from, n) == 0) return strings[i].to; if (n_strings == size) { if (size == 0) { size = 10; strings = scm_must_malloc (size * sizeof (*strings), s_oldfmt); } else { int oldsize = size; size = 3 * oldsize / 2; strings = scm_must_realloc (strings, oldsize * sizeof (*strings), size * sizeof (*strings), s_oldfmt); } } strings[n_strings].n = n; strings[n_strings].from = strncpy (scm_must_malloc (n, s_oldfmt), from, n); to = strings[n_strings].to = scm_must_malloc (n + 1, s_oldfmt); n_strings++; for (i = 0; i < n; ++i) { if (from[i] == '~' && ++i < n) { if (from[i] == 'A') { to[i - 1] = '%'; to[i] = 's'; } else if (from[i] == 'S') { to[i - 1] = '%'; to[i] = 'S'; } else { to[i - 1] = '~'; to[i] = from[i]; } continue; } to[i] = from[i]; } to[i] = '\0'; return to; #endif } char * scm_c_oldfmt0 (char *s) { #ifdef HAVE_SCM_SIMPLE_FORMAT return s; #else return scm_c_oldfmt (s, strlen (s)); #endif } SCM_PROC (s_oldfmt, "oldfmt", 1, 0, 0, scm_oldfmt); SCM scm_oldfmt (SCM s) { #ifdef HAVE_SCM_SIMPLE_FORMAT return s; #else int n; SCM_ASSERT (SCM_NIMP (s) && SCM_STRINGP (s), s, 1, s_oldfmt); n = SCM_LENGTH (s); return scm_return_first (scm_mem2string (scm_c_oldfmt (SCM_ROCHARS (s), n), n), s); #endif } guile-1.8-1.8.8+1.orig/doc/r5rs/000077500000000000000000000000001155472604000157005ustar00rootroot00000000000000guile-1.8-1.8.8+1.orig/doc/r5rs/ChangeLog-2008000066400000000000000000000012461155472604000200440ustar00rootroot000000000000002004-11-05 Marius Vollmer * r5rs.texi: Use @ifnottex instead of @ifinfo around the "Top" node declaration so that html can be generated. Use only lower case inside @sc. Move editors outside of author table, which looks better in html. 2001-08-27 Neil Jerram * Makefile.am (TEXINFO_TEX): Added; avoids shipping multiple copies of texinfo.tex in a single distribution. 2001-08-27 Neil Jerram The change log for files in this directory continues backwards from 2001-08-27 in ../ChangeLog, as all the Guile documentation prior to this date was contained in a single directory. guile-1.8-1.8.8+1.orig/doc/r5rs/Makefile.am000066400000000000000000000017311155472604000177360ustar00rootroot00000000000000## Process this file with Automake to create Makefile.in ## ## Copyright (C) 1998, 2006, 2008 Free Software Foundation, Inc. ## ## This file is part of GUILE. ## ## GUILE is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2, or ## (at your option) any later version. ## ## GUILE is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public ## License along with GUILE; see the file COPYING. If not, write ## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth ## Floor, Boston, MA 02110-1301 USA AUTOMAKE_OPTIONS = gnu info_TEXINFOS = r5rs.texi EXTRA_DIST = ChangeLog-2008 guile-1.8-1.8.8+1.orig/doc/r5rs/r5rs.texi000066400000000000000000007666121155472604000175100ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename r5rs.info @settitle Revised(5) Scheme @c This copy of r5rs.texi differs from Aubrey Jaffer's master copy @c by a set of changes to allow the building of r5rs.dvi from r5rs.texi. @c Aubrey Jaffer's view - which I agree with - is that, given that @c people have the option of building r5rs.dvi from the original @c LaTeX distribution for R5RS, it is not worth fixing his master @c copy of r5rs.texi and the tool which autogenerates it. On the @c other hand, it is a marginal convenience for people to be able to @c build hardcopy from r5rs.texi, even if the results are less good @c than with the original LaTeX. Hence the following fixes. @c (lines 714, 725, 728, 1614, 2258): Remove invalid parentheses from @c @deffn statements. @c (line 2316): Change @deffnx to @deffn, and insert `@end deffn' to @c terminate preceding @deffn. @c (line 7320): Insert `@c ' at beginning of lines that are intended @c to be @ignore'd. @c @c NJ 2001/1/26 @c \documentclass[twoside]{algol60} @c \pagestyle{headings} @c \showboxdepth=0 @c \def\headertitle{Revised$^{5}$ Scheme} @c \def\integerversion{5} @c Sizes and dimensions @c \topmargin -.375in % Nominal distance from top of page to top of @c box containing running head. @c \headsep 15pt % Space between running head and text. @c \textheight 663pt % Height of text (including footnotes and figures, @c excluding running head and foot). @c \textwidth 523pt % Width of text line. @c \columnsep 15pt % Space between columns @c \columnseprule 0pt % Width of rule between columns. @c \parskip 5pt plus 2pt minus 2pt % Extra vertical space between paragraphs. @c \parindent 0pt % Width of paragraph indentation. @c \topsep 0pt plus 2pt % Extra vertical space, in addition to @c \parskip, added above and below list and @c paragraphing environments. @c \oddsidemargin -.5in % Left margin on odd-numbered pages. @c \evensidemargin -.5in % Left margin on even-numbered pages. @c % End of sizes and dimensions @paragraphindent 0 @c %**end of header @c syncodeindex fn cp @ifinfo @dircategory The Algorithmic Language Scheme @direntry * R5RS: (r5rs). The Revised(5) Report on Scheme. @end direntry @end ifinfo @c \parindent 0pt %!! 15pt % Width of paragraph indentation. @b{20 February 1998} @c \hfil \today{} @c @include{first} @titlepage @c HTML first page @title Scheme @subtitle Revised(5) Report on the Algorithmic Language Scheme @c First page @c \thispagestyle{empty} @c \todo{"another" report?} @author R@sc{ICHARD} K@sc{ELSEY}, W@sc{ILLIAM} C@sc{LINGER, AND} J@sc{ONATHAN} R@sc{EES} (@i{Editors}) @author H. A@sc{BELSON} @author R. K. D@sc{YBVIG} @author C. T. H@sc{AYNES} @author G. J. R@sc{OZAS} @author N. I. A@sc{DAMS IV} @author D. P. F@sc{RIEDMAN} @author E. K@sc{OHLBECKER} @author G. L. S@sc{TEELE} J@sc{R}. @author D. H. B@sc{ARTLEY} @author R. H@sc{ALSTEAD} @author D. O@sc{XLEY} @author G. J. S@sc{USSMAN} @author G. B@sc{ROOKS} @author C. H@sc{ANSON} @author K. M. P@sc{ITMAN} @author M. W@sc{AND} @author @c {\it Dedicated to the Memory of ALGOL 60} @i{Dedicated to the Memory of Robert Hieb} @c [For the macros in R5RS -RK] @unnumbered Summary The report gives a defining description of the programming language Scheme. Scheme is a statically scoped and properly tail-recursive dialect of the Lisp programming language invented by Guy Lewis Steele Jr.@: and Gerald Jay Sussman. It was designed to have an exceptionally clear and simple semantics and few different ways to form expressions. A wide variety of programming paradigms, including imperative, functional, and message passing styles, find convenient expression in Scheme. The introduction offers a brief history of the language and of the report. The first three chapters present the fundamental ideas of the language and describe the notational conventions used for describing the language and for writing programs in the language. Chapters @ref{Expressions} and @ref{Program structure} describe the syntax and semantics of expressions, programs, and definitions. Chapter @ref{Standard procedures} describes Scheme's built-in procedures, which include all of the language's data manipulation and input/output primitives. Chapter @ref{Formal syntax and semantics} provides a formal syntax for Scheme written in extended BNF, along with a formal denotational semantics. An example of the use of the language follows the formal syntax and semantics. The report concludes with a list of references and an alphabetic index. @ignore todo expand the summary so that it fills up the column. @end ignore @c \vfill @c \begin{center} @c {\large \bf @c *** DRAFT*** \\ @c %August 31, 1989 @c \today @c }\end{center} @c \addvspace{3.5pt} % don't shrink this gap @c \renewcommand{\tocshrink}{-3.5pt} % value determined experimentally @page @end titlepage @c INFO first page @ifnottex @c First page @c \thispagestyle{empty} @c \todo{"another" report?} @node top, Introduction, (dir), (dir) @top Revised(5) Report on the Algorithmic Language Scheme @sp 1 @quotation R@sc{ichard} K@sc{elsey}, W@sc{illiam} C@sc{linger, and} J@sc{onathan} R@sc{ees} (@i{Editors}) @sp 1 @multitable @columnfractions 0.25 0.25 0.25 0.25 @item H. A@sc{belson} @tab R. K. D@sc{ybvig} @tab C. T. H@sc{aynes} @tab G. J. R@sc{ozas} @item N. I. A@sc{dams IV} @tab D. P. F@sc{riedman} @tab E. K@sc{ohlbecker} @tab G. L. S@sc{teele} J@sc{r}. @item D. H. B@sc{artley} @tab R. H@sc{alstead} @tab D. O@sc{xley} @tab G. J. S@sc{ussman} @item G. B@sc{rooks} @tab C. H@sc{anson} @tab K. M. P@sc{itman} @tab M. W@sc{and} @item @end multitable @end quotation @sp 2 @c {\it Dedicated to the Memory of ALGOL 60} @i{Dedicated to the Memory of Robert Hieb} @c [For the macros in R5RS -RK] @sp 3 @majorheading Summary The report gives a defining description of the programming language Scheme. Scheme is a statically scoped and properly tail-recursive dialect of the Lisp programming language invented by Guy Lewis Steele Jr.@: and Gerald Jay Sussman. It was designed to have an exceptionally clear and simple semantics and few different ways to form expressions. A wide variety of programming paradigms, including imperative, functional, and message passing styles, find convenient expression in Scheme. The introduction offers a brief history of the language and of the report. The first three chapters present the fundamental ideas of the language and describe the notational conventions used for describing the language and for writing programs in the language. Chapters @ref{Expressions} and @ref{Program structure} describe the syntax and semantics of expressions, programs, and definitions. Chapter @ref{Standard procedures} describes Scheme's built-in procedures, which include all of the language's data manipulation and input/output primitives. Chapter @ref{Formal syntax and semantics} provides a formal syntax for Scheme written in extended BNF, along with a formal denotational semantics. An example of the use of the language follows the formal syntax and semantics. The report concludes with a list of references and an alphabetic index. @ignore todo expand the summary so that it fills up the column. @end ignore @c \vfill @c \begin{center} @c {\large \bf @c *** DRAFT*** \\ @c %August 31, 1989 @c \today @c }\end{center} @c \addvspace{3.5pt} % don't shrink this gap @c \renewcommand{\tocshrink}{-3.5pt} % value determined experimentally @unnumbered Contents @menu * Introduction:: * Overview of Scheme:: * Lexical conventions:: * Basic concepts:: * Expressions:: * Program structure:: * Standard procedures:: * Formal syntax and semantics:: * Notes:: * Additional material:: * Example:: * Bibliography:: * Index:: @end menu @page @end ifnottex @c @include{intro} @node Introduction, Overview of Scheme, top, top @unnumbered Introduction @menu * Background:: * Acknowledgements:: @end menu Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary. Scheme demonstrates that a very small number of rules for forming expressions, with no restrictions on how they are composed, suffice to form a practical and efficient programming language that is flexible enough to support most of the major programming paradigms in use today. @c Scheme has influenced the evolution of Lisp. Scheme was one of the first programming languages to incorporate first class procedures as in the lambda calculus, thereby proving the usefulness of static scope rules and block structure in a dynamically typed language. Scheme was the first major dialect of Lisp to distinguish procedures from lambda expressions and symbols, to use a single lexical environment for all variables, and to evaluate the operator position of a procedure call in the same way as an operand position. By relying entirely on procedure calls to express iteration, Scheme emphasized the fact that tail-recursive procedure calls are essentially goto's that pass arguments. Scheme was the first widely used programming language to embrace first class escape procedures, from which all previously known sequential control structures can be synthesized. A subsequent version of Scheme introduced the concept of exact and inexact numbers, an extension of Common Lisp's generic arithmetic. More recently, Scheme became the first programming language to support hygienic macros, which permit the syntax of a block-structured language to be extended in a consistent and reliable manner. @c A few @c of these innovations have recently been incorporated into Common Lisp, while @c others remain to be adopted. @ignore todo Ramsdell: I would like to make a few comments on presentation. The most important comment is about section organization. Newspaper writers spend most of their time writing the first three paragraphs of any article. This part of the article is often the only part read by readers, and is important in enticing readers to continue. In the same way, The first page is most likely to be the only page read by many SIGPLAN readers. If I had my choice of what I would ask them to read, it would be the material in section 1.1, the Semantics section that notes that scheme is lexically scoped, tail recursive, weakly typed, ... etc. I would expand on the discussion on continuations, as they represent one important difference between Scheme and other languages. The introduction, with its history of scheme, its history of scheme reports and meetings, and acknowledgements giving names of people that the reader will not likely know, is not that one page I would like all to read. I suggest moving the history to the back of the report, and use the first couple of pages to convince the reader that the language documented in this report is worth studying. @end ignore @node Background, Acknowledgements, Introduction, Introduction @unnumberedsec Background The first description of Scheme was written in 1975 [Scheme75]. A revised report [Scheme78] @ignore todo italicize or not? @end ignore appeared in 1978, which described the evolution of the language as its MIT implementation was upgraded to support an innovative compiler [Rabbit]. Three distinct projects began in 1981 and 1982 to use variants of Scheme for courses at MIT, Yale, and Indiana University [Rees82], [MITScheme], [Scheme311]. An introductory computer science textbook using Scheme was published in 1984 [SICP]. @c \vest As might be expected of a language used primarily for education and @c research, Scheme has always evolved rapidly. This was no problem when @c Scheme was used only within MIT, but As Scheme became more widespread, local dialects began to diverge until students and researchers occasionally found it difficult to understand code written at other sites. Fifteen representatives of the major implementations of Scheme therefore met in October 1984 to work toward a better and more widely accepted standard for Scheme. @c Participating in this workshop were Hal Abelson, Norman Adams, David @c Bartley, Gary Brooks, William Clinger, Daniel Friedman, Robert Halstead, @c Chris Hanson, Christopher Haynes, Eugene Kohlbecker, Don Oxley, Jonathan Rees, @c Guillermo Rozas, Gerald Jay Sussman, and Mitchell Wand. Kent Pitman @c made valuable contributions to the agenda for the workshop but was @c unable to attend the sessions. @c Subsequent electronic mail discussions and committee work completed the @c definition of the language. @c Gerry Sussman drafted the section on numbers, Chris Hanson drafted the @c sections on characters and strings, and Gary Brooks and William Clinger @c drafted the sections on input and output. @c William Clinger recorded the decisions of the workshop and @c compiled the pieces into a coherent document. @c The ``Revised revised report on Scheme''~\cite{RRRS} Their report [RRRS] was published at MIT and Indiana University in the summer of 1985. Further revision took place in the spring of 1986 [R3RS], @c , again accomplished @c almost entirely by electronic mail, resulted in the present report. and in the spring of 1988 [R4RS]. The present report reflects further revisions agreed upon in a meeting at Xerox PARC in June 1992. @c \vest The number 3 in the title is part of the title, not a reference to @c a footnote. The word ``revised'' is raised to the third power because @c the report is a revision of a report that was already twice revised. @ignore todo Write an editors' note? @end ignore @sp 3 We intend this report to belong to the entire Scheme community, and so we grant permission to copy it in whole or in part without fee. In particular, we encourage implementors of Scheme to use this report as a starting point for manuals and other documentation, modifying it as necessary. @node Acknowledgements, , Background, Introduction @unnumberedsec Acknowledgements We would like to thank the following people for their help: Alan Bawden, Michael Blair, George Carrette, Andy Cromarty, Pavel Curtis, Jeff Dalton, Olivier Danvy, Ken Dickey, Bruce Duba, Marc Feeley, Andy Freeman, Richard Gabriel, Yekta G"ursel, Ken Haase, Robert Hieb, Paul Hudak, Morry Katz, Chris Lindblad, Mark Meyer, Jim Miller, Jim Philbin, John Ramsdell, Mike Shaff, Jonathan Shapiro, Julie Sussman, Perry Wagle, Daniel Weise, Henry Wu, and Ozan Yigit. We thank Carol Fessenden, Daniel Friedman, and Christopher Haynes for permission to use text from the Scheme 311 version 4 reference manual. We thank Texas Instruments, Inc. for permission to use text from the @emph{TI Scheme Language Reference Manual}[TImanual85]. We gladly acknowledge the influence of manuals for MIT Scheme[MITScheme], T[Rees84], Scheme 84[Scheme84],Common Lisp[CLtL], and Algol 60[Naur63]. We also thank Betty Dexter for the extreme effort she put into setting this report in @TeX{}, and Donald Knuth for designing the program that caused her troubles. The Artificial Intelligence Laboratory of the Massachusetts Institute of Technology, the Computer Science Department of Indiana University, the Computer and Information Sciences Department of the University of Oregon, and the NEC Research Institute supported the preparation of this report. Support for the MIT work was provided in part by the Advanced Research Projects Agency of the Department of Defense under Office of Naval Research contract N00014-80-C-0505. Support for the Indiana University work was provided by NSF grants NCS 83-04567 and NCS 83-03325. @sp 2 @c \clearchapterstar{Description of the language} %\unskip\vskip -2ex @c @include{struct} @c 1. Structure of the language @node Overview of Scheme, Lexical conventions, Introduction, top @chapter Overview of Scheme @menu * Semantics:: * Syntax:: * Notation and terminology:: @end menu @node Semantics, Syntax, Overview of Scheme, Overview of Scheme @section Semantics This section gives an overview of Scheme's semantics. A detailed informal semantics is the subject of chapters @ref{Basic concepts} through @ref{Standard procedures}. For reference purposes, section @ref{Formal semantics} provides a formal semantics of Scheme. Following Algol, Scheme is a statically scoped programming language. Each use of a variable is associated with a lexically apparent binding of that variable. Scheme has latent as opposed to manifest types. Types are associated with values (also called objects) rather than @cindex @w{object} with variables. (Some authors refer to languages with latent types as weakly typed or dynamically typed languages.) Other languages with latent types are APL, Snobol, and other dialects of Lisp. Languages with manifest types (sometimes referred to as strongly typed or statically typed languages) include Algol 60, Pascal, and C. All objects created in the course of a Scheme computation, including procedures and continuations, have unlimited extent. No Scheme object is ever destroyed. The reason that implementations of Scheme do not (usually!) run out of storage is that they are permitted to reclaim the storage occupied by an object if they can prove that the object cannot possibly matter to any future computation. Other languages in which most objects have unlimited extent include APL and other Lisp dialects. Implementations of Scheme are required to be properly tail-recursive. This allows the execution of an iterative computation in constant space, even if the iterative computation is described by a syntactically recursive procedure. Thus with a properly tail-recursive implementation, iteration can be expressed using the ordinary procedure-call mechanics, so that special iteration constructs are useful only as syntactic sugar. See section @ref{Proper tail recursion}. Scheme procedures are objects in their own right. Procedures can be created dynamically, stored in data structures, returned as results of procedures, and so on. Other languages with these properties include Common Lisp and ML. @ignore todo Rozas: Scheme had them first. @end ignore One distinguishing feature of Scheme is that continuations, which in most other languages only operate behind the scenes, also have ``first-class'' status. Continuations are useful for implementing a wide variety of advanced control constructs, including non-local exits, backtracking, and coroutines. See section @ref{Control features}. Arguments to Scheme procedures are always passed by value, which means that the actual argument expressions are evaluated before the procedure gains control, whether the procedure needs the result of the evaluation or not. ML, C, and APL are three other languages that always pass arguments by value. This is distinct from the lazy-evaluation semantics of Haskell, or the call-by-name semantics of Algol 60, where an argument expression is not evaluated unless its value is needed by the procedure. @ignore todo Lisp's call by value should be explained more accurately. What's funny is that all values are references. @end ignore Scheme's model of arithmetic is designed to remain as independent as possible of the particular ways in which numbers are represented within a computer. In Scheme, every integer is a rational number, every rational is a real, and every real is a complex number. Thus the distinction between integer and real arithmetic, so important to many programming languages, does not appear in Scheme. In its place is a distinction between exact arithmetic, which corresponds to the mathematical ideal, and inexact arithmetic on approximations. As in Common Lisp, exact arithmetic is not limited to integers. @node Syntax, Notation and terminology, Semantics, Overview of Scheme @section Syntax Scheme, like most dialects of Lisp, employs a fully parenthesized prefix notation for programs and (other) data; the grammar of Scheme generates a sublanguage of the language used for data. An important consequence of this simple, uniform representation is the susceptibility of Scheme programs and data to uniform treatment by other Scheme programs. For example, the @samp{eval} procedure evaluates a Scheme program expressed as data. The @samp{read} procedure performs syntactic as well as lexical decomposition of the data it reads. The @samp{read} procedure parses its input as data (section @pxref{External representation}), not as program. The formal syntax of Scheme is described in section @ref{Formal syntax}. @node Notation and terminology, , Syntax, Overview of Scheme @section Notation and terminology @menu * Primitive; library; and optional features:: * Error situations and unspecified behavior:: * Entry format:: * Evaluation examples:: * Naming conventions:: @end menu @node Primitive; library; and optional features, Error situations and unspecified behavior, Notation and terminology, Notation and terminology @subsection Primitive; library; and optional features It is required that every implementation of Scheme support all features that are not marked as being @dfn{optional}. Implementations are @cindex @w{optional} free to omit optional features of Scheme or to add extensions, provided the extensions are not in conflict with the language reported here. In particular, implementations must support portable code by providing a syntactic mode that preempts no lexical conventions of this report. To aid in understanding and implementing Scheme, some features are marked as @dfn{library}. These can be easily implemented in terms of the other, @cindex @w{library} primitive, features. They are redundant in the strict sense of the word, but they capture common patterns of usage, and are therefore provided as convenient abbreviations. @node Error situations and unspecified behavior, Entry format, Primitive; library; and optional features, Notation and terminology @subsection Error situations and unspecified behavior @cindex @w{error} When speaking of an error situation, this report uses the phrase ``an error is signalled'' to indicate that implementations must detect and report the error. If such wording does not appear in the discussion of an error, then implementations are not required to detect or report the error, though they are encouraged to do so. An error situation that implementations are not required to detect is usually referred to simply as ``an error.'' For example, it is an error for a procedure to be passed an argument that the procedure is not explicitly specified to handle, even though such domain errors are seldom mentioned in this report. Implementations may extend a procedure's domain of definition to include such arguments. This report uses the phrase ``may report a violation of an implementation restriction'' to indicate circumstances under which an implementation is permitted to report that it is unable to continue execution of a correct program because of some restriction imposed by the implementation. Implementation restrictions are of course discouraged, but implementations are encouraged to report violations of implementation restrictions. @cindex @w{implementation restriction} For example, an implementation may report a violation of an implementation restriction if it does not have enough storage to run a program. If the value of an expression is said to be ``unspecified,'' then the expression must evaluate to some object without signalling an error, but the value depends on the implementation; this report explicitly does not say what value should be returned. @cindex @w{unspecified} @ignore todo Talk about unspecified behavior vs. unspecified values. @end ignore @ignore todo Look at KMP's situations paper. @end ignore @node Entry format, Evaluation examples, Error situations and unspecified behavior, Notation and terminology @subsection Entry format Chapters @ref{Expressions} and @ref{Standard procedures} are organized into entries. Each entry describes one language feature or a group of related features, where a feature is either a syntactic construct or a built-in procedure. An entry begins with one or more header lines of the form @noindent @deffn {@var{category}} @var{template} @end deffn for required, primitive features, or @noindent @deffn {@var{qualifier} @var{category}} @var{template} @end deffn where @var{qualifier} is either ``library'' or ``optional'' as defined in section @ref{Primitive; library; and optional features}. If @var{category} is ``syntax'', the entry describes an expression type, and the template gives the syntax of the expression type. Components of expressions are designated by syntactic variables, which are written using angle brackets, for example, @r{}, @r{}. Syntactic variables should be understood to denote segments of program text; for example, @r{} stands for any string of characters which is a syntactically valid expression. The notation @format @r{} @dots{} @end format indicates zero or more occurrences of a @r{}, and @format @r{} @r{} @dots{} @end format indicates one or more occurrences of a @r{}. If @var{category} is ``procedure'', then the entry describes a procedure, and the header line gives a template for a call to the procedure. Argument names in the template are @var{italicized}. Thus the header line @noindent @deffn {procedure} vector-ref @var{vector} @var{k} @end deffn indicates that the built-in procedure @t{vector-ref} takes two arguments, a vector @var{vector} and an exact non-negative integer @var{k} (see below). The header lines @noindent @deffn {procedure} make-vector @var{k} @deffnx {procedure} make-vector @var{k} @var{fill} @end deffn indicate that the @t{make-vector} procedure must be defined to take either one or two arguments. It is an error for an operation to be presented with an argument that it is not specified to handle. For succinctness, we follow the convention that if an argument name is also the name of a type listed in section @ref{Disjointness of types}, then that argument must be of the named type. For example, the header line for @t{vector-ref} given above dictates that the first argument to @t{vector-ref} must be a vector. The following naming conventions also imply type restrictions: @c \newcommand{\foo}[1]{\vr{#1}, \vri{#1}, $\ldots$ \vrj{#1}, $\ldots$} @center @c begin-tabular @quotation @table @asis @item @var{obj} any object @item @var{list}, @var{list1}, @dots{} @var{listj}, @dots{} list (see section @pxref{Pairs and lists}) @item @var{z}, @var{z1}, @dots{} @var{zj}, @dots{} complex number @item @var{x}, @var{x1}, @dots{} @var{xj}, @dots{} real number @item @var{y}, @var{y1}, @dots{} @var{yj}, @dots{} real number @item @var{q}, @var{q1}, @dots{} @var{qj}, @dots{} rational number @item @var{n}, @var{n1}, @dots{} @var{nj}, @dots{} integer @item @var{k}, @var{k1}, @dots{} @var{kj}, @dots{} exact non-negative integer @item @end table @end quotation @ignore todo Provide an example entry?? @end ignore @node Evaluation examples, Naming conventions, Entry format, Notation and terminology @subsection Evaluation examples The symbol ``@result{}'' used in program examples should be read ``evaluates to.'' For example, @example (* 5 8) ==> 40 @end example means that the expression @t{(* 5 8)} evaluates to the object @t{40}. Or, more precisely: the expression given by the sequence of characters ``@t{(* 5 8)}'' evaluates, in the initial environment, to an object that may be represented externally by the sequence of characters ``@t{40}''. See section @ref{External representations} for a discussion of external representations of objects. @node Naming conventions, , Evaluation examples, Notation and terminology @subsection Naming conventions By convention, the names of procedures that always return a boolean value usually end in ``@code{?}''. Such procedures are called predicates. @vindex @w{?} By convention, the names of procedures that store values into previously allocated locations (see section @pxref{Storage model}) usually end in ``@code{!}''. @vindex @w{!} Such procedures are called mutation procedures. By convention, the value returned by a mutation procedure is unspecified. By convention, ``@code{->}'' appears within the names of procedures that @vindex @w{->} take an object of one type and return an analogous object of another type. For example, @samp{list->vector} takes a list and returns a vector whose elements are the same as those of the list. @ignore todo Terms that need defining: thunk, command (what else?). @end ignore @c @include{lex} @c Lexical structure @c %\vfill\eject @node Lexical conventions, Basic concepts, Overview of Scheme, top @chapter Lexical conventions @menu * Identifiers:: * Whitespace and comments:: * Other notations:: @end menu This section gives an informal account of some of the lexical conventions used in writing Scheme programs. For a formal syntax of Scheme, see section @ref{Formal syntax}. Upper and lower case forms of a letter are never distinguished except within character and string constants. For example, @samp{Foo} is the same identifier as @samp{FOO}, and @t{#x1AB} is the same number as @t{#X1ab}. @node Identifiers, Whitespace and comments, Lexical conventions, Lexical conventions @section Identifiers Most identifiers allowed by other programming @cindex @w{identifier} languages are also acceptable to Scheme. The precise rules for forming identifiers vary among implementations of Scheme, but in all implementations a sequence of letters, digits, and ``extended alphabetic characters'' that begins with a character that cannot begin a number is an identifier. In addition, @code{+}, @code{-}, and @code{...} are identifiers. @vindex @w{...} @vindex @w{-} @vindex @w{+} Here are some examples of identifiers: @example lambda q list->vector soup + V17a <=? a34kTMNs the-word-recursion-has-many-meanings @end example Extended alphabetic characters may be used within identifiers as if they were letters. The following are extended alphabetic characters: @example ! $ % & * + - . / : < = > ? @@ ^ _ ~ @end example See section @ref{Lexical structure} for a formal syntax of identifiers. Identifiers have two uses within Scheme programs: @itemize @bullet @item Any identifier may be used as a variable or as a syntactic keyword (see sections @pxref{Variables; syntactic keywords; and regions} and @pxref{Macros}). @item When an identifier appears as a literal or within a literal (see section @pxref{Literal expressions}), it is being used to denote a @emph{symbol} (see section @pxref{Symbols}). @end itemize @cindex @w{syntactic keyword} @cindex @w{variable} @c \label{keywordsection} @c The following identifiers are syntactic keywords, and should not be used @c as variables: @c \begin{scheme} @c => do or @c and else quasiquote @c begin if quote @c case lambda set! @c cond let unquote @c define let* unquote-splicing @c delay letrec% @c \end{scheme} @c Some implementations allow all identifiers, including syntactic @c keywords, to be used as variables. This is a compatible extension to @c the language, but ambiguities in the language result when the @c restriction is relaxed, and the ways in which these ambiguities are @c resolved vary between implementations. @node Whitespace and comments, Other notations, Identifiers, Lexical conventions @section Whitespace and comments @dfn{Whitespace} characters are spaces and newlines. @cindex @w{Whitespace} (Implementations typically provide additional whitespace characters such as tab or page break.) Whitespace is used for improved readability and as necessary to separate tokens from each other, a token being an indivisible lexical unit such as an identifier or number, but is otherwise insignificant. Whitespace may occur between any two tokens, but not within a token. Whitespace may also occur inside a string, where it is significant. A semicolon (@t{;}) indicates the start of a comment. The comment continues to the @cindex @w{;} @cindex @w{comment} end of the line on which the semicolon appears. Comments are invisible to Scheme, but the end of the line is visible as whitespace. This prevents a comment from appearing in the middle of an identifier or number. @example ;;; The FACT procedure computes the factorial ;;; of a non-negative integer. (define fact (lambda (n) (if (= n 0) 1 ;Base case: return 1 (* n (fact (- n 1)))))) @end example @node Other notations, , Whitespace and comments, Lexical conventions @section Other notations @ignore todo Rewrite? @end ignore For a description of the notations used for numbers, see section @ref{Numbers}. @table @t @item @t{.@: + -} These are used in numbers, and may also occur anywhere in an identifier except as the first character. A delimited plus or minus sign by itself is also an identifier. A delimited period (not occurring within a number or identifier) is used in the notation for pairs (section @pxref{Pairs and lists}), and to indicate a rest-parameter in a formal parameter list (section @pxref{Procedures}). A delimited sequence of three successive periods is also an identifier. @item @t{( )} Parentheses are used for grouping and to notate lists (section @pxref{Pairs and lists}). @item @t{'} The single quote character is used to indicate literal data (section @pxref{Literal expressions}). @item @t{`} The backquote character is used to indicate almost-constant data (section @pxref{Quasiquotation}). @item @t{, ,@@} The character comma and the sequence comma at-sign are used in conjunction with backquote (section @pxref{Quasiquotation}). @item @t{"} The double quote character is used to delimit strings (section @pxref{Strings}). @item \ Backslash is used in the syntax for character constants (section @pxref{Characters}) and as an escape character within string constants (section @pxref{Strings}). @c A box used because \verb is not allowed in command arguments. @item @w{@t{[ ] @{ @} |}} Left and right square brackets and curly braces and vertical bar are reserved for possible future extensions to the language. @item # Sharp sign is used for a variety of purposes depending on the character that immediately follows it: @item @t{#t} @t{#f} These are the boolean constants (section @pxref{Booleans}). @item #\ This introduces a character constant (section @pxref{Characters}). @item #@t{(} This introduces a vector constant (section @pxref{Vectors}). Vector constants are terminated by @t{)} . @item @t{#e #i #b #o #d #x} These are used in the notation for numbers (section @pxref{Syntax of numerical constants}). @end table @c @include{basic} @c \vfill\eject @node Basic concepts, Expressions, Lexical conventions, top @chapter Basic concepts @menu * Variables; syntactic keywords; and regions:: * Disjointness of types:: * External representations:: * Storage model:: * Proper tail recursion:: @end menu @node Variables; syntactic keywords; and regions, Disjointness of types, Basic concepts, Basic concepts @section Variables; syntactic keywords; and regions An identifier may name a type of syntax, or it may name @cindex @w{identifier} a location where a value can be stored. An identifier that names a type of syntax is called a @emph{syntactic keyword} @cindex @w{syntactic keyword} and is said to be @emph{bound} to that syntax. An identifier that names a location is called a @emph{variable} and is said to be @cindex @w{variable} @emph{bound} to that location. The set of all visible bindings in effect at some point in a program is @cindex @w{binding} known as the @emph{environment} in effect at that point. The value stored in the location to which a variable is bound is called the variable's value. By abuse of terminology, the variable is sometimes said to name the value or to be bound to the value. This is not quite accurate, but confusion rarely results from this practice. @ignore todo Define ``assigned'' and ``unassigned'' perhaps? @end ignore @ignore todo In programs without side effects, one can safely pretend that the variables are bound directly to the arguments. Or: In programs without @code{set!}, one can safely pretend that the @vindex @w{set!} variable is bound directly to the value. @end ignore Certain expression types are used to create new kinds of syntax and bind syntactic keywords to those new syntaxes, while other expression types create new locations and bind variables to those locations. These expression types are called @emph{binding constructs}. @cindex @w{binding construct} Those that bind syntactic keywords are listed in section @ref{Macros}. The most fundamental of the variable binding constructs is the @samp{lambda} expression, because all other variable binding constructs can be explained in terms of @samp{lambda} expressions. The other variable binding constructs are @samp{let}, @samp{let*}, @samp{letrec}, and @samp{do} expressions (see sections @pxref{Procedures}, @pxref{Binding constructs}, and @pxref{Iteration}). @c Note: internal definitions not mentioned here. Like Algol and Pascal, and unlike most other dialects of Lisp except for Common Lisp, Scheme is a statically scoped language with block structure. To each place where an identifier is bound in a program there corresponds a @dfn{region} of the program text within which @cindex @w{region} the binding is visible. The region is determined by the particular binding construct that establishes the binding; if the binding is established by a @samp{lambda} expression, for example, then its region is the entire @samp{lambda} expression. Every mention of an identifier refers to the binding of the identifier that established the innermost of the regions containing the use. If there is no binding of the identifier whose region contains the use, then the use refers to the binding for the variable in the top level environment, if any (chapters @pxref{Expressions} and @pxref{Standard procedures}); if there is no binding for the identifier, it is said to be @dfn{unbound}. @cindex @w{top level environment} @cindex @w{bound} @cindex @w{unbound} @ignore todo Mention that some implementations have multiple top level environments? @end ignore @ignore todo Pitman sez: needs elaboration in case of @t{(let ...)} @end ignore @ignore todo Pitman asks: say something about vars created after scheme starts? @t{(define x 3) (define (f) x) (define (g) y) (define y 4)} Clinger replies: The language was explicitly designed to permit a view in which no variables are created after Scheme starts. In files, you can scan out the definitions beforehand. I think we're agreed on the principle that interactive use should approximate that behavior as closely as possible, though we don't yet agree on which programming environment provides the best approximation. @end ignore @node Disjointness of types, External representations, Variables; syntactic keywords; and regions, Basic concepts @section Disjointness of types No object satisfies more than one of the following predicates: @example boolean? pair? symbol? number? char? string? vector? port? procedure? @end example These predicates define the types @emph{boolean}, @emph{pair}, @emph{symbol}, @emph{number}, @emph{char} (or @emph{character}), @emph{string}, @emph{vector}, @emph{port}, and @emph{procedure}. The empty list is a special object of its own type; it satisfies none of the above predicates. @vindex symbol? @vindex pair? @vindex boolean? @cindex @w{type} @vindex vector? @vindex string? @vindex char? @vindex number? @cindex @w{empty list} @vindex procedure? @vindex port? Although there is a separate boolean type, any Scheme value can be used as a boolean value for the purpose of a conditional test. As explained in section @ref{Booleans}, all values count as true in such a test except for @t{#f}. @c and possibly the empty list. @c The only value that is guaranteed to count as @c false is \schfalse{}. It is explicitly unspecified whether the empty list @c counts as true or as false. This report uses the word ``true'' to refer to any Scheme value except @t{#f}, and the word ``false'' to refer to @t{#f}. @cindex @w{false} @cindex @w{true} @node External representations, Storage model, Disjointness of types, Basic concepts @section External representations An important concept in Scheme (and Lisp) is that of the @emph{external representation} of an object as a sequence of characters. For example, an external representation of the integer 28 is the sequence of characters ``@t{28}'', and an external representation of a list consisting of the integers 8 and 13 is the sequence of characters ``@t{(8 13)}''. The external representation of an object is not necessarily unique. The integer 28 also has representations ``@t{#e28.000}'' and ``@t{#x1c}'', and the list in the previous paragraph also has the representations ``@t{( 08 13 )}'' and ``@t{(8 .@: (13 .@: ()))}'' (see section @pxref{Pairs and lists}). Many objects have standard external representations, but some, such as procedures, do not have standard representations (although particular implementations may define representations for them). An external representation may be written in a program to obtain the corresponding object (see @samp{quote}, section @pxref{Literal expressions}). External representations can also be used for input and output. The procedure @samp{read} (section @pxref{Input}) parses external representations, and the procedure @samp{write} (section @pxref{Output}) generates them. Together, they provide an elegant and powerful input/output facility. Note that the sequence of characters ``@t{(+ 2 6)}'' is @emph{not} an external representation of the integer 8, even though it @emph{is} an expression evaluating to the integer 8; rather, it is an external representation of a three-element list, the elements of which are the symbol @t{+} and the integers 2 and 6. Scheme's syntax has the property that any sequence of characters that is an expression is also the external representation of some object. This can lead to confusion, since it may not be obvious out of context whether a given sequence of characters is intended to denote data or program, but it is also a source of power, since it facilitates writing programs such as interpreters and compilers that treat programs as data (or vice versa). The syntax of external representations of various kinds of objects accompanies the description of the primitives for manipulating the objects in the appropriate sections of chapter @ref{Standard procedures}. @node Storage model, Proper tail recursion, External representations, Basic concepts @section Storage model Variables and objects such as pairs, vectors, and strings implicitly denote locations or sequences of locations. A string, for @cindex @w{location} example, denotes as many locations as there are characters in the string. (These locations need not correspond to a full machine word.) A new value may be stored into one of these locations using the @t{string-set!} procedure, but the string continues to denote the same locations as before. An object fetched from a location, by a variable reference or by a procedure such as @samp{car}, @samp{vector-ref}, or @samp{string-ref}, is equivalent in the sense of @code{eqv?} @c and \ide{eq?} ?? (section @pxref{Equivalence predicates}) @vindex @w{eqv?} to the object last stored in the location before the fetch. Every location is marked to show whether it is in use. No variable or object ever refers to a location that is not in use. Whenever this report speaks of storage being allocated for a variable or object, what is meant is that an appropriate number of locations are chosen from the set of locations that are not in use, and the chosen locations are marked to indicate that they are now in use before the variable or object is made to denote them. In many systems it is desirable for constants (i.e. the values of @cindex @w{constant} literal expressions) to reside in read-only-memory. To express this, it is convenient to imagine that every object that denotes locations is associated with a flag telling whether that object is mutable or @cindex @w{mutable} immutable. In such systems literal constants and the strings @cindex @w{immutable} returned by @code{symbol->string} are immutable objects, while all objects @vindex @w{symbol->string} created by the other procedures listed in this report are mutable. It is an error to attempt to store a new value into a location that is denoted by an immutable object. @node Proper tail recursion, , Storage model, Basic concepts @section Proper tail recursion Implementations of Scheme are required to be @emph{properly tail-recursive}. @cindex @w{proper tail recursion} Procedure calls that occur in certain syntactic contexts defined below are `tail calls'. A Scheme implementation is properly tail-recursive if it supports an unbounded number of active tail calls. A call is @emph{active} if the called procedure may still return. Note that this includes calls that may be returned from either by the current continuation or by continuations captured earlier by @samp{call-with-current-continuation} that are later invoked. In the absence of captured continuations, calls could return at most once and the active calls would be those that had not yet returned. A formal definition of proper tail recursion can be found in [propertailrecursion]. @quotation @emph{Rationale:} Intuitively, no space is needed for an active tail call because the continuation that is used in the tail call has the same semantics as the continuation passed to the procedure containing the call. Although an improper implementation might use a new continuation in the call, a return to this new continuation would be followed immediately by a return to the continuation passed to the procedure. A properly tail-recursive implementation returns to that continuation directly. Proper tail recursion was one of the central ideas in Steele and Sussman's original version of Scheme. Their first Scheme interpreter implemented both functions and actors. Control flow was expressed using actors, which differed from functions in that they passed their results on to another actor instead of returning to a caller. In the terminology of this section, each actor finished with a tail call to another actor. Steele and Sussman later observed that in their interpreter the code for dealing with actors was identical to that for functions and thus there was no need to include both in the language. @end quotation A @emph{tail call} is a procedure call that occurs @cindex @w{tail call} in a @emph{tail context}. Tail contexts are defined inductively. Note that a tail context is always determined with respect to a particular lambda expression. @itemize @bullet @item The last expression within the body of a lambda expression, shown as @r{} below, occurs in a tail context. @format @t{(lambda * * ) } @end format @item If one of the following expressions is in a tail context, then the subexpressions shown as are in a tail context. These were derived from rules in the grammar given in chapter @ref{Formal syntax and semantics} by replacing some occurrences of with . Only those rules that contain tail contexts are shown here. @format @t{(if ) (if ) (cond +) (cond * (else )) (case +) (case * (else )) (and * ) (or * ) (let (*) ) (let (*) ) (let* (*) ) (letrec (*) ) (let-syntax (*) ) (letrec-syntax (*) ) (begin ) (do (*) ( ) *) @r{where} --> ( ) --> ((*) ) --> * --> * } @end format @item If a @samp{cond} expression is in a tail context, and has a clause of the form @samp{(@r{} => @r{})} then the (implied) call to the procedure that results from the evaluation of @r{} is in a tail context. @r{} itself is not in a tail context. @end itemize Certain built-in procedures are also required to perform tail calls. The first argument passed to @code{apply} and to @vindex @w{apply} @code{call-with-current-continuation}, and the second argument passed to @vindex @w{call-with-current-continuation} @code{call-with-values}, must be called via a tail call. @vindex @w{call-with-values} Similarly, @code{eval} must evaluate its argument as if it @vindex @w{eval} were in tail position within the @code{eval} procedure. @vindex @w{eval} In the following example the only tail call is the call to @samp{f}. None of the calls to @samp{g} or @samp{h} are tail calls. The reference to @samp{x} is in a tail context, but it is not a call and thus is not a tail call. @example (lambda () (if (g) (let ((x (h))) x) (and (g) (f)))) @end example @quotation @emph{Note:} Implementations are allowed, but not required, to recognize that some non-tail calls, such as the call to @samp{h} above, can be evaluated as though they were tail calls. In the example above, the @samp{let} expression could be compiled as a tail call to @samp{h}. (The possibility of @samp{h} returning an unexpected number of values can be ignored, because in that case the effect of the @samp{let} is explicitly unspecified and implementation-dependent.) @end quotation @c @include{expr} @c \vfill\eject @node Expressions, Program structure, Basic concepts, top @chapter Expressions @menu * Primitive expression types:: * Derived expression types:: * Macros:: @end menu @c \newcommand{\syntax}{{\em Syntax: }} @c \newcommand{\semantics}{{\em Semantics: }} @c [Deleted for R5RS because of multiple-value returns. -RK] @c A Scheme expression is a construct that returns a value, such as a @c variable reference, literal, procedure call, or conditional. Expression types are categorized as @emph{primitive} or @emph{derived}. Primitive expression types include variables and procedure calls. Derived expression types are not semantically primitive, but can instead be defined as macros. With the exception of @samp{quasiquote}, whose macro definition is complex, the derived expressions are classified as library features. Suitable definitions are given in section @ref{Derived expression type}. @node Primitive expression types, Derived expression types, Expressions, Expressions @section Primitive expression types @menu * Variable references:: * Literal expressions:: * Procedure calls:: * Procedures:: * Conditionals:: * Assignments:: @end menu @node Variable references, Literal expressions, Primitive expression types, Primitive expression types @subsection Variable references @deffn {syntax} @r{} An expression consisting of a variable @cindex @w{variable} (section @pxref{Variables; syntactic keywords; and regions}) is a variable reference. The value of the variable reference is the value stored in the location to which the variable is bound. It is an error to reference an unbound variable. @cindex @w{unbound} @format @t{(define x 28) x ==> 28 } @end format @end deffn @node Literal expressions, Procedure calls, Variable references, Primitive expression types @subsection Literal expressions @deffn {syntax} quote @r{} @deffnx {syntax} @t{'}@r{} @deffnx {syntax} @r{} @samp{(quote @r{})} evaluates to @r{}. @cindex @w{'} @r{} may be any external representation of a Scheme object (see section @pxref{External representations}). This notation is used to include literal constants in Scheme code. @format @t{ (quote a) ==> a (quote #(a b c)) ==> #(a b c) (quote (+ 1 2)) ==> (+ 1 2) } @end format @samp{(quote @r{})} may be abbreviated as @t{'}@r{}. The two notations are equivalent in all respects. @format @t{'a ==> a '#(a b c) ==> #(a b c) '() ==> () '(+ 1 2) ==> (+ 1 2) '(quote a) ==> (quote a) ''a ==> (quote a) } @end format Numerical constants, string constants, character constants, and boolean constants evaluate ``to themselves''; they need not be quoted. @format @t{'"abc" ==> "abc" "abc" ==> "abc" '145932 ==> 145932 145932 ==> 145932 '#t ==> #t #t ==> #t } @end format As noted in section @ref{Storage model}, it is an error to alter a constant (i.e. the value of a literal expression) using a mutation procedure like @samp{set-car!} or @samp{string-set!}. @end deffn @node Procedure calls, Procedures, Literal expressions, Primitive expression types @subsection Procedure calls @deffn {syntax} @r{} @r{} @dots{}, A procedure call is written by simply enclosing in parentheses expressions for the procedure to be called and the arguments to be passed to it. The operator and operand expressions are evaluated (in an unspecified order) and the resulting procedure is passed the resulting arguments. @cindex @w{procedure call} @cindex @w{call} @format @t{ (+ 3 4) ==> 7 ((if #f + *) 3 4) ==> 12 } @end format A number of procedures are available as the values of variables in the initial environment; for example, the addition and multiplication procedures in the above examples are the values of the variables @samp{+} and @samp{*}. New procedures are created by evaluating lambda expressions (see section @pxref{Procedures}). @ignore todo At Friedman's request, flushed mention of other ways. @end ignore @c or definitions (see section~\ref{define}). Procedure calls may return any number of values (see @code{values} in @vindex @w{values} section @pxref{Control features}). With the exception of @samp{values} the procedures available in the initial environment return one value or, for procedures such as @samp{apply}, pass on the values returned by a call to one of their arguments. Procedure calls are also called @emph{combinations}. @cindex @w{combination} @quotation @emph{Note:} In contrast to other dialects of Lisp, the order of evaluation is unspecified, and the operator expression and the operand expressions are always evaluated with the same evaluation rules. @end quotation @quotation @emph{Note:} Although the order of evaluation is otherwise unspecified, the effect of any concurrent evaluation of the operator and operand expressions is constrained to be consistent with some sequential order of evaluation. The order of evaluation may be chosen differently for each procedure call. @end quotation @quotation @emph{Note:} In many dialects of Lisp, the empty combination, @t{()}, is a legitimate expression. In Scheme, combinations must have at least one subexpression, so @t{()} is not a syntactically valid expression. @ignore todo Dybvig: ``it should be obvious from the syntax.'' @end ignore @end quotation @ignore todo Freeman: I think an explanation as to why evaluation order is not specified should be included. It should not include any reference to parallel evaluation. Does any existing compiler generate better code because the evaluation order is unspecified? Clinger: yes: T3, MacScheme v2, probably MIT Scheme and Chez Scheme. But that's not the main reason for leaving the order unspecified. @end ignore @end deffn @node Procedures, Conditionals, Procedure calls, Primitive expression types @subsection Procedures @deffn {syntax} lambda @r{} @r{} @emph{Syntax:} @r{} should be a formal arguments list as described below, and @r{} should be a sequence of one or more expressions. @emph{Semantics:} A lambda expression evaluates to a procedure. The environment in effect when the lambda expression was evaluated is remembered as part of the procedure. When the procedure is later called with some actual arguments, the environment in which the lambda expression was evaluated will be extended by binding the variables in the formal argument list to fresh locations, the corresponding actual argument values will be stored in those locations, and the expressions in the body of the lambda expression will be evaluated sequentially in the extended environment. The result(s) of the last expression in the body will be returned as the result(s) of the procedure call. @format @t{(lambda (x) (+ x x)) ==> @emph{}a procedure ((lambda (x) (+ x x)) 4) ==> 8 (define reverse-subtract (lambda (x y) (- y x))) (reverse-subtract 7 10) ==> 3 (define add4 (let ((x 4)) (lambda (y) (+ x y)))) (add4 6) ==> 10 } @end format @r{} should have one of the following forms: @itemize @bullet @item @t{(@r{} @dots{},)}: The procedure takes a fixed number of arguments; when the procedure is called, the arguments will be stored in the bindings of the corresponding variables. @item @r{}: The procedure takes any number of arguments; when the procedure is called, the sequence of actual arguments is converted into a newly allocated list, and the list is stored in the binding of the @r{}. @item @t{(@r{} @dots{}, @r{} @b{.} @r{})}: If a space-delimited period precedes the last variable, then the procedure takes n or more arguments, where n is the number of formal arguments before the period (there must be at least one). The value stored in the binding of the last variable will be a newly allocated list of the actual arguments left over after all the other actual arguments have been matched up against the other formal arguments. @end itemize It is an error for a @r{} to appear more than once in @r{}. @format @t{((lambda x x) 3 4 5 6) ==> (3 4 5 6) ((lambda (x y . z) z) 3 4 5 6) ==> (5 6) } @end format Each procedure created as the result of evaluating a lambda expression is (conceptually) tagged with a storage location, in order to make @code{eqv?} and @vindex @w{eqv?} @code{eq?} work on procedures (see section @pxref{Equivalence predicates}). @vindex @w{eq?} @end deffn @node Conditionals, Assignments, Procedures, Primitive expression types @subsection Conditionals @deffn {syntax} if @r{} @r{} @r{} @deffnx {syntax} if @r{} @r{} @c \/ if hyper = italic @emph{Syntax:} @r{}, @r{}, and @r{} may be arbitrary expressions. @emph{Semantics:} An @samp{if} expression is evaluated as follows: first, @r{} is evaluated. If it yields a true value (see @cindex @w{true} section @pxref{Booleans}), then @r{} is evaluated and its value(s) is(are) returned. Otherwise @r{} is evaluated and its value(s) is(are) returned. If @r{} yields a false value and no @r{} is specified, then the result of the expression is unspecified. @format @t{(if (> 3 2) 'yes 'no) ==> yes (if (> 2 3) 'yes 'no) ==> no (if (> 3 2) (- 3 2) (+ 3 2)) ==> 1 } @end format @end deffn @node Assignments, , Conditionals, Primitive expression types @subsection Assignments @deffn {syntax} set! @r{} @r{} @r{} is evaluated, and the resulting value is stored in the location to which @r{} is bound. @r{} must be bound either in some region enclosing the @samp{set!} expression @cindex @w{region} or at top level. The result of the @samp{set!} expression is unspecified. @format @t{(define x 2) (+ x 1) ==> 3 (set! x 4) ==> @emph{unspecified} (+ x 1) ==> 5 } @end format @end deffn @node Derived expression types, Macros, Primitive expression types, Expressions @section Derived expression types @menu * Conditional:: * Binding constructs:: * Sequencing:: * Iteration:: * Delayed evaluation:: * Quasiquotation:: @end menu The constructs in this section are hygienic, as discussed in section @ref{Macros}. For reference purposes, section @ref{Derived expression type} gives macro definitions that will convert most of the constructs described in this section into the primitive constructs described in the previous section. @ignore todo Mention that no definition of backquote is provided? @end ignore @node Conditional, Binding constructs, Derived expression types, Derived expression types @subsection Conditionals @deffn {library syntax} cond @dots{}, @emph{Syntax:} Each @r{} should be of the form @format @t{(@r{} @r{} @dots{},) } @end format where @r{} is any expression. Alternatively, a @r{} may be of the form @format @t{(@r{} => @r{}) } @end format The last @r{} may be an ``else clause,'' which has the form @format @t{(else @r{} @r{} @dots{},)@r{.} } @end format @cindex @w{else} @cindex @w{=>} @emph{Semantics:} A @samp{cond} expression is evaluated by evaluating the @r{} expressions of successive @r{}s in order until one of them evaluates to a true value (see @cindex @w{true} section @pxref{Booleans}). When a @r{} evaluates to a true value, then the remaining @r{}s in its @r{} are evaluated in order, and the result(s) of the last @r{} in the @r{} is(are) returned as the result(s) of the entire @samp{cond} expression. If the selected @r{} contains only the @r{} and no @r{}s, then the value of the @r{} is returned as the result. If the selected @r{} uses the @code{=>} alternate form, then the @r{} is evaluated. @vindex @w{=>} Its value must be a procedure that accepts one argument; this procedure is then called on the value of the @r{} and the value(s) returned by this procedure is(are) returned by the @samp{cond} expression. If all @r{}s evaluate to false values, and there is no else clause, then the result of the conditional expression is unspecified; if there is an else clause, then its @r{}s are evaluated, and the value(s) of the last one is(are) returned. @format @t{(cond ((> 3 2) 'greater) ((< 3 2) 'less)) ==> greater (cond ((> 3 3) 'greater) ((< 3 3) 'less) (else 'equal)) ==> equal (cond ((assv 'b '((a 1) (b 2))) => cadr) (else #f)) ==> 2 } @end format @end deffn @deffn {library syntax} case @r{} @dots{}, @emph{Syntax:} @r{} may be any expression. Each @r{} should have the form @format @t{((@r{} @dots{},) @r{} @r{} @dots{},)@r{,} } @end format where each @r{} is an external representation of some object. All the @r{}s must be distinct. The last @r{} may be an ``else clause,'' which has the form @format @t{(else @r{} @r{} @dots{},)@r{.} } @end format @vindex else @emph{Semantics:} A @samp{case} expression is evaluated as follows. @r{} is evaluated and its result is compared against each @r{}. If the result of evaluating @r{} is equivalent (in the sense of @samp{eqv?}; see section @pxref{Equivalence predicates}) to a @r{}, then the expressions in the corresponding @r{} are evaluated from left to right and the result(s) of the last expression in the @r{} is(are) returned as the result(s) of the @samp{case} expression. If the result of evaluating @r{} is different from every @r{}, then if there is an else clause its expressions are evaluated and the result(s) of the last is(are) the result(s) of the @samp{case} expression; otherwise the result of the @samp{case} expression is unspecified. @format @t{(case (* 2 3) ((2 3 5 7) 'prime) ((1 4 6 8 9) 'composite)) ==> composite (case (car '(c d)) ((a) 'a) ((b) 'b)) ==> @emph{unspecified} (case (car '(c d)) ((a e i o u) 'vowel) ((w y) 'semivowel) (else 'consonant)) ==> consonant } @end format @end deffn @deffn {library syntax} and @dots{}, The @r{} expressions are evaluated from left to right, and the value of the first expression that evaluates to a false value (see section @pxref{Booleans}) is returned. Any remaining expressions are not evaluated. If all the expressions evaluate to true values, the value of the last expression is returned. If there are no expressions then @t{#t} is returned. @format @t{(and (= 2 2) (> 2 1)) ==> #t (and (= 2 2) (< 2 1)) ==> #f (and 1 2 'c '(f g)) ==> (f g) (and) ==> #t } @end format @end deffn @deffn {library syntax} or @dots{}, The @r{} expressions are evaluated from left to right, and the value of the first expression that evaluates to a true value (see section @pxref{Booleans}) is returned. Any remaining expressions are not evaluated. If all expressions evaluate to false values, the value of the last expression is returned. If there are no expressions then @t{#f} is returned. @format @t{(or (= 2 2) (> 2 1)) ==> #t (or (= 2 2) (< 2 1)) ==> #t (or #f #f #f) ==> #f (or (memq 'b '(a b c)) (/ 3 0)) ==> (b c) } @end format @end deffn @node Binding constructs, Sequencing, Conditional, Derived expression types @subsection Binding constructs The three binding constructs @samp{let}, @samp{let*}, and @samp{letrec} give Scheme a block structure, like Algol 60. The syntax of the three constructs is identical, but they differ in the regions they establish @cindex @w{region} for their variable bindings. In a @samp{let} expression, the initial values are computed before any of the variables become bound; in a @samp{let*} expression, the bindings and evaluations are performed sequentially; while in a @samp{letrec} expression, all the bindings are in effect while their initial values are being computed, thus allowing mutually recursive definitions. @deffn {library syntax} let @r{} @r{} @emph{Syntax:} @r{} should have the form @format @t{((@r{} @r{}) @dots{},)@r{,} } @end format where each @r{} is an expression, and @r{} should be a sequence of one or more expressions. It is an error for a @r{} to appear more than once in the list of variables being bound. @emph{Semantics:} The @r{}s are evaluated in the current environment (in some unspecified order), the @r{}s are bound to fresh locations holding the results, the @r{} is evaluated in the extended environment, and the value(s) of the last expression of @r{} is(are) returned. Each binding of a @r{} has @r{} as its region. @cindex @w{region} @format @t{(let ((x 2) (y 3)) (* x y)) ==> 6 (let ((x 2) (y 3)) (let ((x 7) (z (+ x y))) (* z x))) ==> 35 } @end format See also named @samp{let}, section @ref{Iteration}. @end deffn @deffn {library syntax} let* @r{} @r{} @emph{Syntax:} @r{} should have the form @format @t{((@r{} @r{}) @dots{},)@r{,} } @end format and @r{} should be a sequence of one or more expressions. @emph{Semantics:} @samp{Let*} is similar to @samp{let}, but the bindings are performed sequentially from left to right, and the region of a binding indicated @cindex @w{region} by @samp{(@r{} @r{})} is that part of the @samp{let*} expression to the right of the binding. Thus the second binding is done in an environment in which the first binding is visible, and so on. @format @t{(let ((x 2) (y 3)) (let* ((x 7) (z (+ x y))) (* z x))) ==> 70 } @end format @end deffn @deffn {library syntax} letrec @r{} @r{} @emph{Syntax:} @r{} should have the form @format @t{((@r{} @r{}) @dots{},)@r{,} } @end format and @r{} should be a sequence of one or more expressions. It is an error for a @r{} to appear more than once in the list of variables being bound. @emph{Semantics:} The @r{}s are bound to fresh locations holding undefined values, the @r{}s are evaluated in the resulting environment (in some unspecified order), each @r{} is assigned to the result of the corresponding @r{}, the @r{} is evaluated in the resulting environment, and the value(s) of the last expression in @r{} is(are) returned. Each binding of a @r{} has the entire @samp{letrec} expression as its region, making it possible to @cindex @w{region} define mutually recursive procedures. @format @t{(letrec ((even? (lambda (n) (if (zero? n) #t (odd? (- n 1))))) (odd? (lambda (n) (if (zero? n) #f (even? (- n 1)))))) (even? 88)) ==> #t } @end format One restriction on @samp{letrec} is very important: it must be possible to evaluate each @r{} without assigning or referring to the value of any @r{}. If this restriction is violated, then it is an error. The restriction is necessary because Scheme passes arguments by value rather than by name. In the most common uses of @samp{letrec}, all the @r{}s are lambda expressions and the restriction is satisfied automatically. @c \todo{use or uses? --- Jinx.} @end deffn @node Sequencing, Iteration, Binding constructs, Derived expression types @subsection Sequencing @deffn {library syntax} begin @dots{}, The @r{}s are evaluated sequentially from left to right, and the value(s) of the last @r{} is(are) returned. This expression type is used to sequence side effects such as input and output. @format @t{(define x 0) (begin (set! x 5) (+ x 1)) ==> 6 (begin (display "4 plus 1 equals ") (display (+ 4 1))) ==> @emph{unspecified} @emph{and prints} 4 plus 1 equals 5 } @end format @end deffn @node Iteration, Delayed evaluation, Sequencing, Derived expression types @subsection Iteration @c \unsection @noindent @deffn {library syntax} do ((@r{} @r{} @r{}) @dots{}) (@r{} @r{} @dots{}) @r{} @dots{} @cindex @w{do} @samp{Do} is an iteration construct. It specifies a set of variables to be bound, how they are to be initialized at the start, and how they are to be updated on each iteration. When a termination condition is met, the loop exits after evaluating the @r{}s. @samp{Do} expressions are evaluated as follows: The @r{} expressions are evaluated (in some unspecified order), the @r{}s are bound to fresh locations, the results of the @r{} expressions are stored in the bindings of the @r{}s, and then the iteration phase begins. Each iteration begins by evaluating @r{}; if the result is false (see section @pxref{Booleans}), then the @r{} expressions are evaluated in order for effect, the @r{} expressions are evaluated in some unspecified order, the @r{}s are bound to fresh locations, the results of the @r{}s are stored in the bindings of the @r{}s, and the next iteration begins. If @r{} evaluates to a true value, then the @r{}s are evaluated from left to right and the value(s) of the last @r{} is(are) returned. If no @r{}s are present, then the value of the @samp{do} expression is unspecified. The region of the binding of a @r{} @cindex @w{region} consists of the entire @samp{do} expression except for the @r{}s. It is an error for a @r{} to appear more than once in the list of @samp{do} variables. A @r{} may be omitted, in which case the effect is the same as if @samp{(@r{} @r{} @r{})} had been written instead of @samp{(@r{} @r{})}. @format @t{(do ((vec (make-vector 5)) (i 0 (+ i 1))) ((= i 5) vec) (vector-set! vec i i)) ==> #(0 1 2 3 4) (let ((x '(1 3 5 7 9))) (do ((x x (cdr x)) (sum 0 (+ sum (car x)))) ((null? x) sum))) ==> 25 } @end format @c \end{entry} @end deffn @deffn {library syntax} let @r{} @r{} @r{} ``Named @samp{let}'' is a variant on the syntax of @code{let} which provides @vindex @w{let} a more general looping construct than @samp{do} and may also be used to express recursions. It has the same syntax and semantics as ordinary @samp{let} except that @r{} is bound within @r{} to a procedure whose formal arguments are the bound variables and whose body is @r{}. Thus the execution of @r{} may be repeated by invoking the procedure named by @r{}. @c | <-- right margin @format @t{(let loop ((numbers '(3 -2 1 6 -5)) (nonneg '()) (neg '())) (cond ((null? numbers) (list nonneg neg)) ((>= (car numbers) 0) (loop (cdr numbers) (cons (car numbers) nonneg) neg)) ((< (car numbers) 0) (loop (cdr numbers) nonneg (cons (car numbers) neg))))) ==> ((6 1 3) (-5 -2)) } @end format @end deffn @node Delayed evaluation, Quasiquotation, Iteration, Derived expression types @subsection Delayed evaluation @deffn {library syntax} delay @r{} @ignore todo Fix. @end ignore The @samp{delay} construct is used together with the procedure @code{force} to @vindex @w{force} implement @dfn{lazy evaluation} or @dfn{call by need}. @cindex @w{call by need} @cindex @w{lazy evaluation} @t{(delay @r{})} returns an object called a @dfn{promise} which at some point in the future may be asked (by @cindex @w{promise} the @samp{force} procedure) @ignore todo Bartley's white lie; OK? @end ignore to evaluate @r{}, and deliver the resulting value. The effect of @r{} returning multiple values is unspecified. See the description of @samp{force} (section @pxref{Control features}) for a more complete description of @samp{delay}. @end deffn @node Quasiquotation, , Delayed evaluation, Derived expression types @subsection Quasiquotation @deffn {syntax} quasiquote @r{} @deffnx {syntax} @t{`}@r{} ``Backquote'' or ``quasiquote'' expressions are useful @cindex @w{backquote} for constructing a list or vector structure when most but not all of the desired structure is known in advance. If no commas appear within the @r{}, the result of @cindex @w{comma} evaluating @t{`}@r{} is equivalent to the result of evaluating @t{'}@r{}. If a comma appears within the @cindex @w{,} @r{}, however, the expression following the comma is evaluated (``unquoted'') and its result is inserted into the structure instead of the comma and the expression. If a comma appears followed immediately by an at-sign (@@), then the following @cindex @w{,@@} expression must evaluate to a list; the opening and closing parentheses of the list are then ``stripped away'' and the elements of the list are inserted in place of the comma at-sign expression sequence. A comma at-sign should only appear within a list or vector @r{}. @c struck: "(in the sense of {\cf equal?})" after "equivalent" @format @t{`(list ,(+ 1 2) 4) ==> (list 3 4) (let ((name 'a)) `(list ,name ',name)) ==> (list a (quote a)) `(a ,(+ 1 2) ,@@(map abs '(4 -5 6)) b) ==> (a 3 4 5 6 b) `((@samp{foo} ,(- 10 3)) ,@@(cdr '(c)) . ,(car '(cons))) ==> ((foo 7) . cons) `#(10 5 ,(sqrt 4) ,@@(map sqrt '(16 9)) 8) ==> #(10 5 2 4 3 8) } @end format Quasiquote forms may be nested. Substitutions are made only for unquoted components appearing at the same nesting level as the outermost backquote. The nesting level increases by one inside each successive quasiquotation, and decreases by one inside each unquotation. @format @t{`(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f) ==> (a `(b ,(+ 1 2) ,(foo 4 d) e) f) (let ((name1 'x) (name2 'y)) `(a `(b ,,name1 ,',name2 d) e)) ==> (a `(b ,x ,'y d) e) } @end format The two notations @t{`}@r{} and @t{(quasiquote @r{})} are identical in all respects. @samp{,@r{}} is identical to @samp{(unquote @r{})}, and @samp{,@@@r{}} is identical to @samp{(unquote-splicing @r{})}. The external syntax generated by @code{write} for two-element lists whose @vindex @w{write} car is one of these symbols may vary between implementations. @cindex @w{`} @format @t{(quasiquote (list (unquote (+ 1 2)) 4)) ==> (list 3 4) '(quasiquote (list (unquote (+ 1 2)) 4)) ==> `(list ,(+ 1 2) 4) @emph{}i.e., (quasiquote (list (unquote (+ 1 2)) 4)) } @end format Unpredictable behavior can result if any of the symbols @code{quasiquote}, @code{unquote}, or @code{unquote-splicing} appear in @vindex @w{unquote-splicing} @vindex @w{unquote} @vindex @w{quasiquote} positions within a @r{} otherwise than as described above. @end deffn @node Macros, , Derived expression types, Expressions @section Macros @menu * Binding constructs for syntactic keywords:: * Pattern language:: @end menu Scheme programs can define and use new derived expression types, called @emph{macros}. @cindex @w{macro} Program-defined expression types have the syntax @example (@r{} @r{} ...) @end example where @r{} is an identifier that uniquely determines the expression type. This identifier is called the @emph{syntactic keyword}, or simply @emph{keyword}, of the macro. The @cindex @w{macro keyword} @cindex @w{keyword} @cindex @w{syntactic keyword} number of the @r{}s, and their syntax, depends on the expression type. Each instance of a macro is called a @emph{use} @cindex @w{macro use} of the macro. The set of rules that specifies how a use of a macro is transcribed into a more primitive expression is called the @emph{transformer} @cindex @w{macro transformer} of the macro. The macro definition facility consists of two parts: @itemize @bullet @item A set of expressions used to establish that certain identifiers are macro keywords, associate them with macro transformers, and control the scope within which a macro is defined, and @item a pattern language for specifying macro transformers. @end itemize The syntactic keyword of a macro may shadow variable bindings, and local variable bindings may shadow keyword bindings. All macros @cindex @w{keyword} defined using the pattern language are ``hygienic'' and ``referentially transparent'' and thus preserve Scheme's lexical scoping [Kohlbecker86], [ hygienic], [Bawden88], [macrosthatwork], [syntacticabstraction]: @cindex @w{hygienic} @cindex @w{referentially transparent} @itemize @bullet @item If a macro transformer inserts a binding for an identifier (variable or keyword), the identifier will in effect be renamed throughout its scope to avoid conflicts with other identifiers. Note that a @code{define} at top level may or may not introduce a binding; see section @ref{Definitions}. @item If a macro transformer inserts a free reference to an identifier, the reference refers to the binding that was visible where the transformer was specified, regardless of any local bindings that may surround the use of the macro. @end itemize @vindex @w{define} @c The low-level facility permits non-hygienic macros to be written, @c and may be used to implement the high-level pattern language. @c The fourth section describes some features that would make the @c low-level macro facility easier to use directly. @node Binding constructs for syntactic keywords, Pattern language, Macros, Macros @subsection Binding constructs for syntactic keywords @samp{Let-syntax} and @samp{letrec-syntax} are analogous to @samp{let} and @samp{letrec}, but they bind syntactic keywords to macro transformers instead of binding variables to locations that contain values. Syntactic keywords may also be bound at top level; see section @ref{Syntax definitions}. @deffn {syntax} let-syntax @r{} @r{} @emph{Syntax:} @r{} should have the form @format @t{((@r{} @r{}) @dots{},) } @end format Each @r{} is an identifier, each @r{} is an instance of @samp{syntax-rules}, and @r{} should be a sequence of one or more expressions. It is an error for a @r{} to appear more than once in the list of keywords being bound. @emph{Semantics:} The @r{} is expanded in the syntactic environment obtained by extending the syntactic environment of the @samp{let-syntax} expression with macros whose keywords are the @r{}s, bound to the specified transformers. Each binding of a @r{} has @r{} as its region. @format @t{(let-syntax ((when (syntax-rules () ((when test stmt1 stmt2 ...) (if test (begin stmt1 stmt2 ...)))))) (let ((if #t)) (when if (set! if 'now)) if)) ==> now (let ((x 'outer)) (let-syntax ((m (syntax-rules () ((m) x)))) (let ((x 'inner)) (m)))) ==> outer } @end format @end deffn @deffn {syntax} letrec-syntax @r{} @r{} @emph{Syntax:} Same as for @samp{let-syntax}. @emph{Semantics:} The @r{} is expanded in the syntactic environment obtained by extending the syntactic environment of the @samp{letrec-syntax} expression with macros whose keywords are the @r{}s, bound to the specified transformers. Each binding of a @r{} has the @r{} as well as the @r{} within its region, so the transformers can transcribe expressions into uses of the macros introduced by the @samp{letrec-syntax} expression. @format @t{(letrec-syntax ((my-or (syntax-rules () ((my-or) #f) ((my-or e) e) ((my-or e1 e2 ...) (let ((temp e1)) (if temp temp (my-or e2 ...))))))) (let ((x #f) (y 7) (temp 8) (let odd?) (if even?)) (my-or x (let temp) (if y) y))) ==> 7 } @end format @end deffn @node Pattern language, , Binding constructs for syntactic keywords, Macros @subsection Pattern language A @r{} has the following form: @deffn {} syntax-rules @r{} @r{} @dots{}, @emph{Syntax:} @r{} is a list of identifiers and each @r{} should be of the form @format @t{(@r{} @r{