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

($commands) .dup .where (.pop .pop) (.sysdict .maxlength .dict .def) /ifelse

$commands .begin
.sysdict (.dup .itype 7 .eq (.exch .def)(.pop .pop) /ifelse).cvx .dictforall
.end

($ptypes) .dup .where (.pop .pop) (15 .dict .def) /ifelse

$ptypes .begin
(.nulltype)((nulltype -- no value)=).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
(.streamtype)((streamtype -- no value)=).cvx .def
(.commandtype)((commandtype -- value is: ) .print $commands .exch .get =).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
(.stacktype)((stacktype -- no value)=).cvx .def
(.frametype)((frametype -- no value)=).cvx .def
(.marktype)((marktype -- no value)=).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