Annotation of gforth/gforth.texi, revision 1.7
1.1 anton 1: \input texinfo @c -*-texinfo-*-
2: @comment %**start of header (This is for running Texinfo on a region.)
3: @setfilename gforth-info
4: @settitle GNU Forth Manual
5: @setchapternewpage odd
6: @comment %**end of header (This is for running Texinfo on a region.)
7:
8: @ifinfo
9: This file documents GNU Forth 0.0
10:
11: Copyright @copyright{} 1994 GNU Forth Development Group
12:
13: Permission is granted to make and distribute verbatim copies of
14: this manual provided the copyright notice and this permission notice
15: are preserved on all copies.
16:
17: @ignore
18: Permission is granted to process this file through TeX and print the
19: results, provided the printed document carries a copying permission
20: notice identical to this one except for the removal of this paragraph
21: (this paragraph not being relevant to the printed manual).
22:
23: @end ignore
24: Permission is granted to copy and distribute modified versions of this
25: manual under the conditions for verbatim copying, provided also that the
26: sections entitled "Distribution" and "General Public License" are
27: included exactly as in the original, and provided that the entire
28: resulting derived work is distributed under the terms of a permission
29: notice identical to this one.
30:
31: Permission is granted to copy and distribute translations of this manual
32: into another language, under the above conditions for modified versions,
33: except that the sections entitled "Distribution" and "General Public
34: License" may be included in a translation approved by the author instead
35: of in the original English.
36: @end ifinfo
37:
38: @titlepage
39: @sp 10
40: @center @titlefont{GNU Forth Manual}
41: @sp 2
42: @center for version 0.0
43: @sp 2
44: @center Anton Ertl
45:
46: @comment The following two commands start the copyright page.
47: @page
48: @vskip 0pt plus 1filll
49: Copyright @copyright{} 1994 GNU Forth Development Group
50:
51: @comment !! Published by ... or You can get a copy of this manual ...
52:
53: Permission is granted to make and distribute verbatim copies of
54: this manual provided the copyright notice and this permission notice
55: are preserved on all copies.
56:
57: Permission is granted to copy and distribute modified versions of this
58: manual under the conditions for verbatim copying, provided also that the
59: sections entitled "Distribution" and "General Public License" are
60: included exactly as in the original, and provided that the entire
61: resulting derived work is distributed under the terms of a permission
62: notice identical to this one.
63:
64: Permission is granted to copy and distribute translations of this manual
65: into another language, under the above conditions for modified versions,
66: except that the sections entitled "Distribution" and "General Public
67: License" may be included in a translation approved by the author instead
68: of in the original English.
69: @end titlepage
70:
71:
72: @node Top, License, (dir), (dir)
73: @ifinfo
74: GNU Forth is a free implementation of ANS Forth available on many
75: personal machines. This manual corresponds to version 0.0.
76: @end ifinfo
77:
78: @menu
79: * License::
80: * Goals:: About the GNU Forth Project
81: * Other Books:: Things you might want to read
82: * Invocation:: Starting GNU Forth
83: * Words:: Forth words available in GNU Forth
84: * ANS conformance:: Implementation-defined options etc.
85: * Model:: The abstract machine of GNU Forth
86: @comment * Emacs and GForth:: The GForth Mode
87: * Internals:: Implementation details
88: * Bugs:: How to report them
89: * Pedigree:: Ancestors of GNU Forth
90: * Word Index:: An item for each Forth word
91: * Node Index:: An item for each node
92: @end menu
93:
94: @node License, Goals, Top, Top
95: @unnumbered License
96: !! Insert GPL here
97:
98: @iftex
99: @unnumbered Preface
100: This manual documents GNU Forth. The reader is expected to know
101: Forth. This manual is primarily a reference manual. @xref{Other Books}
102: for introductory material.
103: @end iftex
104:
105: @node Goals, Other Books, License, Top
106: @comment node-name, next, previous, up
107: @chapter Goals of GNU Forth
108: @cindex Goals
1.5 anton 109: The goal of the GNU Forth Project is to develop a standard model for
110: ANSI Forth. This can be split into several subgoals:
1.1 anton 111:
1.5 anton 112: @itemize @bullet
113: @item
114: GNU Forth should conform to the ANSI Forth standard.
115: @item
116: It should be a model, i.e. it should define all the
117: implementation-dependent things.
118: @item
119: It should become standard, i.e. widely accepted and used. This goal
120: is the most difficult one.
121: @end itemize
122:
123: To achieve these goals GNU Forth should be
124: @itemize @bullet
125: @item
126: Similar to previous models (fig-Forth, F83)
127: @item
128: Powerful. It should provide for all the things that are considered
129: necessary today and even some that are not yet considered necessary.
130: @item
131: Efficient. It should not get the reputation of being exceptionally
132: slow.
133: @item
134: Free.
135: @item
136: Available on many machines/easy to port.
137: @end itemize
138:
139: Have we achieved these goals? GNU Forth conforms to the ANS Forth
140: standard; it may be considered a model, but we have not yet documented
141: which parts of the model are stable and which parts we are likely to
142: change; it certainly has not yet become a de facto standard. It has some
143: similarities and some differences to previous models; It has some
144: powerful features, but not yet everything that we envisioned; on RISCs
145: it is as fast as interpreters programmed in assembly, on
146: register-starved machines it is not so fast, but still faster than any
147: other C-based interpretive implementation; it is free and available on
148: many machines.
149:
1.1 anton 150: @node Other Books, Invocation, Goals, Top
151: @chapter Other books on ANS Forth
152:
153: As the standard is relatively new, there are not many books out yet. It
154: is not recommended to learn Forth by using GNU Forth and a book that is
155: not written for ANS Forth, as you will not know your mistakes from the
156: deviations of the book.
157:
158: There is, of course, the standard, the definite reference if you want to
159: write ANS Forth programs. It will be available in printed form from
1.6 anton 160: Global Engineering Documents !! somtime in spring or summer 1994. If you
161: are lucky, you can still get dpANS6 (the draft that was approved as
162: standard) by aftp from ftp.uu.net:/vendor/minerva/x3j14.
163:
164: @cite{Forth: The new model} by Jack Woehr (!! Publisher) is an
165: introductory book based on a draft version of the standard. It does not
166: cover the whole standard. It also contains interesting background
167: information (Jack Woehr was in the ANS Forth Technical Committe). It is
168: not appropriate for complete newbies, but programmers experienced in
169: other languages should find it ok.
1.1 anton 170:
171: @node Invocation, Words, Other Books, Top
172: @chapter Invocation
173:
1.7 ! anton 174: You will usually just say @code{gforth}. In many other cases the default
! 175: GNU Forth image will be invoked like this:
1.1 anton 176:
177: @example
1.7 ! anton 178: gforth [files] [-e forth-code]
1.1 anton 179: @end example
180:
1.7 ! anton 181: executing the contents of the files and the Forth code in the order they
! 182: are given.
! 183:
! 184: In general, the command line looks like this:
! 185:
! 186: @example
! 187: gforth [initialization options] [image-specific options]
! 188: @end example
! 189:
! 190: The initialization options must come before the rest of the command
! 191: line. They are:
! 192:
! 193: @table @code
! 194: @item --image-file @samp{file}
! 195: Loads the Forth image @samp{file} instead of the default
! 196: @file{gforth.fi}.
! 197:
! 198: @item --path @samp{path}
! 199: Uses @samp{path} for searching the image file and Forth source code
! 200: files instead of the default in the environment variable
! 201: @code{GFORTHPATH} or the path specified at installation time (typically
! 202: @file{/usr/local/lib/gforth:.}). A path is given as a @code{:}-separated
! 203: list.
! 204:
! 205: @item --dictionary-size @samp{size}
! 206: @item -m @samp{size}
! 207: Allocate @samp{size} space for the Forth dictionary space instead of
! 208: using the default specified in the image (typically 256K). The
! 209: @samp{size} specification consists of an integer and a unit (e.g.,
! 210: @code{4M}). The unit can be one of @code{b} (bytes), @code{e} (element
! 211: size, in this case Cells), @code{k} (kilobytes), and @code{M}
! 212: (Megabytes). If no unit is specified, @code{e} is used.
! 213:
! 214: @item --data-stack-size @samp{size}
! 215: @item -d @samp{size}
! 216: Allocate @samp{size} space for the data stack instead of using the
! 217: default specified in the image (typically 16K).
! 218:
! 219: @item --return-stack-size @samp{size}
! 220: @item -r @samp{size}
! 221: Allocate @samp{size} space for the return stack instead of using the
! 222: default specified in the image (typically 16K).
! 223:
! 224: @item --fp-stack-size @samp{size}
! 225: @item -f @samp{size}
! 226: Allocate @samp{size} space for the floating point stack instead of
! 227: using the default specified in the image (typically 16K). In this case
! 228: the unit specifier @code{e} refers to floating point numbers.
! 229:
! 230: @item --locals-stack-size @samp{size}
! 231: @item -l @samp{size}
! 232: Allocate @samp{size} space for the locals stack instead of using the
! 233: default specified in the image (typically 16K).
! 234:
! 235: @end table
! 236:
! 237: As explained above, the image-specific command-line arguments for the
! 238: default image @file{gforth.fi} consist of a sequence of filenames and
! 239: @code{-e @samp{forth-code}} options that are interpreted in the seqence
! 240: in which they are given. The @code{-e @samp{forth-code}} or
! 241: @code{--evaluate @samp{forth-code}} option evaluates the forth
! 242: code. This option takes only one argument; if you want to evaluate more
! 243: Forth words, you have to quote them or use several @code{-e}s. To exit
! 244: after processing the command line (instead of entering interactive mode)
! 245: append @code{-e bye} to the command line.
! 246:
! 247: Not yet implemented:
! 248: On startup the system first executes the system initialization file
! 249: (unless the option @code{--no-init-file} is given; note that the system
! 250: resulting from using this option may not be ANS Forth conformant). Then
! 251: the user initialization file @file{.gforth.fs} is executed, unless the
! 252: option @code{--no-rc} is given; this file is first searched in @file{.},
! 253: then in @file{~}, then in the path given by the normal path (see below).
1.1 anton 254:
255: @node Words, , Invocation, Top
256: @chapter Forth Words
257:
258: @menu
259: * Notation::
260: * Arithmetic::
261: * Stack Manipulation::
262: * Memory access::
263: * Control Structures::
264: * Local Variables::
265: * Defining Words::
266: * Vocabularies::
267: * Files::
268: * Blocks::
269: * Other I/O::
270: * Programming Tools::
271: @end menu
272:
273: @node Notation, Arithmetic, Words, Words
274: @section Notation
275:
1.3 anton 276: The Forth words are described in this section in the glossary notation
1.1 anton 277: that has become a de-facto standard for Forth texts, i.e.
278:
279: @quotation
280: @samp{word} @samp{Stack effect} @samp{pronunciation} @samp{wordset}
281: @samp{Description}
282: @end quotation
283:
284: @table @samp
285: @item word
286: The name of the word. BTW, GNU Forth is case insensitive, so you can
287: type the words in in lower case.
288:
289: @item Stack effect
290: The stack effect is written in the notation @code{@samp{before} --
291: @samp{after}}, where @samp{before} and @samp{after} describe the top of
292: stack entries before and after the execution of the word. The rest of
293: the stack is not touched by the word. The top of stack is rightmost,
294: i.e., a stack sequence is written as it is typed in. Note that GNU Forth
295: uses a separate floating point stack, but a unified stack
296: notation. Also, return stack effects are not shown in @samp{stack
297: effect}, but in @samp{Description}. The name of a stack item describes
298: the type and/or the function of the item. See below for a discussion of
299: the types.
300:
301: @item pronunciation
302: How the word is pronounced
303:
304: @item wordset
305: The ANS Forth standard is divided into several wordsets. A standard
306: system need not support all of them. So, the fewer wordsets your program
307: uses the more portable it will be in theory. However, we suspect that
308: most ANS Forth systems on personal machines will feature all
309: wordsets. Words that are not defined in the ANS standard have
310: @code{gforth} as wordset.
311:
312: @item Description
313: A description of the behaviour of the word.
314: @end table
315:
316: The name of a stack item corresponds in the following way with its type:
317:
318: @table @code
319: @item name starts with
320: Type
321: @item f
1.5 anton 322: Bool, i.e. @code{false} or @code{true}.
1.1 anton 323: @item c
324: Char
325: @item w
326: Cell, can contain an integer or an address
327: @item n
328: signed integer
329: @item u
330: unsigned integer
331: @item d
332: double sized signed integer
333: @item ud
334: double sized unsigned integer
335: @item r
336: Float
337: @item a_
338: Cell-aligned address
339: @item c_
340: Char-aligned address (note that a Char is two bytes in Windows NT)
341: @item f_
342: Float-aligned address
343: @item df_
344: Address aligned for IEEE double precision float
345: @item sf_
346: Address aligned for IEEE single precision float
347: @item xt
348: Execution token, same size as Cell
349: @item wid
350: Wordlist ID, same size as Cell
351: @item f83name
352: Pointer to a name structure
353: @end table
354:
355: @node Arithmetic, , Notation, Words
356: @section Arithmetic
357: Forth arithmetic is not checked, i.e., you will not hear about integer
358: overflow on addition or multiplication, you may hear about division by
359: zero if you are lucky. The operator is written after the operands, but
360: the operands are still in the original order. I.e., the infix @code{2-1}
361: corresponds to @code{2 1 -}. Forth offers a variety of division
362: operators. If you perform division with potentially negative operands,
363: you do not want to use @code{/} or @code{/mod} with its undefined
364: behaviour, but rather @code{fm/mod} or @code{sm/mod} (probably the
365: former).
366:
367: @subsection Single precision
368: +
369: -
370: *
371: /
372: mod
373: /mod
374: negate
375: abs
376: min
377: max
378:
379: @subsection Bitwise operations
380: and
381: or
382: xor
383: invert
384: 2*
385: 2/
386:
387: @subsection Mixed precision
388: m+
389: */
390: */mod
391: m*
392: um*
393: m*/
394: um/mod
395: fm/mod
396: sm/rem
397:
398: @subsection Double precision
399: d+
400: d-
401: dnegate
402: dabs
403: dmin
404: dmax
405:
406: @node Stack Manipulation,,,
407: @section Stack Manipulation
408:
409: gforth has a data stack (aka parameter stack) for characters, cells,
410: addresses, and double cells, a floating point stack for floating point
411: numbers, a return stack for storing the return addresses of colon
412: definitions and other data, and a locals stack for storing local
413: variables. Note that while every sane Forth has a separate floating
414: point stack, this is not strictly required; an ANS Forth system could
415: theoretically keep floating point numbers on the data stack. As an
416: additional difficulty, you don't know how many cells a floating point
1.6 anton 417: number takes. It is reportedly possible to write words in a way that
1.1 anton 418: they work also for a unified stack model, but we do not recommend trying
1.3 anton 419: it. Also, a Forth system is allowed to keep the local variables on the
420: return stack. This is reasonable, as local variables usually eliminate
1.6 anton 421: the need to use the return stack explicitly. So, if you want to produce
1.3 anton 422: a standard complying program and if you are using local variables in a
1.1 anton 423: word, forget about return stack manipulations in that word (see the
424: standard document for the exact rules).
425:
1.2 pazsan 426: @subsection Data stack
1.1 anton 427: drop
428: nip
429: dup
430: over
431: tuck
432: swap
433: rot
434: -rot
435: ?dup
436: pick
437: roll
438: 2drop
439: 2nip
440: 2dup
441: 2over
442: 2tuck
443: 2swap
444: 2rot
445:
446: @subsection Floating point stack
447: fdrop
448: fnip
449: fdup
450: fover
451: ftuck
452: fswap
453: frot
454:
455: @subsection Return stack
456: >r
457: r>
458: r@
459: rdrop
460: 2>r
461: 2r>
1.6 anton 462: 2r@
463: 2rdrop
1.1 anton 464:
465: @subsection Locals stack
466:
467: @subsection Stack pointer manipulation
468: sp@
469: sp!
470: fp@
471: fp!
472: rp@
473: rp!
474: lp@
475: lp!
476:
477: @node Memory access
478: @section Memory access
479:
480: @subsection Stack-Memory transfers
481: @
482: !
483: +!
484: c@
485: c!
486: 2@
487: 2!
488: f@
489: f!
490: sf@
491: sf!
492: df@
493: df!
494:
495: @subsection Memory block access
496:
497: move
1.5 anton 498: erase
499:
500: While the previous words work on address units, the rest works on
501: characters.
502:
503: cmove
504: cmove>
1.1 anton 505: fill
1.5 anton 506: blank
1.1 anton 507:
508: @node Control Structures
509: @section Control Structures
510:
511: Control structures in Forth cannot be used in interpret state, only in
512: compile state, i.e., in a colon definition. We do not like this
513: limitation, but have not seen a satisfying way around it yet, although
514: many schemes have been proposed.
515:
516: @subsection Selection
517:
518: @example
519: @var{flag}
520: IF
521: @var{code}
522: ENDIF
523: @end example
1.3 anton 524: or
1.1 anton 525: @example
526: @var{flag}
527: IF
528: @var{code1}
529: ELSE
530: @var{code2}
531: ENDIF
532: @end example
533:
534: You can use @code{THEN} instead of {ENDIF}. Indeed, @code{THEN} is
535: standard, and @code{ENDIF} is not, although it is quite popular. We
536: recommend using @code{ENDIF}, because it is less confusing for people
537: who also know other languages (and is not prone to reinforcing negative
538: prejudices against Forth in these people). Adding @code{ENDIF} to a
539: system that only supplies @code{THEN} is simple:
540: @example
541: : endif POSTPONE then ; immediate
542: @end example
543:
1.5 anton 544: [According to @cite{Webster's New Encyclopedic Dictionary}, @dfn{then
545: (adv.)} has the following meanings:
546: @quotation
547: ... 2b: following next after in order ... 3d: as a necessary consequence
548: (if you were there, then you saw them).
549: @end quotation
550: Forth's @code{THEN} has the meaning 2b, @code{THEN} in Pascal
551: and many other programming languages has the meaning 3d.]
1.4 anton 552:
1.5 anton 553: We also provide the words @code{?dup-if} and @code{?dup-0=-if}, so you
1.1 anton 554: can avoid using @code{?dup}.
555:
556: @example
557: @var{n}
558: CASE
559: @var{n1} OF @var{code1} ENDOF
560: @var{n2} OF @var{code2} ENDOF
561: @dots
562: ENDCASE
563: @end example
564:
565: Executes the first @var{codei}, where the @var{ni} is equal to
566: @var{n}. A default case can be added by simply writing the code after
567: the last @code{ENDOF}. It may use @var{n}, which is on top of the stack,
568: but must not consume it.
569:
570: @subsection Simple Loops
571:
572: @example
573: BEGIN
574: @var{code1}
575: @var{flag}
576: WHILE
577: @var{code2}
578: REPEAT
579: @end example
580:
581: @var{code1} is executed and @var{flag} is computed. If it is true,
582: @var{code2} is executed and the loop is restarted; If @var{flag} is false, execution continues after the @code{REPEAT}.
583:
584: @example
585: BEGIN
586: @var{code}
587: @var{flag}
588: UNTIL
589: @end example
590:
591: @var{code} is executed. The loop is restarted if @code{flag} is false.
592:
593: @example
594: BEGIN
595: @var{code}
596: AGAIN
597: @end example
598:
599: This is an endless loop.
600:
601: @subsection Counted Loops
602:
603: The basic counted loop is:
604: @example
605: @var{limit} @var{start}
606: ?DO
607: @var{body}
608: LOOP
609: @end example
610:
611: This performs one iteration for every integer, starting from @var{start}
612: and up to, but excluding @var{limit}. The counter, aka index, can be
613: accessed with @code{i}. E.g., the loop
614: @example
615: 10 0 ?DO
616: i .
617: LOOP
618: @end example
619: prints
620: @example
621: 0 1 2 3 4 5 6 7 8 9
622: @end example
623: The index of the innermost loop can be accessed with @code{i}, the index
624: of the next loop with @code{j}, and the index of the third loop with
625: @code{k}.
626:
627: The loop control data are kept on the return stack, so there are some
628: restrictions on mixing return stack accesses and counted loop
629: words. E.g., if you put values on the return stack outside the loop, you
630: cannot read them inside the loop. If you put values on the return stack
631: within a loop, you have to remove them before the end of the loop and
632: before accessing the index of the loop.
633:
634: There are several variations on the counted loop:
635:
636: @code{LEAVE} leaves the innermost counted loop immediately.
637:
638: @code{LOOP} can be replaced with @code{@var{n} +LOOP}; this updates the
639: index by @var{n} instead of by 1. The loop is terminated when the border
640: between @var{limit-1} and @var{limit} is crossed. E.g.:
641:
642: 4 0 ?DO i . 2 +LOOP prints 0 2
1.3 anton 643:
1.1 anton 644: 4 1 ?DO i . 2 +LOOP prints 1 3
645:
646: The behaviour of @code{@var{n} +LOOP} is peculiar when @var{n} is negative:
647:
648: -1 0 ?DO i . -1 +LOOP prints 0 -1
1.3 anton 649:
1.1 anton 650: 0 0 ?DO i . -1 +LOOP prints nothing
651:
652: Therefore we recommend avoiding using @code{@var{n} +LOOP} with negative
653: @var{n}. One alternative is @code{@var{n} S+LOOP}, where the negative
654: case behaves symmetrical to the positive case:
655:
656: -2 0 ?DO i . -1 +LOOP prints 0 -1
1.3 anton 657:
1.1 anton 658: -1 0 ?DO i . -1 +LOOP prints 0
1.3 anton 659:
1.1 anton 660: 0 0 ?DO i . -1 +LOOP prints nothing
661:
662: The loop is terminated when the border between @var{limit-sgn(n)} and
663: @var{limit} is crossed. However, @code{S+LOOP} is not part of the ANS
664: Forth standard.
665:
1.4 anton 666: @code{?DO} can be replaced by @code{DO}. @code{DO} enters the loop even
667: when the start and the limit value are equal. We do not recommend using
668: @code{DO}. It will just give you maintenance troubles.
1.1 anton 669:
1.5 anton 670: @code{UNLOOP} is used to prepare for an abnormal loop exit, e.g., via
671: @code{EXIT}. @code{UNLOOP} removes the loop control parameters from the
672: return stack so @code{EXIT} can get to its return address.
673:
674: Another counted loop is
675: @example
676: @var{n}
677: FOR
678: @var{body}
679: NEXT
680: @end example
681: This is the preferred loop of native code compiler writers who are too
682: lazy to optimize @code{?DO} loops properly. In GNU Forth, this loop
683: iterates @var{n+1} times; @code{i} produces values starting with @var{n}
684: and ending with 0. Other Forth systems may differently, even if they
685: support @code{FOR} loops.
686:
1.1 anton 687:
688: @contents
689: @bye
690:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>