Annotation of gforth/gforth.texi, revision 1.1
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
! 109: !! Insert Goals here
! 110:
! 111: @node Other Books, Invocation, Goals, Top
! 112: @chapter Other books on ANS Forth
! 113:
! 114: As the standard is relatively new, there are not many books out yet. It
! 115: is not recommended to learn Forth by using GNU Forth and a book that is
! 116: not written for ANS Forth, as you will not know your mistakes from the
! 117: deviations of the book.
! 118:
! 119: There is, of course, the standard, the definite reference if you want to
! 120: write ANS Forth programs. It will be available in printed form from
! 121: !! somtime in spring or summer 1994. If you are lucky, you can still get
! 122: dpANS6 (the draft that was approved as standard) by aftp from
! 123: ftp.uu.net:/vendor/minerva/x3j14.
! 124:
! 125: @cite{Forth: The new model} by Jack Woehr (!! Publisher) is an introductory
! 126: book based on a draft version of the standard. It does not cover the
! 127: whole standard. It also contains interesting background information
! 128: (Jack Woehr was in the ANS Forth Technical Committe).
! 129:
! 130: @node Invocation, Words, Other Books, Top
! 131: @chapter Invocation
! 132:
! 133: You will usually just say @code{gforth}. More generally, the default GNU
! 134: Forth image can be invoked like this
! 135:
! 136: @example
! 137: gforth [--batch] [files] [-e forth-code]
! 138: @end example
! 139:
! 140: The @code{--batch} option makes @code{gforth} exit after processing the
! 141: command line. Also, the startup message is suppressed. @file{files} are
! 142: Forth source files that are executed in the order in which they
! 143: appear. The @code{-e @samp{forth-code}} or @code{--evaluate
! 144: @samp{forth-code}} option evaluates the forth code; it can be freely
! 145: mixed with the files. This option takes only one argument; if you want
! 146: to evaluate more Forth words, you have to quote them or use several
! 147: @code{-e}s. !! option for suppressing default loading.
! 148:
! 149: You can use the command line option @code{-i @samp{file}} or
! 150: @code{--image-file @samp{file}} to specify a different image file. Note
! 151: that this option must be the first in the command line. The rest of the
! 152: command line is processed by the image file.
! 153:
! 154: If the @code{--image-file} option is not used, GNU Forth searches for a
! 155: file named @file{gforth.fi} in the path specified by the environment
! 156: variable @code{GFORTHPATH}; if this does not exist, in
! 157: @file{/usr/local/lib/gforth} and in @file{/usr/lib/gforth}.
! 158:
! 159: @node Words, , Invocation, Top
! 160: @chapter Forth Words
! 161:
! 162: @menu
! 163: * Notation::
! 164: * Arithmetic::
! 165: * Stack Manipulation::
! 166: * Memory access::
! 167: * Control Structures::
! 168: * Local Variables::
! 169: * Defining Words::
! 170: * Vocabularies::
! 171: * Files::
! 172: * Blocks::
! 173: * Other I/O::
! 174: * Programming Tools::
! 175: @end menu
! 176:
! 177: @node Notation, Arithmetic, Words, Words
! 178: @section Notation
! 179:
! 180: The Forth words are describes in this section in the glossary notation
! 181: that has become a de-facto standard for Forth texts, i.e.
! 182:
! 183: @quotation
! 184: @samp{word} @samp{Stack effect} @samp{pronunciation} @samp{wordset}
! 185: @samp{Description}
! 186: @end quotation
! 187:
! 188: @table @samp
! 189: @item word
! 190: The name of the word. BTW, GNU Forth is case insensitive, so you can
! 191: type the words in in lower case.
! 192:
! 193: @item Stack effect
! 194: The stack effect is written in the notation @code{@samp{before} --
! 195: @samp{after}}, where @samp{before} and @samp{after} describe the top of
! 196: stack entries before and after the execution of the word. The rest of
! 197: the stack is not touched by the word. The top of stack is rightmost,
! 198: i.e., a stack sequence is written as it is typed in. Note that GNU Forth
! 199: uses a separate floating point stack, but a unified stack
! 200: notation. Also, return stack effects are not shown in @samp{stack
! 201: effect}, but in @samp{Description}. The name of a stack item describes
! 202: the type and/or the function of the item. See below for a discussion of
! 203: the types.
! 204:
! 205: @item pronunciation
! 206: How the word is pronounced
! 207:
! 208: @item wordset
! 209: The ANS Forth standard is divided into several wordsets. A standard
! 210: system need not support all of them. So, the fewer wordsets your program
! 211: uses the more portable it will be in theory. However, we suspect that
! 212: most ANS Forth systems on personal machines will feature all
! 213: wordsets. Words that are not defined in the ANS standard have
! 214: @code{gforth} as wordset.
! 215:
! 216: @item Description
! 217: A description of the behaviour of the word.
! 218: @end table
! 219:
! 220: The name of a stack item corresponds in the following way with its type:
! 221:
! 222: @table @code
! 223: @item name starts with
! 224: Type
! 225: @item f
! 226: Bool, i.e. false (0) or true (-1).
! 227: @item c
! 228: Char
! 229: @item w
! 230: Cell, can contain an integer or an address
! 231: @item n
! 232: signed integer
! 233: @item u
! 234: unsigned integer
! 235: @item d
! 236: double sized signed integer
! 237: @item ud
! 238: double sized unsigned integer
! 239: @item r
! 240: Float
! 241: @item a_
! 242: Cell-aligned address
! 243: @item c_
! 244: Char-aligned address (note that a Char is two bytes in Windows NT)
! 245: @item f_
! 246: Float-aligned address
! 247: @item df_
! 248: Address aligned for IEEE double precision float
! 249: @item sf_
! 250: Address aligned for IEEE single precision float
! 251: @item xt
! 252: Execution token, same size as Cell
! 253: @item wid
! 254: Wordlist ID, same size as Cell
! 255: @item f83name
! 256: Pointer to a name structure
! 257: @end table
! 258:
! 259: @node Arithmetic, , Notation, Words
! 260: @section Arithmetic
! 261: Forth arithmetic is not checked, i.e., you will not hear about integer
! 262: overflow on addition or multiplication, you may hear about division by
! 263: zero if you are lucky. The operator is written after the operands, but
! 264: the operands are still in the original order. I.e., the infix @code{2-1}
! 265: corresponds to @code{2 1 -}. Forth offers a variety of division
! 266: operators. If you perform division with potentially negative operands,
! 267: you do not want to use @code{/} or @code{/mod} with its undefined
! 268: behaviour, but rather @code{fm/mod} or @code{sm/mod} (probably the
! 269: former).
! 270:
! 271: @subsection Single precision
! 272: +
! 273: -
! 274: *
! 275: /
! 276: mod
! 277: /mod
! 278: negate
! 279: abs
! 280: min
! 281: max
! 282:
! 283: @subsection Bitwise operations
! 284: and
! 285: or
! 286: xor
! 287: invert
! 288: 2*
! 289: 2/
! 290:
! 291: @subsection Mixed precision
! 292: m+
! 293: */
! 294: */mod
! 295: m*
! 296: um*
! 297: m*/
! 298: um/mod
! 299: fm/mod
! 300: sm/rem
! 301:
! 302: @subsection Double precision
! 303: d+
! 304: d-
! 305: dnegate
! 306: dabs
! 307: dmin
! 308: dmax
! 309:
! 310: @node Stack Manipulation,,,
! 311: @section Stack Manipulation
! 312:
! 313: gforth has a data stack (aka parameter stack) for characters, cells,
! 314: addresses, and double cells, a floating point stack for floating point
! 315: numbers, a return stack for storing the return addresses of colon
! 316: definitions and other data, and a locals stack for storing local
! 317: variables. Note that while every sane Forth has a separate floating
! 318: point stack, this is not strictly required; an ANS Forth system could
! 319: theoretically keep floating point numbers on the data stack. As an
! 320: additional difficulty, you don't know how many cells a floating point
! 321: numkber takes. It is reportedly possible to write words in a way that
! 322: they work also for a unified stack model, but we do not recommend trying
! 323: it. Also, a Forth system to keep the local variables on the return
! 324: stack. This is reasonable, as local variables usually eliminate the need
! 325: to use the return stack explicitely. So, if you want to produce a
! 326: standard complying program and if you are using local variables in a
! 327: word, forget about return stack manipulations in that word (see the
! 328: standard document for the exact rules).
! 329:
! 330: @subsetion Data stack
! 331: drop
! 332: nip
! 333: dup
! 334: over
! 335: tuck
! 336: swap
! 337: rot
! 338: -rot
! 339: ?dup
! 340: pick
! 341: roll
! 342: 2drop
! 343: 2nip
! 344: 2dup
! 345: 2over
! 346: 2tuck
! 347: 2swap
! 348: 2rot
! 349:
! 350: @subsection Floating point stack
! 351: fdrop
! 352: fnip
! 353: fdup
! 354: fover
! 355: ftuck
! 356: fswap
! 357: frot
! 358:
! 359: @subsection Return stack
! 360: >r
! 361: r>
! 362: r@
! 363: rdrop
! 364: 2>r
! 365: 2r>
! 366:
! 367: @subsection Locals stack
! 368:
! 369: @subsection Stack pointer manipulation
! 370: sp@
! 371: sp!
! 372: fp@
! 373: fp!
! 374: rp@
! 375: rp!
! 376: lp@
! 377: lp!
! 378:
! 379: @node Memory access
! 380: @section Memory access
! 381:
! 382: @subsection Stack-Memory transfers
! 383: @
! 384: !
! 385: +!
! 386: c@
! 387: c!
! 388: 2@
! 389: 2!
! 390: f@
! 391: f!
! 392: sf@
! 393: sf!
! 394: df@
! 395: df!
! 396:
! 397: @subsection Memory block access
! 398:
! 399: move
! 400: fill
! 401: blanks
! 402: erase
! 403:
! 404: @node Control Structures
! 405: @section Control Structures
! 406:
! 407: Control structures in Forth cannot be used in interpret state, only in
! 408: compile state, i.e., in a colon definition. We do not like this
! 409: limitation, but have not seen a satisfying way around it yet, although
! 410: many schemes have been proposed.
! 411:
! 412: @subsection Selection
! 413:
! 414: @example
! 415: @var{flag}
! 416: IF
! 417: @var{code}
! 418: ENDIF
! 419: @end example
! 420:
! 421: @example
! 422: @var{flag}
! 423: IF
! 424: @var{code1}
! 425: ELSE
! 426: @var{code2}
! 427: ENDIF
! 428: @end example
! 429:
! 430: You can use @code{THEN} instead of {ENDIF}. Indeed, @code{THEN} is
! 431: standard, and @code{ENDIF} is not, although it is quite popular. We
! 432: recommend using @code{ENDIF}, because it is less confusing for people
! 433: who also know other languages (and is not prone to reinforcing negative
! 434: prejudices against Forth in these people). Adding @code{ENDIF} to a
! 435: system that only supplies @code{THEN} is simple:
! 436: @example
! 437: : endif POSTPONE then ; immediate
! 438: @end example
! 439:
! 440: We also provide the words @code{?dup-if} and @code{?dup-not-if}, so you
! 441: can avoid using @code{?dup}.
! 442:
! 443: @example
! 444: @var{n}
! 445: CASE
! 446: @var{n1} OF @var{code1} ENDOF
! 447: @var{n2} OF @var{code2} ENDOF
! 448: @dots
! 449: ENDCASE
! 450: @end example
! 451:
! 452: Executes the first @var{codei}, where the @var{ni} is equal to
! 453: @var{n}. A default case can be added by simply writing the code after
! 454: the last @code{ENDOF}. It may use @var{n}, which is on top of the stack,
! 455: but must not consume it.
! 456:
! 457: @subsection Simple Loops
! 458:
! 459: @example
! 460: BEGIN
! 461: @var{code1}
! 462: @var{flag}
! 463: WHILE
! 464: @var{code2}
! 465: REPEAT
! 466: @end example
! 467:
! 468: @var{code1} is executed and @var{flag} is computed. If it is true,
! 469: @var{code2} is executed and the loop is restarted; If @var{flag} is false, execution continues after the @code{REPEAT}.
! 470:
! 471: @example
! 472: BEGIN
! 473: @var{code}
! 474: @var{flag}
! 475: UNTIL
! 476: @end example
! 477:
! 478: @var{code} is executed. The loop is restarted if @code{flag} is false.
! 479:
! 480: @example
! 481: BEGIN
! 482: @var{code}
! 483: AGAIN
! 484: @end example
! 485:
! 486: This is an endless loop.
! 487:
! 488: @subsection Counted Loops
! 489:
! 490: The basic counted loop is:
! 491: @example
! 492: @var{limit} @var{start}
! 493: ?DO
! 494: @var{body}
! 495: LOOP
! 496: @end example
! 497:
! 498: This performs one iteration for every integer, starting from @var{start}
! 499: and up to, but excluding @var{limit}. The counter, aka index, can be
! 500: accessed with @code{i}. E.g., the loop
! 501: @example
! 502: 10 0 ?DO
! 503: i .
! 504: LOOP
! 505: @end example
! 506: prints
! 507: @example
! 508: 0 1 2 3 4 5 6 7 8 9
! 509: @end example
! 510: The index of the innermost loop can be accessed with @code{i}, the index
! 511: of the next loop with @code{j}, and the index of the third loop with
! 512: @code{k}.
! 513:
! 514: The loop control data are kept on the return stack, so there are some
! 515: restrictions on mixing return stack accesses and counted loop
! 516: words. E.g., if you put values on the return stack outside the loop, you
! 517: cannot read them inside the loop. If you put values on the return stack
! 518: within a loop, you have to remove them before the end of the loop and
! 519: before accessing the index of the loop.
! 520:
! 521: There are several variations on the counted loop:
! 522:
! 523: @code{LEAVE} leaves the innermost counted loop immediately.
! 524:
! 525: @code{LOOP} can be replaced with @code{@var{n} +LOOP}; this updates the
! 526: index by @var{n} instead of by 1. The loop is terminated when the border
! 527: between @var{limit-1} and @var{limit} is crossed. E.g.:
! 528:
! 529: 4 0 ?DO i . 2 +LOOP prints 0 2
! 530: 4 1 ?DO i . 2 +LOOP prints 1 3
! 531:
! 532: The behaviour of @code{@var{n} +LOOP} is peculiar when @var{n} is negative:
! 533:
! 534: -1 0 ?DO i . -1 +LOOP prints 0 -1
! 535: 0 0 ?DO i . -1 +LOOP prints nothing
! 536:
! 537: Therefore we recommend avoiding using @code{@var{n} +LOOP} with negative
! 538: @var{n}. One alternative is @code{@var{n} S+LOOP}, where the negative
! 539: case behaves symmetrical to the positive case:
! 540:
! 541: -2 0 ?DO i . -1 +LOOP prints 0 -1
! 542: -1 0 ?DO i . -1 +LOOP prints 0
! 543: 0 0 ?DO i . -1 +LOOP prints nothing
! 544:
! 545: The loop is terminated when the border between @var{limit-sgn(n)} and
! 546: @var{limit} is crossed. However, @code{S+LOOP} is not part of the ANS
! 547: Forth standard.
! 548:
! 549: The @code{?DO} can be replaced by @code{DO}. @code{DO} enters the loop
! 550: even when the start and the limit value are equal. We do not recommend
! 551: using @code{DO}. It will just give you maintenance troubles.
! 552:
! 553: FOR NEXT UNLOOP
! 554:
! 555: @contents
! 556: @bye
! 557:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>