($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. == => -- ) (($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