($help) .dup .where (.pop .pop) (100 .dict .def) .ifelse .cvx .exec
(/def)
(3 .copy .exch .pop .def .pop $help 3 1 .roll .put) .cvx .def
(/xdef)
(3 .copy .exch .pop .cvx .def .pop $help 3 1 .roll .put) .cvx .def
(/def)
("/def" accepts three entries on the stack: a key, string, and value.
the string is stored under the key in the $help dictionary, and
the value is stored as a noun under the key in the current dictionary.)
(/def) .load /def
(/xdef)
("/xdef" accepts three entries on the stack: a key, string, and value.
the string is stored under the key in the $help dictionary, and
the value is stored as a verb under the key in the current dictionary.)
(/xdef) .load /xdef
(?)
("?" prints the explanation of the given key from the $help dictionary)
($help .exch .get =)/xdef
(??)
("??" prints the names of all the utility commands found in the $help
dictionary.)
($help /kdir)/xdef
(=)
("=" prints the top of the stack on the default display)
(( ) .cvis .print (
).print)/xdef
(/pause)
(/pause is used to pause the execution of a program until the user types something.)
((
** type CR to continue)= .mystream .readitem .pop .pop)/xdef
(/stk)
("/stk" prints (without destroying) the contents of the operand stack.)
(.cntstk .dup 1 .add .copy (.dup .type .print
( ).print = ) .cvx .rept .pop)/xdef
(/pstk)
("/pstk" pretty prints (without destroying) the contents of the operand stack.)
(.cntstk .dup 1 .add .copy (==) .cvx .rept .pop)/xdef
(/clr)
("/clr" clears the operand stack (same as .clrstk))
(.clrstk) /xdef
(/dir)
("/dir" prints the contents of the dictionary on top of the operand stack.)
((.exch ( ) .cvis .print ( ).print .dup .type .print ( ).print =) .cvx .dictforall)/xdef
(/kdir)
("/kdir" prints the keys found in the dictionary on the top of the operand
stack.)
((.exch = .pop) .cvx .dictforall)/xdef
(/if)
("/if" is equivalent to ".cvx .if")
(.cvx .if)/xdef
(/ifelse)
("/ifelse" is equivalent to " .ifelse .cvx .exec")
(.ifelse .cvx .exec)/xdef
([)
("[" is a command that marks the operand stack for use by the command "]".
This pair of commands is use to create arrays. For example:
[ 1 2 (hello) ]
will create an array containing two integers (1 and 2) and the string
"hello".)
(.mark)/xdef
(])
("]" is a command that counts the elements after the mark on the stack and
puts these elements into an array which is left on the stack.
The pair of commands ( "[" and "]" ) is use to create arrays. For example:
[ 1 2 (hello) ]
will create an array containing two integers (1 and 2) and the string
"hello".)
(.cnttomrk .array .astore .exch .pop)/xdef
(/altfile)
(/altfile redefines the definition of .print so that printing is done on an alternate
file. /endalt exits this state.)
( (.print) .load $altfile .begin (/altprint) .exch .def
(Enter alternate file name:) /altprint .mystream .readline .pop .token (.cvlit 6 .bytestream (altfile) .exch .def .pop )((bad file name - ) /altprint /altprint .end)/ifelse)
/xdef
($altfile) .dup .where (.pop .pop) .cvx (10 .dict .def) .cvx .ifelse
(/altprint)(.print) .load
$altfile .begin
.def
(.prompt)((alt>) /altprint ).cvx .def
(.print)
(.dup /altprint altfile .exch .writebytes).cvx .def
(/endalt)(altfile .killstream .end) .cvx .def
.end
(==)
(== is used to print all types of objects in a manner which can easily be
read. The object to be printed is expected on the operand stack.
<x> == => -- )
(($tab$) -1 .def pprint )/xdef
(pprint)
(pprint supports == and does all the printing)
(.dup .type $ptypes .exch .get .exec)/xdef
($ptypes) .dup .where (.pop .pop) (15 .dict .def) /ifelse
$ptypes .begin
(.nulltype)((nulltype -- no value)= .pop).cvx .def
(.integertype)((integertype -- value is: ).print =).cvx .def
(.longintegertype)((longintegertype -- value is: ).print =).cvx .def
(.realtype)((realtype -- value is: ).print =).cvx .def
(.booleantype)((booleantype -- value is: ).print =).cvx .def
(.stringtype)((stringtype -- value is: ).print =).cvx .def
(.inputtype)((inputtype -- no value)= .pop).cvx .def
(.outputtype)((outputtype -- no value)= .pop).cvx .def
(.commandtype)((commandtype -- value is: ).print .commandname =).cvx .def
(.dicttype)((dicttype -- length is: ).print .dup .length ( ).cvis .print ( maxlength is: ).print .maxlength =).cvx .def
(.arraytype)(tabinc tabprint(array: )= (tabprint pprint).cvx .arrayforall tabdec).cvx .def
(.localstype)((localstype -- no value)= .pop).cvx .def
(.marktype)((marktype -- no value)= .pop).cvx .def
.end
(tabinc)(($tab$) .dup .load 1 .add .store).cvx .def
(tabprint)($tab$ (( ).print).cvx .rept).cvx .def
(tabdec)(($tab$) .dup .load 1 .sub .store).cvx .def