--- gforth/Attic/gforth.ds 1995/10/16 18:33:08 1.19 +++ gforth/Attic/gforth.ds 1996/10/01 16:25:58 1.38 @@ -7,9 +7,9 @@ @comment %**end of header (This is for running Texinfo on a region.) @ifinfo -This file documents Gforth 0.1 +This file documents Gforth 0.2 -Copyright @copyright{} 1994 Gforth Development Group +Copyright @copyright{} 1995,1996 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -36,20 +36,22 @@ Copyright @copyright{} 1994 Gforth Devel of in the original English. @end ifinfo +@finalout @titlepage @sp 10 @center @titlefont{Gforth Manual} @sp 2 -@center for version 0.1 +@center for version 0.2 @sp 2 @center Anton Ertl +@center Bernd Paysan @sp 3 @center This manual is under construction @comment The following two commands start the copyright page. @page @vskip 0pt plus 1filll -Copyright @copyright{} 1994 Gforth Development Group +Copyright @copyright{} 1995,1996 Free Software Foundation, Inc. @comment !! Published by ... or You can get a copy of this manual ... @@ -75,7 +77,7 @@ Copyright @copyright{} 1994 Gforth Devel @node Top, License, (dir), (dir) @ifinfo Gforth is a free implementation of ANS Forth available on many -personal machines. This manual corresponds to version 0.0. +personal machines. This manual corresponds to version 0.2. @end ifinfo @menu @@ -86,20 +88,412 @@ personal machines. This manual correspon * Words:: Forth words available in Gforth * ANS conformance:: Implementation-defined options etc. * Model:: The abstract machine of Gforth +* Integrating Gforth:: Forth as scripting language for applications. * Emacs and Gforth:: The Gforth Mode * Internals:: Implementation details * Bugs:: How to report them -* Pedigree:: Ancestors of Gforth +* Origin:: Authors and ancestors of Gforth * Word Index:: An item for each Forth word * Node Index:: An item for each node @end menu @node License, Goals, Top, Top -@unnumbered License -!! Insert GPL here +@unnumbered GNU GENERAL PUBLIC LICENSE +@center Version 2, June 1991 + +@display +Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. +675 Mass Ave, Cambridge, MA 02139, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@unnumberedsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software---to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +@iftex +@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@item +This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The ``Program'', below, +refers to any such program or work, and a ``work based on the Program'' +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term ``modification''.) Each licensee is addressed as ``you''. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +@item +You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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. + +@item +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +@item +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) +@end enumerate + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +@enumerate a +@item +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; or, + +@item +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +@item +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) +@end enumerate + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +@item +You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + +@item +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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +@item +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + +@item +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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + +@item +If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + +@item +The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +@item +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +@item +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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@unnumberedsec How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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. + +@smallexample +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) 19@var{yy} @var{name of author} + +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 of the License, 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 program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +@smallexample +Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. +@end smallexample + +The hypothetical commands @samp{show w} and @samp{show c} should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than @samp{show w} and +@samp{show c}; they could even be mouse-clicks or menu items---whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +@smallexample +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +@var{signature of Ty Coon}, 1 April 1989 +Ty Coon, President of Vice +@end smallexample + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. @iftex +@node Preface +@comment node-name, next, previous, up @unnumbered Preface +@cindex Preface This manual documents Gforth. The reader is expected to know Forth. This manual is primarily a reference manual. @xref{Other Books} for introductory material. @@ -167,9 +561,9 @@ can also get it from Global Engineering for publication is available electronically and for free in some MS Word format, and it has been converted to HTML. Some pointers to these versions can be found through -http://www.complang.tuwien.ac.at/projects/forth.html. +@*@file{http://www.complang.tuwien.ac.at/projects/forth.html}. -@cite{Forth: The new model} by Jack Woehr (!! Publisher) is an +@cite{Forth: The new model} by Jack Woehr (Prentice-Hall, 1993) is an introductory book based on a draft version of the standard. It does not cover the whole standard. It also contains interesting background information (Jack Woehr was in the ANS Forth Technical Committe). It is @@ -200,10 +594,12 @@ line. They are: @table @code @item --image-file @var{file} +@item -i @var{file} Loads the Forth image @var{file} instead of the default @file{gforth.fi}. @item --path @var{path} +@item -p @var{path} Uses @var{path} for searching the image file and Forth source code files instead of the default in the environment variable @code{GFORTHPATH} or the path specified at installation time (typically @@ -252,6 +648,12 @@ Forth words, you have to quote them or u after processing the command line (instead of entering interactive mode) append @code{-e bye} to the command line. +If you have several versions of Gforth installed, @code{gforth} will +invoke the version that was installed last. @code{gforth-@var{version}} +invokes a specific version. You may want to use the option +@code{--path}, if your environment contains the variable +@code{GFORTHPATH}. + Not yet implemented: On startup the system first executes the system initialization file (unless the option @code{--no-init-file} is given; note that the system @@ -271,6 +673,7 @@ then in @file{~}, then in the normal pat * Control Structures:: * Locals:: * Defining Words:: +* Tokens for Words:: * Wordlists:: * Files:: * Blocks:: @@ -353,11 +756,11 @@ double sized signed integer @item ud double sized unsigned integer @item r -Float +Float (on the FP stack) @item a_ Cell-aligned address @item c_ -Char-aligned address (note that a Char is two bytes in Windows NT) +Char-aligned address (note that a Char may have two bytes in Windows NT) @item f_ Float-aligned address @item df_ @@ -370,6 +773,11 @@ Execution token, same size as Cell Wordlist ID, same size as Cell @item f83name Pointer to a name structure +@item " +string in the input stream (not the stack). The terminating character is +a blank by default. If it is not a blank, it is shown in @code{<>} +quotes. + @end table @node Arithmetic, Stack Manipulation, Notation, Words @@ -447,7 +855,7 @@ The format of floating point numbers rec interpreter is: a signed decimal number, possibly containing a decimal point (@code{.}), followed by @code{E} or @code{e}, optionally followed by a signed integer (the exponent). E.g., @code{1e} ist the same as -@code{+1.0e+1}. Note that a number without @code{e} +@code{+1.0e+0}. Note that a number without @code{e} is not interpreted as floating-point number, but as double (if the number contains a @code{.}) or single precision integer. Also, conversions between string and floating point numbers always use base @@ -740,8 +1148,11 @@ system that only supplies @code{THEN} is Forth's @code{THEN} has the meaning 2b, whereas @code{THEN} in Pascal and many other programming languages has the meaning 3d.] -We also provide the words @code{?dup-if} and @code{?dup-0=-if}, so you -can avoid using @code{?dup}. +Gforth also provides the words @code{?dup-if} and @code{?dup-0=-if}, so +you can avoid using @code{?dup}. Using these alternatives is also more +efficient than using @code{?dup}. Definitions in plain standard Forth +for @code{ENDIF}, @code{?DUP-IF} and @code{?DUP-0=-IF} are provided in +@file{compat/control.fs}. @example @var{n} @@ -833,13 +1244,7 @@ arithmetic). This behaviour is usually n Gforth offers @code{+DO} and @code{U+DO} (as replacements for @code{?DO}), which do not enter the loop if @var{start} is greater than @var{limit}; @code{+DO} is for signed loop parameters, @code{U+DO} for -unsigned loop parameters. These words can be implemented easily on -standard systems, so using them does not make your programs hard to -port; e.g.: -@example -: +DO ( compile-time: -- do-sys; run-time: n1 n2 -- ) - POSTPONE over POSTPONE min POSTPONE ?DO ; immediate -@end example +unsigned loop parameters. @code{LOOP} can be replaced with @code{@var{n} +LOOP}; this updates the index by @var{n} instead of by 1. The loop is terminated when the border @@ -867,16 +1272,10 @@ between @var{limit+1} and @var{limit} is @code{ 0 0 -DO i . 1 -LOOP} prints nothing -Another alternative is @code{@var{n} S+LOOP}, where the negative -case behaves symmetrical to the positive case: - -@code{-2 0 -DO i . -1 S+LOOP} prints @code{0 -1} - -The loop is terminated when the border between @var{limit@minus{}sgn(n)} -and @var{limit} is crossed. Unfortunately, neither @code{-LOOP} nor -@code{S+LOOP} are part of the ANS Forth standard, and they are not easy -to implement using standard words. If you want to write standard -programs, just avoid counting down. +Unfortunately, @code{+DO}, @code{U+DO}, @code{-DO}, @code{U-DO} and +@code{-LOOP} are not in the ANS Forth standard. However, an +implementation for these words that uses only standard words is provided +in @file{compat/loops.fs}. @code{?DO} can also be replaced by @code{DO}. @code{DO} always enters the loop, independent of the loop parameters. Do not use @code{DO}, even @@ -899,7 +1298,8 @@ This is the preferred loop of native cod lazy to optimize @code{?DO} loops properly. In Gforth, this loop iterates @var{n+1} times; @code{i} produces values starting with @var{n} and ending with 0. Other Forth systems may behave differently, even if -they support @code{FOR} loops. +they support @code{FOR} loops. To avoid problems, don't use @code{FOR} +loops. @node Arbitrary control structures, Calls and returns, Counted Loops, Control Structures @subsection Arbitrary control structures @@ -935,6 +1335,12 @@ doc-else doc-while doc-repeat +Gforth adds some more control-structure words: + +doc-endif +doc-?dup-if +doc-?dup-0=-if + Counted loop words constitute a separate group of words: doc-?do @@ -945,7 +1351,6 @@ doc-u-do doc-do doc-for doc-loop -doc-s+loop doc-+loop doc--loop doc-next @@ -1010,7 +1415,7 @@ while repeat @end example -That's much easier to read, isn't it? Of course, @code{BEGIN} and +That's much easier to read, isn't it? Of course, @code{REPEAT} and @code{WHILE} are predefined, so in this example it would not be necessary to define them. @@ -1044,6 +1449,11 @@ laden with restrictions. Therefore, we p locals wordset, but also our own, more powerful locals wordset (we implemented the ANS Forth locals wordset through our locals wordset). +The ideas in this section have also been published in the paper +@cite{Automatic Scoping of Local Variables} by M. Anton Ertl, presented +at EuroForth '94; it is available at +@*@file{http://www.complang.tuwien.ac.at/papers/ertl94l.ps.gz}. + @menu * Gforth locals:: * ANS Forth locals:: @@ -1330,8 +1740,8 @@ E.g., a definition using @code{TO} might : strcmp @{ addr1 u1 addr2 u2 -- n @} u1 u2 min 0 ?do - addr1 c@ addr2 c@ - ?dup - if + addr1 c@@ addr2 c@@ - + ?dup-if unloop exit then addr1 char+ TO addr1 @@ -1353,8 +1763,8 @@ are initialized with the right value for addr1 addr2 u1 u2 min 0 ?do @{ s1 s2 @} - s1 c@ s2 c@ - ?dup - if + s1 c@@ s2 c@@ - + ?dup-if unloop exit then s1 char+ s2 char+ @@ -1527,14 +1937,14 @@ stack easier. The whole definition must be in one line. @end itemize -Locals defined in this way behave like @code{VALUE}s -(@xref{Values}). I.e., they are initialized from the stack. Using their +Locals defined in this way behave like @code{VALUE}s (@xref{Simple +Defining Words}). I.e., they are initialized from the stack. Using their name produces their value. Their value can be changed using @code{TO}. Since this syntax is supported by Gforth directly, you need not do anything to use it. If you want to port a program using this syntax to -another ANS Forth system, use @file{anslocal.fs} to implement the syntax -on the other system. +another ANS Forth system, use @file{compat/anslocal.fs} to implement the +syntax on the other system. Note that a syntax shown in the standard, section A.13 looks similar, but is quite different in having the order of locals @@ -1553,17 +1963,479 @@ programs harder to read, and easier to m merit of this syntax is that it is easy to implement using the ANS Forth locals wordset. -@node Defining Words, Wordlists, Locals, Words +@node Defining Words, Tokens for Words, Locals, Words @section Defining Words @menu -* Values:: +* Simple Defining Words:: +* Colon Definitions:: +* User-defined Defining Words:: +* Supplying names:: +* Interpretation and Compilation Semantics:: @end menu -@node Values, , Defining Words, Defining Words -@subsection Values +@node Simple Defining Words, Colon Definitions, Defining Words, Defining Words +@subsection Simple Defining Words + +doc-constant +doc-2constant +doc-fconstant +doc-variable +doc-2variable +doc-fvariable +doc-create +doc-user +doc-value +doc-to +doc-defer +doc-is + +@node Colon Definitions, User-defined Defining Words, Simple Defining Words, Defining Words +@subsection Colon Definitions + +@example +: name ( ... -- ... ) + word1 word2 word3 ; +@end example + +creates a word called @code{name}, that, upon execution, executes +@code{word1 word2 word3}. @code{name} is a @dfn{(colon) definition}. + +The explanation above is somewhat superficial. @xref{Interpretation and +Compilation Semantics} for an in-depth discussion of some of the issues +involved. + +doc-: +doc-; + +@node User-defined Defining Words, Supplying names, Colon Definitions, Defining Words +@subsection User-defined Defining Words + +You can create new defining words simply by wrapping defining-time code +around existing defining words and putting the sequence in a colon +definition. + +If you want the words defined with your defining words to behave +differently from words defined with standard defining words, you can +write your defining word like this: + +@example +: def-word ( "name" -- ) + Create @var{code1} +DOES> ( ... -- ... ) + @var{code2} ; + +def-word name +@end example + +Technically, this fragment defines a defining word @code{def-word}, and +a word @code{name}; when you execute @code{name}, the address of the +body of @code{name} is put on the data stack and @var{code2} is executed +(the address of the body of @code{name} is the address @code{HERE} +returns immediately after the @code{CREATE}). + +In other words, if you make the following definitions: + +@example +: def-word1 ( "name" -- ) + Create @var{code1} ; + +: action1 ( ... -- ... ) + @var{code2} ; -@node Wordlists, Files, Defining Words, Words +def-word name1 +@end example + +Using @code{name1 action1} is equivalent to using @code{name}. + +E.g., you can implement @code{Constant} in this way: + +@example +: constant ( w "name" -- ) + create , +DOES> ( -- w ) + @@ ; +@end example + +When you create a constant with @code{5 constant five}, first a new word +@code{five} is created, then the value 5 is laid down in the body of +@code{five} with @code{,}. When @code{five} is invoked, the address of +the body is put on the stack, and @code{@@} retrieves the value 5. + +In the example above the stack comment after the @code{DOES>} specifies +the stack effect of the defined words, not the stack effect of the +following code (the following code expects the address of the body on +the top of stack, which is not reflected in the stack comment). This is +the convention that I use and recommend (it clashes a bit with using +locals declarations for stack effect specification, though). + +@subsubsection Applications of @code{CREATE..DOES>} + +You may wonder how to use this feature. Here are some usage patterns: + +When you see a sequence of code occurring several times, and you can +identify a meaning, you will factor it out as a colon definition. When +you see similar colon definitions, you can factor them using +@code{CREATE..DOES>}. E.g., an assembler usually defines several words +that look very similar: +@example +: ori, ( reg-taget reg-source n -- ) + 0 asm-reg-reg-imm ; +: andi, ( reg-taget reg-source n -- ) + 1 asm-reg-reg-imm ; +@end example + +This could be factored with: +@example +: reg-reg-imm ( op-code -- ) + create , +DOES> ( reg-taget reg-source n -- ) + @@ asm-reg-reg-imm ; + +0 reg-reg-imm ori, +1 reg-reg-imm andi, +@end example + +Another view of @code{CREATE..DOES>} is to consider it as a crude way to +supply a part of the parameters for a word (known as @dfn{currying} in +the functional language community). E.g., @code{+} needs two +parameters. Creating versions of @code{+} with one parameter fixed can +be done like this: +@example +: curry+ ( n1 -- ) + create , +DOES> ( n2 -- n1+n2 ) + @@ + ; + + 3 curry+ 3+ +-2 curry+ 2- +@end example + +@subsubsection The gory details of @code{CREATE..DOES>} + +doc-does> + +This means that you need not use @code{CREATE} and @code{DOES>} in the +same definition; E.g., you can put the @code{DOES>}-part in a separate +definition. This allows us to, e.g., select among different DOES>-parts: +@example +: does1 +DOES> ( ... -- ... ) + ... ; + +: does2 +DOES> ( ... -- ... ) + ... ; + +: def-word ( ... -- ... ) + create ... + IF + does1 + ELSE + does2 + ENDIF ; +@end example + +In a standard program you can apply a @code{DOES>}-part only if the last +word was defined with @code{CREATE}. In Gforth, the @code{DOES>}-part +will override the behaviour of the last word defined in any case. In a +standard program, you can use @code{DOES>} only in a colon +definition. In Gforth, you can also use it in interpretation state, in a +kind of one-shot mode: +@example +CREATE name ( ... -- ... ) + @var{initialization} +DOES> + @var{code} ; +@end example +This is equivalwent to the standard +@example +:noname +DOES> + @var{code} ; +CREATE name EXECUTE ( ... -- ... ) + @var{initialization} +@end example + +You can get the address of the body of a word with + +doc->body + +@node Supplying names, Interpretation and Compilation Semantics, User-defined Defining Words, Defining Words +@subsection Supplying names for the defined words + +By default, defining words take the names for the defined words from the +input stream. Sometimes you want to supply the name from a string. You +can do this with + +doc-nextname + +E.g., + +@example +s" foo" nextname create +@end example +is equivalent to +@example +create foo +@end example + +Sometimes you want to define a word without a name. You can do this with + +doc-noname + +To make any use of the newly defined word, you need its execution +token. You can get it with + +doc-lastxt + +E.g., you can initialize a deferred word with an anonymous colon +definition: +@example +Defer deferred +noname : ( ... -- ... ) + ... ; +lastxt IS deferred +@end example + +@code{lastxt} also works when the last word was not defined as +@code{noname}. + +The standard has also recognized the need for anonymous words and +provides + +doc-:noname + +This leaves the execution token for the word on the stack after the +closing @code{;}. You can rewrite the last example with @code{:noname}: +@example +Defer deferred +:noname ( ... -- ... ) + ... ; +IS deferred +@end example + +@node Interpretation and Compilation Semantics, , Supplying names, Defining Words +@subsection Interpretation and Compilation Semantics + +The @dfn{interpretation semantics} of a word are what the text +interpreter does when it encounters the word in interpret state. It also +appears in some other contexts, e.g., the execution token returned by +@code{' @var{word}} identifies the interpretation semantics of +@var{word} (in other words, @code{' @var{word} execute} is equivalent to +interpret-state text interpretation of @code{@var{word}}). + +The @dfn{compilation semantics} of a word are what the text interpreter +does when it encounters the word in compile state. It also appears in +other contexts, e.g, @code{POSTPONE @var{word}} compiles@footnote{In +standard terminology, ``appends to the current definition''.} the +compilation semantics of @var{word}. + +The standard also talks about @dfn{execution semantics}. They are used +only for defining the interpretation and compilation semantics of many +words. By default, the interpretation semantics of a word are to +@code{execute} its execution semantics, and the compilation semantics of +a word are to @code{compile,} its execution semantics.@footnote{In +standard terminology: The default interpretation semantics are its +execution semantics; the default compilation semantics are to append its +execution semantics to the execution semantics of the current +definition.} + +You can change the compilation semantics into @code{execute}ing the +execution semantics with + +doc-immediate + +You can remove the interpretation semantics of a word with + +doc-compile-only +doc-restrict + +Note that ticking (@code{'}) compile-only words gives an error +(``Interpreting a compile-only word''). + +Gforth also allows you to define words with arbitrary combinations of +interpretation and compilation semantics. + +doc-interpret/compile: + +This feature was introduced for implementing @code{TO} and @code{S"}. I +recommend that you do not define such words, as cute as they may be: +they make it hard to get at both parts of the word in some contexts. +E.g., assume you want to get an execution token for the compilation +part. Instead, define two words, one that embodies the interpretation +part, and one that embodies the compilation part. + +There is, however, a potentially useful application of this feature: +Providing differing implementations for the default semantics. While +this introduces redundancy and is therefore usually a bad idea, a +performance improvement may be worth the trouble. E.g., consider the +word @code{foobar}: + +@example +: foobar + foo bar ; +@end example + +Let us assume that @code{foobar} is called so frequently that the +calling overhead would take a significant amount of the run-time. We can +optimize it with @code{interpret/compile:}: + +@example +:noname + foo bar ; +:noname + POSTPONE foo POSTPONE bar ; +interpret/compile: foobar +@end example + +This definition has the same interpretation semantics and essentially +the same compilation semantics as the simple definition of +@code{foobar}, but the implementation of the compilation semantics is +more efficient with respect to run-time. + +Some people try to use state-smart words to emulate the feature provided +by @code{interpret/compile:} (words are state-smart if they check +@code{STATE} during execution). E.g., they would try to code +@code{foobar} like this: + +@example +: foobar + STATE @@ + IF ( compilation state ) + POSTPONE foo POSTPONE bar + ELSE + foo bar + ENDIF ; immediate +@end example + +While this works if @code{foobar} is processed only by the text +interpreter, it does not work in other contexts (like @code{'} or +@code{POSTPONE}). E.g., @code{' foobar} will produce an execution token +for a state-smart word, not for the interpretation semantics of the +original @code{foobar}; when you execute this execution token (directly +with @code{EXECUTE} or indirectly through @code{COMPILE,}) in compile +state, the result will not be what you expected (i.e., it will not +perform @code{foo bar}). State-smart words are a bad idea. Simply don't +write them! + +It is also possible to write defining words that define words with +arbitrary combinations of interpretation and compilation semantics (or, +preferably, arbitrary combinations of implementations of the default +semantics). In general, this looks like: + +@example +: def-word + create-interpret/compile + @var{code1} +interpretation> + @var{code2} + + @var{code3} + ( -- n ) + @@ + ( compilation. -- ; run-time. -- n ) + @@ postpone literal + +doc- +doc-body} also gives you the body of a word created with +@code{create-interpret/compile}. + +@node Tokens for Words, Wordlists, Defining Words, Words +@section Tokens for Words + +This chapter describes the creation and use of tokens that represent +words on the stack (and in data space). + +Named words have interpretation and compilation semantics. Unnamed words +just have execution semantics. + +An @dfn{execution token} represents the execution semantics of an +unnamed word. An execution token occupies one cell. As explained in +section @ref{Supplying names}, the execution token of the last words +defined can be produced with + +short-lastxt + +You can perform the semantics represented by an execution token with +doc-execute +You can compile the word with +doc-compile, + +In Gforth, the abstract data type @emph{execution token} is implemented +as CFA (code field address). + +The interpretation semantics of a named word are also represented by an +execution token. You can get it with + +doc-['] +doc-' + +For literals, you use @code{'} in interpreted code and @code{[']} in +compiled code. Gforth's @code{'} and @code{[']} behave somewhat unusual +by complaining about compile-only words. To get an execution token for a +compiling word @var{X}, use @code{COMP' @var{X} drop} or @code{[COMP'] +@var{X} drop}. + +The compilation semantics are represented by a @dfn{compilation token} +consisting of two cells: @var{w xt}. The top cell @var{xt} is an +execution token. The compilation semantics represented by the +compilation token can be performed with @code{execute}, which consumes +the whole compilation token, with an additional stack effect determined +by the represented compilation semantics. + +doc-[comp'] +doc-comp' + +You can compile the compilation semantics with @code{postpone,}. I.e., +@code{COMP' @var{word} POSTPONE,} is equivalent to @code{POSTPONE +@var{word}}. + +doc-postpone, + +At present, the @var{w} part of a compilation token is an execution +token, and the @var{xt} part represents either @code{execute} or +@code{compile,}. However, don't rely on that kowledge, unless necessary; +we may introduce unusual compilation tokens in the future (e.g., +compilation tokens representing the compilation semantics of literals). + +Named words are also represented by the @dfn{name token}. The abstract +data type @emph{name token} is implemented as NFA (name field address). + +doc-find-name +doc-name>int +doc-name?int +doc-name>comp +doc-name>string + +@node Wordlists, Files, Tokens for Words, Words @section Wordlists @node Files, Blocks, Wordlists, Words @@ -1683,9 +2555,9 @@ machine code), and for defining the the nature of Gforth poses a few problems: First of all. Gforth runs on several architectures, so it can provide no standard assembler. What's worse is that the register allocation not only depends on the processor, -but also on the gcc version and options used. +but also on the @code{gcc} version and options used. -The words Gforth offers encapsulate some system dependences (e.g., the +The words that Gforth offers encapsulate some system dependences (e.g., the header structure), so a system-independent assembler may be used in Gforth. If you do not have an assembler, you can compile machine code directly with @code{,} and @code{c,}. @@ -1703,11 +2575,44 @@ These words are rarely used. Therefore t which is usually not loaded (except @code{flush-icache}, which is always present). You can load them with @code{require code.fs}. +In the assembly code you will want to refer to the inner interpreter's +registers (e.g., the data stack pointer) and you may want to use other +registers for temporary storage. Unfortunately, the register allocation +is installation-dependent. + +The easiest solution is to use explicit register declarations +(@pxref{Explicit Reg Vars, , Variables in Specified Registers, gcc.info, +GNU C Manual}) for all of the inner interpreter's registers: You have to +compile Gforth with @code{-DFORCE_REG} (configure option +@code{--enable-force-reg}) and the appropriate declarations must be +present in the @code{machine.h} file (see @code{mips.h} for an example; +you can find a full list of all declarable register symbols with +@code{grep register engine.c}). If you give explicit registers to all +variables that are declared at the beginning of @code{engine()}, you +should be able to use the other caller-saved registers for temporary +storage. Alternatively, you can use the @code{gcc} option +@code{-ffixed-REG} (@pxref{Code Gen Options, , Options for Code +Generation Conventions, gcc.info, GNU C Manual}) to reserve a register +(however, this restriction on register allocation may slow Gforth +significantly). + +If this solution is not viable (e.g., because @code{gcc} does not allow +you to explicitly declare all the registers you need), you have to find +out by looking at the code where the inner interpreter's registers +reside and which registers can be used for temporary storage. You can +get an assembly listing of the engine's code with @code{make engine.s}. + +In any case, it is good practice to abstract your assembly code from the +actual register allocation. E.g., if the data stack pointer resides in +register @code{$17}, create an alias for this register called @code{sp}, +and use that in your assembly code. + Another option for implementing normal and defining words efficiently is: adding the wanted functionality to the source of Gforth. For normal -words you just have to edit @file{primitives}, defining words (for fast -defined words) probably require changes in @file{engine.c}, -@file{kernal.fs}, @file{prims2x.fs}, and possibly @file{cross.fs}. +words you just have to edit @file{primitives} (@pxref{Automatic +Generation}), defining words (equivalent to @code{;CODE} words, for fast +defined words) may require changes in @file{engine.c}, @file{kernal.fs}, +@file{prims2x.fs}, and possibly @file{cross.fs}. @node Threading Words, , Assembler and Code words, Words @@ -1738,10 +2643,10 @@ doc-douser: doc-dodefer: doc-dofield: -Currently there is no installation-independent way for recogizing words -defined by a @code{CREATE}...@code{DOES>} word; however, once you know -that a word is defined by a @code{CREATE}...@code{DOES>} word, you can -use @code{>DOES-CODE}. +You can recognize words defined by a @code{CREATE}...@code{DOES>} word +with @code{>DOES-CODE}. If the word was defined in that way, the value +returned is different from 0 and identifies the @code{DOES>} used by the +defining word. @node ANS conformance, Model, Words, Top @chapter ANS conformance @@ -1749,7 +2654,7 @@ use @code{>DOES-CODE}. To the best of our knowledge, Gforth is an ANS Forth System -@itemize +@itemize @bullet @item providing the Core Extensions word set @item providing the Block word set @item providing the Block Extensions word set @@ -1768,7 +2673,7 @@ ANS Forth System @item providing the Memory-Allocation word set @item providing the Memory-Allocation Extensions word set (that one's easy) @item providing the Programming-Tools word set -@item providing @code{;code}, @code{AHEAD}, @code{ASSEMBLER}, @code{BYE}, @code{CODE}, @code{CS-PICK}, @code{CS-ROLL}, @code{STATE}, @code{[ELSE]}, @code{[IF]}, @code{[THEN]} from the Programming-Tools Extensions word set +@item providing @code{;CODE}, @code{AHEAD}, @code{ASSEMBLER}, @code{BYE}, @code{CODE}, @code{CS-PICK}, @code{CS-ROLL}, @code{STATE}, @code{[ELSE]}, @code{[IF]}, @code{[THEN]} from the Programming-Tools Extensions word set @item providing the Search-Order word set @item providing the Search-Order Extensions word set @item providing the String word set @@ -1826,7 +2731,7 @@ processor-dependent. Gforth's alignment @item @code{EMIT} and non-graphic characters: The character is output using the C library function (actually, macro) -@code{putchar}. +@code{putc}. @item character editing of @code{ACCEPT} and @code{EXPECT}: This is modeled on the GNU readline library (@pxref{Readline @@ -1846,18 +2751,18 @@ installation-dependent. Currently a char @item character-set extensions and matching of names: Any character except the ASCII NUL charcter can be used in a -name. Matching is case-insensitive. The matching is performed using the -C function @code{strncasecmp}, whose function is probably influenced by -the locale. E.g., the @code{C} locale does not know about accents and -umlauts, so they are matched case-sensitively in that locale. For -portability reasons it is best to write programs such that they work in -the @code{C} locale. Then one can use libraries written by a Polish -programmer (who might use words containing ISO Latin-2 encoded -characters) and by a French programmer (ISO Latin-1) in the same program -(of course, @code{WORDS} will produce funny results for some of the -words (which ones, depends on the font you are using)). Also, the locale -you prefer may not be available in other operating systems. Hopefully, -Unicode will solve these problems one day. +name. Matching is case-insensitive (except in @code{TABLE}s. The +matching is performed using the C function @code{strncasecmp}, whose +function is probably influenced by the locale. E.g., the @code{C} locale +does not know about accents and umlauts, so they are matched +case-sensitively in that locale. For portability reasons it is best to +write programs such that they work in the @code{C} locale. Then one can +use libraries written by a Polish programmer (who might use words +containing ISO Latin-2 encoded characters) and by a French programmer +(ISO Latin-1) in the same program (of course, @code{WORDS} will produce +funny results for some of the words (which ones, depends on the font you +are using)). Also, the locale you prefer may not be available in other +operating systems. Hopefully, Unicode will solve these problems one day. @item conditions under which control characters match a space delimiter: If @code{WORD} is called with the space character as a delimiter, all @@ -1890,9 +2795,9 @@ The error string is stored into the vari @code{-2 throw} is performed. @item input line terminator: -For interactive input, @kbd{C-m} and @kbd{C-j} terminate lines. One of -these characters is typically produced when you type the @kbd{Enter} or -@kbd{Return} key. +For interactive input, @kbd{C-m} (CR) and @kbd{C-j} (LF) terminate +lines. One of these characters is typically produced when you type the +@kbd{Enter} or @kbd{Return} key. @item maximum size of a counted string: @code{s" /counted-string" environment? drop .}. Currently 255 characters @@ -1913,11 +2818,11 @@ change it from within Gforth. However, t redirected in the command line that starts Gforth. @item method of selecting the user output device: -The user output device is the standard output. It cannot be redirected -from within Gforth, but typically from the command line that starts -Gforth. Gforth uses buffered output, so output on a terminal does not -become visible before the next newline or buffer overflow. Output on -non-terminals is invisible until the buffer overflows. +@code{EMIT} and @code{TYPE} output to the file-id stored in the value +@code{outfile-id} (@code{stdout} by default). Gforth uses buffered +output, so output on a terminal does not become visible before the next +newline or buffer overflow. Output on non-terminals is invisible until +the buffer overflows. @item methods of dictionary compilation: What are we expected to document here? @@ -1953,7 +2858,7 @@ string. @code{1 chars .}. 1 on all current ports. @item size of the keyboard terminal buffer: -Varies. You can determine the size at a specific time using @code{lp@ +Varies. You can determine the size at a specific time using @code{lp@@ tib - .}. It is shared with the locals stack and TIBs of files that include the current file. You can change the amount of space for TIBs and locals stack at Gforth startup with the command line option @@ -1965,21 +2870,22 @@ shared with @code{WORD}. @item size of the scratch area returned by @code{PAD}: The remainder of dictionary space. You can even use the unused part of -the data stack space. The current size can be computed with @code{sp@ +the data stack space. The current size can be computed with @code{sp@@ pad - .}. @item system case-sensitivity characteristics: -Dictionary searches are case insensitive. However, as explained above -under @i{character-set extensions}, the matching for non-ASCII -characters is determined by the locale you are using. In the default -@code{C} locale all non-ASCII characters are matched case-sensitively. +Dictionary searches are case insensitive (except in +@code{TABLE}s). However, as explained above under @i{character-set +extensions}, the matching for non-ASCII characters is determined by the +locale you are using. In the default @code{C} locale all non-ASCII +characters are matched case-sensitively. @item system prompt: @code{ ok} in interpret state, @code{ compiled} in compile state. @item division rounding: installation dependent. @code{s" floored" environment? drop .}. We leave -the choice to gcc (what to use for @code{/}) and to you (whether to use +the choice to @code{gcc} (what to use for @code{/}) and to you (whether to use @code{fm/mod}, @code{sm/rem} or simply @code{/}). @item values of @code{STATE} when true: @@ -1989,7 +2895,7 @@ the choice to gcc (what to use for @code On two's complement machines, arithmetic is performed modulo 2**bits-per-cell for single arithmetic and 4**bits-per-cell for double arithmetic (with appropriate mapping for signed types). Division by zero -typically results in a @code{-55 throw} (floatingpoint unidentified +typically results in a @code{-55 throw} (Floating-point unidentified fault), although a @code{-10 throw} (divide by zero) would be more appropriate. @@ -2006,7 +2912,9 @@ No. @table @i @item a name is neither a word nor a number: -@code{-13 throw} (Undefined word) +@code{-13 throw} (Undefined word). Actually, @code{-13 bounce}, which +preserves the data and FP stack, so you don't lose more work than +necessary. @item a definition name exceeds the maximum length allowed: @code{-19 throw} (Word name too long) @@ -2023,8 +2931,9 @@ flow words, and issue a @code{ABORT"} or mismatch). @item attempting to obtain the execution token of a word with undefined execution semantics: -You get an execution token representing the compilation semantics -instead. +@code{-14 throw} (Interpreting a compile-only word). In some cases, you +get an execution token for @code{compile-only-error} (which performs a +@code{-14 throw} when executed). @item dividing by zero: typically results in a @code{-55 throw} (floating point unidentified @@ -2045,12 +2954,7 @@ error appears at a different place when @item interpreting a word with undefined interpretation semantics: For some words, we defined interpretation semantics. For the others: -@code{-14 throw} (Interpreting a compile-only word). Note that this is -checked only by the outer (aka text) interpreter; if the word is -@code{execute}d in some other way, it will typically perform it's -compilation semantics even in interpret state. (We could change @code{'} -and relatives not to give the xt of such words, but we think that would -be too restrictive). +@code{-14 throw} (Interpreting a compile-only word). @item modifying the contents of the input buffer or a string literal: These are located in writable memory and can be modified. @@ -2077,7 +2981,7 @@ underflow) is performed. Apart from that underflows can result in similar behaviour as overflows (of adjacent stacks). -@item unexepected end of the input buffer, resulting in an attempt to use a zero-length string as a name: +@item unexpected end of the input buffer, resulting in an attempt to use a zero-length string as a name: @code{Create} and its descendants perform a @code{-16 throw} (Attempt to use zero-length string as a name). Words like @code{'} probably will not find what they search. Note that it is possible to create zero-length @@ -2087,12 +2991,17 @@ names with @code{nextname} (should it no The next invocation of a parsing word returns a string wih length 0. @item @code{RECURSE} appears after @code{DOES>}: -Compiles a recursive call to the defining word not to the defined word. +Compiles a recursive call to the defining word, not to the defined word. @item argument input source different than current input source for @code{RESTORE-INPUT}: -!!???If the argument input source is a valid input source then it gets -restored. Otherwise causes @code{-12 THROW}, which, unless caught, issues -the message "argument type mismatch" and aborts. +@code{-12 THROW}. Note that, once an input file is closed (e.g., because +the end of the file was reached), its source-id may be +reused. Therefore, restoring an input source specification referencing a +closed file may lead to unpredictable results instead of a @code{-12 +THROW}. + +In the future, Gforth may be able to restore input source specifications +from other than the current input soruce. @item data space containing definitions gets de-allocated: Deallocation with @code{allot} is not checked. This typically resuls in @@ -2119,7 +3028,8 @@ stack items are loop control parameters @code{abort" last word was headerless"}. @item name not defined by @code{VALUE} used by @code{TO}: -@code{-32 throw} (Invalid name argument) +@code{-32 throw} (Invalid name argument) (unless name was defined by +@code{CONSTANT}; then it just changes the constant). @item name not found (@code{'}, @code{POSTPONE}, @code{[']}, @code{[COMPILE]}): @code{-13 throw} (Undefined word) @@ -2129,8 +3039,8 @@ Gforth behaves as if they were of the sa the behaviour by interpreting all parameters as, e.g., signed. @item @code{POSTPONE} or @code{[COMPILE]} applied to @code{TO}: -Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} is equivalent to -@code{TO}. +Assume @code{: X POSTPONE TO ; IMMEDIATE}. @code{X} performs the +compilation semantics of @code{TO}. @item String longer than a counted string returned by @code{WORD}: Not checked. The string will be ok, but the count will, of course, @@ -2164,17 +3074,20 @@ Not checked. As usual, you can expect me None. @item operator's terminal facilities available: -!!?? +After processing the command line, Gforth goes into interactive mode, +and you can give commands to Gforth interactively. The actual facilities +available depend on how you invoke Gforth. @item program data space available: -@code{sp@ here - .} gives the space remaining for dictionary and data +@code{sp@@ here - .} gives the space remaining for dictionary and data stack together. @item return stack space available: -!!?? +By default 16 KBytes. The default can be overridden with the @code{-r} +switch (@pxref{Invocation}) when Gforth starts up. @item stack space available: -@code{sp@ here - .} gives the space remaining for dictionary and data +@code{sp@@ here - .} gives the space remaining for dictionary and data stack together. @item system dictionary space required, in address units: @@ -2300,7 +3213,7 @@ The least significant cell of @var{d} is The codes -256@minus{}-511 are used for reporting signals (see @file{errore.fs}). The codes -512@minus{}-2047 are used for OS errors (for file and memory allocation operations). The mapping from OS error -numbers to throw code is -512@minus{}@var{errno}. One side effect of +numbers to throw code is -512@minus{}@code{errno}. One side effect of this mapping is that undefined OS errors produce a message with a strange number; e.g., @code{-1000 THROW} results in @code{Unknown error 488} on my system. @@ -2417,9 +3330,8 @@ of open files available. This should not @code{/line}. Currently 255. @item methods of mapping block ranges to files: -Currently, the block words automatically access the file -@file{blocks.fb} in the currend working directory. More sophisticated -methods could be implemented if there is demand (and a volunteer). +By default, blocks are accessed in the file @file{blocks.fb} in the +current working directory. The file can be switched with @code{USE}. @item number of string buffers provided by @code{S"}: 1 @@ -2492,7 +3404,10 @@ System dependent; @code{REPRESENT} is im function @code{ecvt()} and inherits its behaviour in this respect. @item rounding or truncation of floating-point numbers: -What's the question?!! +System dependent; the rounding behaviour is inherited from the hosting C +compiler. IEEE-FP-based (i.e., most) systems by default round to +nearest, and break ties by rounding to even (i.e., such that the last +bit of the mantissa is 0). @item size of floating-point stack: @code{s" FLOATING-STACK" environment? drop .}. Can be changed at startup @@ -2512,11 +3427,11 @@ with the command-line option @code{-f}. @table @i @item @code{df@@} or @code{df!} used with an address that is not double-float aligned: -System-dependent. Typically results in an alignment fault like other +System-dependent. Typically results in a @code{-23 THROW} like other alignment violations. @item @code{f@@} or @code{f!} used with an address that is not float aligned: -System-dependent. Typically results in an alignment fault like other +System-dependent. Typically results in a @code{-23 THROW} like other alignment violations. @item Floating-point result out of range: @@ -2664,14 +3579,15 @@ intended as throw codes. They typically @table @i @item ending sequence for input following @code{;code} and @code{code}: -Not implemented (yet). +@code{end-code} @item manner of processing input following @code{;code} and @code{code}: -Not implemented (yet). +The @code{assembler} vocabulary is pushed on the search order stack, and +the input is processed by the text interpreter, (starting) in interpret +state. @item search order capability for @code{EDITOR} and @code{ASSEMBLER}: -Not implemented (yet). If they were implemented, they would use the -search order wordset. +The ANS Forth search order word set. @item source and format of display by @code{SEE}: The source for @code{see} is the intermediate code used by the inner @@ -2700,9 +3616,9 @@ unlucky, this ambiguous condition is not Not implemented (yet). @item @var{name} not defined via @code{CREATE}: -@code{;code} is not implemented (yet). If it were, it would behave like -@code{DOES>} in this respect, i.e., change the execution semantics of -the last defined word no matter how it was defined. +@code{;code} behaves like @code{DOES>} in this respect, i.e., it changes +the execution semantics of the last defined word no matter how it was +defined. @item @code{POSTPONE} applied to @code{[IF]}: After defining @code{: X POSTPONE [IF] ; IMMEDIATE}. @code{X} is @@ -2752,9 +3668,11 @@ Not implemented (yet). @table @i @item changing the compilation wordlist (during compilation): -The definition is put into the wordlist that is the compilation wordlist -when @code{REVEAL} is executed (by @code{;}, @code{DOES>}, -@code{RECURSIVE}, etc.). +The word is entered into the wordlist that was the compilation wordlist +at the start of the definition. Any changes to the name field (e.g., +@code{immediate}) or the code field (e.g., when executing @code{DOES>}) +are applied to the latest defined word (as reported by @code{last} or +@code{lastxt}), if possible, irrespective of the compilation wordlist. @item search order empty (@code{previous}): @code{abort" Vocstack empty"}. @@ -2764,15 +3682,67 @@ when @code{REVEAL} is executed (by @code @end table - -@node Model, Emacs and Gforth, ANS conformance, Top +@node Model, Integrating Gforth, ANS conformance, Top @chapter Model -@node Emacs and Gforth, Internals, Model, Top +This chapter has yet to be written. It will contain information, on +which internal structures you can rely. + +@node Integrating Gforth, Emacs and Gforth, Model, Top +@chapter Integrating Gforth into C programs + +This is not yet implemented. + +Several people like to use Forth as scripting language for applications +that are otherwise written in C, C++, or some other language. + +The Forth system ATLAST provides facilities for embedding it into +applications; unfortunately it has several disadvantages: most +importantly, it is not based on ANS Forth, and it is apparently dead +(i.e., not developed further and not supported). The facilities +provided by Gforth in this area are inspired by ATLASTs facilities, so +making the switch should not be hard. + +We also tried to design the interface such that it can easily be +implemented by other Forth systems, so that we may one day arrive at a +standardized interface. Such a standard interface would allow you to +replace the Forth system without having to rewrite C code. + +You embed the Gforth interpreter by linking with the library +@code{libgforth.a} (give the compiler the option @code{-lgforth}). All +global symbols in this library that belong to the interface, have the +prefix @code{forth_}. (Global symbols that are used internally have the +prefix @code{gforth_}). + +You can include the declarations of Forth types and the functions and +variables of the interface with @code{#include }. + +Types. + +Variables. + +Data and FP Stack pointer. Area sizes. + +functions. + +forth_init(imagefile) +forth_evaluate(string) exceptions? +forth_goto(address) (or forth_execute(xt)?) +forth_continue() (a corountining mechanism) + +Adding primitives. + +No checking. + +Signals? + +Accessing the Stacks + +@node Emacs and Gforth, Internals, Integrating Gforth, Top @chapter Emacs and Gforth Gforth comes with @file{gforth.el}, an improved version of -@file{forth.el} by Goran Rydqvist (icluded in the TILE package). The +@file{forth.el} by Goran Rydqvist (included in the TILE package). The improvements are a better (but still not perfect) handling of indentation. I have also added comment paragraph filling (@kbd{M-q}), commenting (@kbd{C-x \}) and uncommenting (@kbd{C-u C-x \}) regions and @@ -2794,7 +3764,10 @@ Also, if you @code{include} @file{etags. contains the definitions of all words defined afterwards. You can then find the source for a word using @kbd{M-.}. Note that emacs can use several tags files at the same time (e.g., one for the Gforth sources -and one for your program). +and one for your program, @pxref{Select Tags Table,,Selecting a Tags +Table,emacs, Emacs Manual}). The TAGS file for the preloaded words is +@file{$(datadir)/gforth/$(VERSION)/TAGS} (e.g., +@file{/usr/local/share/gforth/0.2.0/TAGS}). To get all these benefits, add the following lines to your @file{.emacs} file: @@ -2810,6 +3783,12 @@ file: Reading this section is not necessary for programming with Gforth. It should be helpful for finding your way in the Gforth sources. +The ideas in this section have also been published in the papers +@cite{ANS fig/GNU/??? Forth} (in German) by Bernd Paysan, presented at +the Forth-Tagung '93 and @cite{A Portable Forth Engine} by M. Anton +Ertl, presented at EuroForth '93; the latter is available at +@*@file{http://www.complang.tuwien.ac.at/papers/ertl93.ps.Z}. + @menu * Portability:: * Threading:: @@ -2843,11 +3822,17 @@ limitations: GNU C, the version of C pro GNU C Manual}). Its labels as values feature (@pxref{Labels as Values, , Labels as Values, gcc.info, GNU C Manual}) makes direct and indirect threading possible, its @code{long long} type (@pxref{Long Long, , -Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forths -double numbers. GNU C is available for free on all important (and many -unimportant) UNIX machines, VMS, 80386s running MS-DOS, the Amiga, and -the Atari ST, so a Forth written in GNU C can run on all these -machines. +Double-Word Integers, gcc.info, GNU C Manual}) corresponds to Forth's +double numbers@footnote{Unfortunately, long longs are not implemented +properly on all machines (e.g., on alpha-osf1, long longs are only 64 +bits, the same size as longs (and pointers), but they should be twice as +long according to @ref{Long Long, , Double-Word Integers, gcc.info, GNU +C Manual}). So, we had to implement doubles in C after all. Still, on +most machines we can use long longs and achieve better performance than +with the emulation package.}. GNU C is available for free on all +important (and many unimportant) UNIX machines, VMS, 80386s running +MS-DOS, the Amiga, and the Atari ST, so a Forth written in GNU C can run +on all these machines. Writing in a portable language has the reputation of producing code that is slower than assembly. For our Forth engine we repeatedly looked at @@ -3086,7 +4071,7 @@ An important optimization for stack mach engines, is keeping one or more of the top stack items in registers. If a word has the stack effect @var{in1}...@var{inx} @code{--} @var{out1}...@var{outy}, keeping the top @var{n} items in registers -@itemize +@itemize @bullet @item is better than keeping @var{n-1} items, if @var{x>=n} and @var{y>=n}, due to fewer loads from and stores to the stack. @@ -3120,7 +4105,7 @@ The TOS optimization makes the automatic bit more complicated. Just replacing all occurrences of @code{sp[0]} by @code{TOS} is not sufficient. There are some special cases to consider: -@itemize +@itemize @bullet @item In the case of @code{dup ( w -- w w )} the generator must not eliminate the store to the original location of the item on the stack, if the TOS optimization is turned on. @@ -3197,32 +4182,39 @@ Sieve benchmark on a 486DX2/66 than Gfor However, this potential advantage of assembly language implementations is not necessarily realized in complete Forth systems: We compared -Gforth (compiled with @code{gcc-2.6.3} and @code{-DFORCE_REG}) with -Win32Forth 1.2093 and LMI's NT Forth (Beta, May 1994), two systems -written in assembly, and with two systems written in C: PFE-0.9.11 -(compiled with @code{gcc-2.6.3} with the default configuration for -Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS}) and ThisForth Beta -(compiled with gcc-2.6.3 -O3 -fomit-frame-pointer). We benchmarked -Gforth, PFE and ThisForth on a 486DX2/66 under Linux. Kenneth O'Heskin -kindly provided the results for Win32Forth and NT Forth on a 486DX2/66 -with similar memory performance under Windows NT. +Gforth (direct threaded, compiled with @code{gcc-2.6.3} and +@code{-DFORCE_REG}) with Win32Forth 1.2093, LMI's NT Forth (Beta, May +1994) and Eforth (with and without peephole (aka pinhole) optimization +of the threaded code); all these systems were written in assembly +language. We also compared Gforth with three systems written in C: +PFE-0.9.14 (compiled with @code{gcc-2.6.3} with the default +configuration for Linux: @code{-O2 -fomit-frame-pointer -DUSE_REGS +-DUNROLL_NEXT}), ThisForth Beta (compiled with gcc-2.6.3 -O3 +-fomit-frame-pointer; ThisForth employs peephole optimization of the +threaded code) and TILE (compiled with @code{make opt}). We benchmarked +Gforth, PFE, ThisForth and TILE on a 486DX2/66 under Linux. Kenneth +O'Heskin kindly provided the results for Win32Forth and NT Forth on a +486DX2/66 with similar memory performance under Windows NT. Marcel +Hendrix ported Eforth to Linux, then extended it to run the benchmarks, +added the peephole optimizer, ran the benchmarks and reported the +results. We used four small benchmarks: the ubiquitous Sieve; bubble-sorting and matrix multiplication come from the Stanford integer benchmarks and have been translated into Forth by Martin Fraeman; we used the versions -included in the TILE Forth package; and a recursive Fibonacci number -computation for benchmark calling performance. The following table shows -the time taken for the benchmarks scaled by the time taken by Gforth (in -other words, it shows the speedup factor that Gforth achieved over the -other systems). +included in the TILE Forth package, but with bigger data set sizes; and +a recursive Fibonacci number computation for benchmarking calling +performance. The following table shows the time taken for the benchmarks +scaled by the time taken by Gforth (in other words, it shows the speedup +factor that Gforth achieved over the other systems). @example -relative Win32- NT This- - time Gforth Forth Forth PFE Forth -sieve 1.00 1.30 1.07 1.67 2.98 -bubble 1.00 1.30 1.40 1.66 -matmul 1.00 1.40 1.29 2.24 -fib 1.00 1.44 1.26 1.82 2.82 +relative Win32- NT eforth This- + time Gforth Forth Forth eforth +opt PFE Forth TILE +sieve 1.00 1.39 1.14 1.39 0.85 1.58 3.18 8.58 +bubble 1.00 1.31 1.41 1.48 0.88 1.50 3.88 +matmul 1.00 1.47 1.35 1.46 0.74 1.58 4.09 +fib 1.00 1.52 1.34 1.22 0.86 1.74 2.99 4.30 @end example You may find the good performance of Gforth compared with the systems @@ -3234,12 +4226,18 @@ method for relocating the Forth image: l the actual addresses at run time, resulting in two address computations per NEXT (@pxref{System Architecture}). -The speedup of Gforth over PFE and ThisForth can be easily explained -with the self-imposed restriction to standard C (although the measured -implementation of PFE uses a GNU C extension: global register -variables), which makes efficient threading impossible. Moreover, -current C compilers have a hard time optimizing other aspects of the -ThisForth source. +Only Eforth with the peephole optimizer performs comparable to +Gforth. The speedups achieved with peephole optimization of threaded +code are quite remarkable. Adding a peephole optimizer to Gforth should +cause similar speedups. + +The speedup of Gforth over PFE, ThisForth and TILE can be easily +explained with the self-imposed restriction to standard C, which makes +efficient threading impossible (however, the measured implementation of +PFE uses a GNU C extension: @ref{Global Reg Vars, , Defining Global +Register Variables, gcc.info, GNU C Manual}). Moreover, current C +compilers have a hard time optimizing other aspects of the ThisForth +and the TILE source. Note that the performance of Gforth on 386 architecture processors varies widely with the version of @code{gcc} used. E.g., @code{gcc-2.5.8} @@ -3248,43 +4246,83 @@ machine registers by itself and would no register declarations, giving a 1.3 times slower engine (on a 486DX2/66 running the Sieve) than the one measured above. -@node Bugs, Pedigree, Internals, Top +In @cite{Translating Forth to Efficient C} by M. Anton Ertl and Martin +Maierhofer (presented at EuroForth '95), an indirect threaded version of +Gforth is compared with Win32Forth, NT Forth, PFE, and ThisForth; that +version of Gforth is 2\%@minus{}8\% slower on a 486 than the version +used here. The paper available at +@*@file{http://www.complang.tuwien.ac.at/papers/ertl&maierhofer95.ps.gz}; +it also contains numbers for some native code systems. You can find +numbers for Gforth on various machines in @file{Benchres}. + +@node Bugs, Origin, Internals, Top @chapter Bugs Known bugs are described in the file BUGS in the Gforth distribution. -If you find a bug, please send a bug report to !!. A bug report should +If you find a bug, please send a bug report to +@code{bug-gforth@@gnu.ai.mit.edu}. A bug report should describe the Gforth version used (it is announced at the start of an interactive Gforth session), the machine and operating system (on Unix systems you can use @code{uname -a} to produce this information), the -installation options (!! a way to find them out), and a complete list of -changes you (or your installer) have made to the Gforth sources (if -any); it should contain a program (or a sequence of keyboard commands) -that reproduces the bug and a description of what you think constitutes -the buggy behaviour. +installation options (send the @code{config.status} file), and a +complete list of changes you (or your installer) have made to the Gforth +sources (if any); it should contain a program (or a sequence of keyboard +commands) that reproduces the bug and a description of what you think +constitutes the buggy behaviour. For a thorough guide on reporting bugs read @ref{Bug Reporting, , How to Report Bugs, gcc.info, GNU C Manual}. -@node Pedigree, Word Index, Bugs, Top -@chapter Pedigree +@node Origin, Word Index, Bugs, Top +@chapter Authors and Ancestors of Gforth -Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by -Dirk Zoller) will cross-fertilize each other. Of course, a significant part of the design of Gforth was prescribed by ANS Forth. +@section Authors and Contributors -Bernd Paysan wrote BigForth, a child of VolksForth. +The Gforth project was started in mid-1992 by Bernd Paysan and Anton +Ertl. The third major author was Jens Wilke. Lennart Benschop (who was +one of Gforth's first users, in mid-1993) and Stuart Ramsden inspired us +with their continuous feedback. Lennart Benshop contributed +@file{glosgen.fs}, while Stuart Ramsden has been working on automatic +support for calling C libraries. Helpful comments also came from Paul +Kleinrubatscher, Christian Pirker, Dirk Zoller, Marcel Hendrix, John +Wavrik, Stott Bolton and Marc de Groot. + +Gforth also owes a lot to the authors of the tools we used (GCC, CVS, +and autoconf, among others), and to the creators of the Internet: Gforth +was developed across the Internet, and its authors have not met +physically yet. + +@section Pedigree + +Gforth descends from BigForth (1993) and fig-Forth. Gforth and PFE (by +Dirk Zoller) will cross-fertilize each other. Of course, a significant +part of the design of Gforth was prescribed by ANS Forth. -VolksForth descends from F83. !! Authors? When? +Bernd Paysan wrote BigForth, a descendent from TurboForth, an unreleased +32 bit native code version of VolksForth for the Atari ST, written +mostly by Dietrich Weineck. + +VolksForth descends from F83. It was written by Klaus Schleisiek, Bernd +Pennemann, Georg Rehfeld and Dietrich Weineck for the C64 (called +UltraForth there) in the mid-80s and ported to the Atari ST in 1986. -Laxen and Perry wrote F83 as a model implementation of the +Henry Laxen and Mike Perry wrote F83 as a model implementation of the Forth-83 standard. !! Pedigree? When? A team led by Bill Ragsdale implemented fig-Forth on many processors in -1979. Dean Sanderson and Bill Ragsdale developed the original -implementation of fig-Forth based on microForth. +1979. Robert Selzer and Bill Ragsdale developed the original +implementation of fig-Forth for the 6502 based on microForth. -!! microForth pedigree +The principal architect of microForth was Dean Sanderson. microForth was +FORTH, Inc.'s first off-the-shelf product. It was developped in 1976 for +the 1802, and subsequently implemented on the 8080, the 6800 and the +Z80. + +All earlier Forth systems were custom-made, usually by Charles Moore, +who discovered (as he puts it) Forth during the late 60s. The first full +Forth existed in 1971. A part of the information in this section comes from @cite{The Evolution of Forth} by Elizabeth D. Rather, Donald R. Colburn and Charles @@ -3292,7 +4330,7 @@ H. Moore, presented at the HOPL-II confe Notices 28(3), 1993. You can find more historical and genealogical information about Forth there. -@node Word Index, Node Index, Pedigree, Top +@node Word Index, Node Index, Origin, Top @chapter Word Index This index is as incomplete as the manual. Each word is listed with