Summary of Forth Style Conventions

This is a Forth Style guide for Forth-83 placed in the public domain by Leo Brodie

Spacing and Indentation Guidelines

  • 1 space between the colon and the name
  • 2 spaces between the name and the comment *
  • 2 spaces, or a carriage return, after the comment and before the definition *
  • 3 spaces between the name and definition if no comment is used
  • 3 spaces indentation on each subsequent line (or multiples of 3 for nested indentation)
  • 1 space between words/numbers with a phrase
  • 2 or 3 spaces between phrases
  • 1 space between the last word and the semicolon
  • 1 space between the semicolon and IMMEDIATE (if invoked)

No blank lines between definitions, except to separate distinct groups of defintions

* An often seen-alternative calls for 1 more space between the name and comment and 3 between the comment and the defintion. A more liberal technique uses 3 spaces before and after teh comment. Whatever you choose, be consistent.


Stack-Comment abbreviations

     n            single-length signed number
     d            double-length signed number
     u            single-length unsigned number
     ud           double-length unsigned number
     t            triple-length
     q            quadruple-length
     c            7-bit character value
     b            8-bit byte
     ?            boolean flag; or :
     t=           true
     f=           false
     a or adr     address
     acf          address of code field
     apf          address of parameter field
     '            (as prefix) address of
     s d          (as a pair) source destination
     lo hi        lower-limit upper-limit (inclusive)
     #            count
     o            offset
     i            index
     m            mask
     x            don't care (data structure notation)

An "offset" is a difference expressed in absolute units, such as bytes.
An "index" is a difference expressed in logical units, such as elements or records.


Input-Stream Comment Designations

     c             single character, blank delimited
     name          sequence of characters, blank delimited
     text          sequence of characters, delimited by nonblank

Follow "text" with the actual delimiter required, e.g., text" or text).


Samples of Good Commenting Style

Here are two sample screens to illustrate good commenting style.


Screen #126
 0 \ Formatter          Data Structures -- p.2    06/06/83
 1  6 CONSTANT TMARGIN  \ line# where body of text begins
 2 55 CONSTANT BMARGIN  \ line# where body of text ends
 3
 4 CREATE HEADER  82 ALLOT
 5   ( 1left-cnt | 1right-cnt | 80header )
 6 CREATE FOOTER  82 ALLOT
 7   ( 1left-cnt | 1right-cnt | 80footer )
 8
 9 VARIABLE ACROSS   \ formatter's current horizontal position
10 VARIABLE DOWNWARD \ formatter's current vertical position
11 VARIABLE LEFT     \ current primary left margin
12 VARIABLE WALL     \ current primary right margin
13 VARIABLE WALL-WAS \ WALL when curr. line started being formatted
14
15

Screen #127
 0 \ Formatter          positioning -- p.1        06/06/83
 1 : SKIP  ( n -- )  ACROSS +! ;
 2 : NEWLEFT      \ reset left margin
 3    LEFT @  PERMANENT @ + TEMPORARY @ + ACROSS ! ;
 4 : \LINE        \ begin new line
 5    DOOR CR'   1 DOWNWARD +!  NEWLEFT  WALL @ WALL-WAS ! ;
 6 : AT-TO{? ( -- t=at-top )   TMARGIN DOWNWARD @ = ;
 7 : >TMARGIN     \ move from crease to TMARGIN
 8      0 DOWNWARD !  BEGIN \LINE  AT-TOP? UNTIL ;
 9
10
11
12
13
14
15 


Naming Conventions

Meaning Form Example
 
Arithmetic
integer 1 1name 1+
integer 2 2name 2*
takes relative input parameters +name +DRAW
takes scaled input parameters *name *DRAW
 
Compilation
start of "high level" code name: CASE:
end of "high level" code ;name ;CODE
put something into dictionary name, C,
executes at compile time [name] [COMPILE]
(slightly different) name' (prime) CR'
internal form or primitive (name) (TYPE)
<name> <TYPE>
compiling word run-time part:
systems with no folding lower-case if
systems with folding (NAME) (IF)
defining word :name :COLOR
block-number where overlay begins namING DISKING
 
Data Structures
table or array names EMPLOYEES
total number of elements #name #EMPLOYEES
current item number (variable) name# EMPLOYEE#
sets current item ( n )name 13 EMPLOYEE
advance to next element +name +EMPLOYEE
size of offset to item from name+ DATE+
beginning of structure
size of (bytes per) /name /EMPLOYEE
(short for BYTES/name)
index pointer >name >IN
convert address of structure to >name >BODY
address of item
file index (name) (PEOPLE)
file pointer -name -JOB
initialize structure 0name 0RECORD
Note: The Forth Scientific Library uses a different style for arrays and structures.
 
Direction, Conversion
backwards name< SLIDE<
forwards name< CMOVE<
from <name <TAPE
to >name >TAPE
convert to name>name FEET>METERS
downward \name \LINE
upward /name /LINE
open {name {FILE
close }name FILE}
 
Logic, Control
return boolean value name? SHORT?
returns reversed boolean value -name? -SHORT?
address of boolean 'name? 'SHORT?
operates conditionally ?name ?DUP
(maybe DUP)
enable +name +CLOCK
or, absence of symbol name BLINKING
disable -name -CLOCK
-BLINKING
 
Memory
save value of (to stack) @name @CURSOR
restore value of !name !CURSOR
store into name! SECONDS!
fetch from name@ INDEX@
name of buffer :name :INSERT
address of name 'name 'S
address of pointer to name 'name 'TYPE
exchange, especially bytes >name< >MOVE<
 
Numeric Types
byte length Cname C@
2 cell size, 2's complement Dname D@
integer encoding
mixed 16 and 32-bit operator Mname M*
3 cell size Tname T*
4 cell size Qname Q*
unsigned encoding Uname U.
 
Output, Printing
print item .name .S
print numeric name. D. U.
(name denotes type)
print right justified name .R U.R
 
Quantity
"per" /name /SIDE
 
Sequencing
start <name <#
end name> #>
 
Text
string follows delimited by " name" ABORT" text"
text or string operator "name "COMPARE
(similar to $ prefix in BASIC)
superstring array "name" "COLORS"

How to pronounce the Symbols

     !          store
     @          fetch
     #          sharp ( or "number" as in #RECORDS)
     $          dollar
     %          percent
     ^          caret
     &          ampersand
     *          star
     (          left paren; paren
     )          right paren; paren
     -          dash; not
     +          plus
     =          equals
     { }        faces (traditionally called "curly brackets")
     [ ]        square brackets
     "          quote
     '          as prefix: tick; as suffix: prime
     ~          tilde
     |          bar
     \          backslash (also "under", "down" and "skip")
     /          slash (also "up")
     <          less than
                left dart
     >          greater than
                right dart
     ?          question (some prefer "query")
     ,          comma
     .          dot

Source: Brodie, Leo, 1984; Thinking Forth, A Language and a Philosophy for Solving Problems, Prentice-Hall, Englewood Cliffs, N.J., 300 pages. ISBN 0-13-917568-7

This book has been out of print, and is now being republished by the Forth Interest Group.