[sci.virtual-worlds] 5D Design: Part 1 of 4

thinman@netcom.com (Lance Norskog) (04/22/91)

                                  - 1 -












                           5D Reference Manual

                               Revision 0.1
                         Release date: 4/21/1991


          Copyright (c) 1991 by Lance Norskog, Santa Clara, USA









       1.  _I_n_t_r_o_d_u_c_t_i_o_n

       5D is a portable implementation of "virtual reality".  It
       implements a simple, extensible programming language for
       real-time 3D graphics interaction, and forms the basis of a
       cyberspace/hypermedia-oriented window system.

       1.1  _S_c_o_p_e__o_f__5_D

       5D only addresses the _h_a_r_d_w_a_r_e _c_o_n_t_r_o_l level of 5D.  It
       provides a pleasant programming language for creating custom
       user interfaces, and network protocols for user interaction.
       This system is intended first as a platform for
       experimentation in 5D user interface and network interaction
       betwixt decks in larger persistent worlds.

       1.2  _P_o_s_s_i_b_l_e__a_p_p_l_i_c_a_t_i_o_n_s

       5D is a Cyberspace building block.  It communicates data in
       the form of 5D programs.  The 5D language encoding is dense
       enough to download simple worlds in several minutes over
       commodity 9600 baud modems, or ISDN.  With the future
       inclusion of a 2D text rendering model, 5D could support
       hypertext applications at this bandwidth.  X.25's ability to
       support several simultaneous connections to separate phone
       numbers opens impressive groupware and cyberspace doors.











                                  - 2 -



       The reference application for low-end decks is MazeWar.
       Several players on an Ethernet, one to a deck, wander
       through a maze shooting at each other.  The decks
       continuously broadcast the position, eye direction, laser
       direction, and trigger status of their users.

       Scientific Visualization uses multi-dimensional viewing
       methods.  Ray-tracing systems often include "fog"
       implemented as 3D stochastic white-out blurring.  A 5D
       system could support sci-vis by implementing fog from a 3D
       dataset, thus allowing a surgeon to _e_x_p_e_r_i_e_n_c_e a brain scan
       instead of viewing it.  This will, of course, not run in
       real-time on a PC.

       The Habitat system [ref ??] uses standard computer game
       technology and telecommunications to implement Cyberspace
       with a real-time quasi-3D interface.  Every evening 300-400
       people sit at home with a Commodore 64 and a 300 baud modem
       playing an elaborate and permanent computer game with up to
       5 other subscribers in a room or "cell".  Habitat has 20,000
       cells total, and 15,000 paying subscribers.  It should be
       possible to implement a 5D version of the Habitat system at
       baud rates of 9600 on up.

       1.3  _5_D__G_l_o_s_s_a_r_y

       world               A "world" is a visible 3D scene with
                           which the user interacts.

       deck                A "deck" is the combination of visual,
                           sound, and force-feedback hardware that
                           implements a 5D environment for one or a
                           few users.

       program             On a network, a "program" is the remote
                           application which is responsible for a
                           world.

       World Manager       A World Manager is a remote program
                           responsible for the main operation of
                           the deck.  A typical deck is set up to
                           have more than one world available; the
                           WM allows switching between the
                           different worlds.

       TerraFormer         The TTTTeeeerrrrrrrraaaaFFFFoooorrrrmmmmeeeerrrr is a visual programming
                           CASE system for 5D trees.  It is a 5D
                           program which presents a tree as a 3D
                           scene, using translucent structure
                           blocks to display several levels of
                           structure simultaneously.











                                  - 3 -



       2.  _5_D__S_y_s_t_e_m__A_r_c_h_i_t_e_c_t_u_r_e

       5D runs on personal computers and professional workstations.
       It presents an interactive real-time 3D environment for the
       user to work with.  It may read in and present a "canned"
       world description from a file, or download one over a
       network connection.  The world description consists of
       picture elements (polygons, spheres, etc.)  which are drawn
       in 3D, and many other software constructs necessary to
       implement a complete free-running program inside the deck.
       Constructs include various 3D graphics mathematics
       operations, sound generation control, force feedback
       control, and network communications.

       5D is a real-time simulation system for 3D graphics scenes.
       A collection of objects exists, and exhibit various
       behaviors in response to external input.

       2.1  _L_a_n_g_u_a_g_e__D_e_s_i_g_n__P_h_i_l_o_s_o_p_h_y

       "_W_e _t_o_o_k _a _f_e_w _s_i_m_p_l_e _i_d_e_a_s _a_n_d _b_e_a_t _t_h_e_m _t_o _d_e_a_t_h."
       - _D_e_n_n_i_s _R_i_t_c_h_i_e _n_e_v_e_r _s_a_i_d _t_h_i_s _a_b_o_u_t _d_e_s_i_g_n_i_n_g _U_N_I_X.

       A real-time software system must veer in one of two opposing
       directions:

          +o it can allow the programmer complete control over the
            computer, and provide a range of services to a program,
            _o_r

          +o it can take over the low-level control of the computer
            and provide a set of high-level constructs which the
            programmer can arrange into a program.  The system then
            implements real-time response by "doing the best it
            can" based on the given constructs.

       5D chooses the latter method.  It is a simulation
       description language.  It includes a rich set of very
       abstract operators for describing 3D graphics scenes.  The
       point is to get as close as possible to letting the
       programmer say "_d_o _w_h_a_t _I _m_e_a_n".  A general principle is
       that the more abstract the language, the more efficient the
       compiled code IFF the language constructs are carefully
       designed for compilability.  The more the compiler
       understands what you're "really" doing, the better code it
       can generate.
















                                  - 4 -



       2.2  _C_o_n_t_r_o_l

       "_W_h_e_n _I _h_e_a_r _t_h_e _w_o_r_d _M_a_c _I _r_e_a_c_h _f_o_r _m_y _g_u_n."

       Since 5D is never saved in binary format, the user may alter
       any aspect of a world at any time.  User interfaces are
       generally designed by programmers, who are generally
       terrible at it.  5D users are not forced to operate canned
       software, but may change it at any time.  The user is in
       control, not the programmer.

       The 5D software community is encouraged to develop libraries
       of new software which can be disseminated as simple tools,
       not complete enclosed worlds.  A kinematics toolkit, for
       example, is badly needed for many applications.

       2.3  _C_l_e_a_n_l_i_n_e_s_s

       The language is defined by a small set of basic operators
       and data types, which are then combined to create useful
       programming constructs.  Parsimony is a virtue in language
       design.  _I_f _s_o_m_e_t_h_i_n_g _c_a_n _b_e _i_m_p_l_e_m_e_n_t_e_d _a_s _a _c_o_m_b_i_n_a_t_i_o_n _o_f
       _e_x_i_s_t_i_n_g _c_o_n_s_t_r_u_c_t_s, _i_t _w_i_l_l _n_o_t _b_e _d_e_f_i_n_e_d _a_s _a _s_e_p_a_r_a_t_e
       _b_u_i_l_t-_i_n _c_o_n_s_t_r_u_c_t.

       The primary motivation for this is that a system feature,
       once made available to the user community, is immortal.
       Mature systems generally have a thick layer of "barnacles",
       old features which don't slough off like dead skin.  These
       systems are much larger and more complex than they need to
       be because they must provide backwards compatibility for
       these "mistakes of youth".

       The 5D design process is a continuing search for simpler and
       more basic constructs.  The best analogy is to the physical
       world:  quarks are combined into protons, neutrons, and
       electrons, which are combined into many different molecules,
       which are ultimately combined into visible objects such as
       chairs.

       The X Window System, on the other hand, includes 1000
       different predefined molecules which don't fit together very
       well.  5D was designed with the X Window System as a shining
       example of poor design.


















                                  - 5 -



       3.  _L_a_n_g_u_a_g_e__C_o_n_c_e_p_t_s

       5D was motivated by the need for a very high-level
       programming language for implementing Virtual Reality
       software.  It is interpretable, compilable, malleable to
       parallel and custom graphics hardware configurations, and
       friendly (well, maybe) to non-programmers.

       3.1  _D_e_s_i_g_n__c_o_n_s_t_r_a_i_n_t_s

       5D has four major design constraints:

         1.  It is a programming language for designing worlds.

         2.  It is a protocol for interacting with an application.

         3.  It operates in real-time; i.e. the language constructs
             operate in a _p_r_e_d_i_c_t_a_b_l_e amount of time.

         4.  It is portable to the wide variety of the hardware
             platforms used in computer graphics.

       The search for clean, elegant solutions for the problems
       caused by these constraints is the source of most of the
       peculiar features of the language.

       3.2  _H_i_e_r_a_r_c_h_i_c_a_l__D_i_s_p_l_a_y__L_i_s_t_s

       5D was inspired by the _h_i_e_r_a_r_c_h_i_c_a_l _d_i_s_p_l_a_y _l_i_s_t.  In
       standard 3D modeling systems, a 3D scene description is
       traversed and rendered each time the scene or the viewpoint
       changes.  Abstract physical models are described as to their
       shape, color, shininess, etc. Separate copies or _i_n_s_t_a_n_c_e_s
       of these objects are then placed in 3-space.

       3.3  _I_n_h_e_r_i_t_a_n_c_e

       The objects _i_n_h_e_r_i_t their physical properties from their
       base descriptions, but an individual instance may change any
       of those properties.  Arranging these object definitions and
       instantiations into trees gives the benefits of data-hiding
       and modular software construction.  An object definition may
       include by reference other object descriptions, and may also
       change properties inherited from those object descriptions.
       Object instantiations grouped into a tree may inherit
       properties from the _p_a_r_e_n_t_s of the tree.  This is a very
       powerful technique for describing the graphics portion of a
       3D application; other techniques for data structuring can be
       layered atop it as interconnections between tree members.
       In PHIGS and other 3D modeling systems, these objects define
       a static scene, and consist solely of graphics primitives.











                                  - 6 -



       Virtual Reality also needs to describe dynamic changes in a
       world.  Games need to describe the physics of object
       collision, while molecular models must implement gradual
       force field interactions.  Many other standard programming
       facilities are needed also, such as communication protocols
       and I/O device drivers.

       3.4  _D_a_t_a_f_l_o_w__P_r_o_g_r_a_m_m_i_n_g

       5D extends the display list to a full programming language
       by using the paradigm of Dataflow Programming [ref ??].
       Dataflow languages express a complete program as a lattice
       of operations.  At the beginning of a computation, values
       enter the lattice of operations.  These values may be static
       constants, the current value of input devices, or the
       results of a previous computation.  At the end of
       computation, one or more values pop out of the "top" of the
       lattice; these are the results of the computation.

       A 5D "world" is a lattice.  This lattice is not evaluated in
       one computation.  Instead, individual sub-lattices direct
       the system when to evaluate them.  Sub-lattices draw on the
       screen, emit sound, send network messages, and operate
       force-feedback devices as side effects of their execution.

       3.4.1  _D_a_t_a_f_l_o_w__L_a_t_t_i_c_e__O_r_g_a_n_i_z_a_t_i_o_n
       Each node of the lattice has an operator, one or more
       super-nodes, zero or more subnodes, and zero or more
       properties.  For purposes of a simple language organization,
       lattices are organized into expression trees wherever
       possible.  The object definition system (see below) makes
       this feasible.

       3.5  _F_e_e_d_b_a_c_k

       5D objects can be connected in cyclic graphs.  This does not
       imply that the language can get into an endless loop!  The
       tree members are evaluated according to their frequency
       properties.  The value of a tree in a cyclic graph is
       eventually fed back into the next evaluation of that tree.
       Feedback is a natural method for implementing rhythmic
       objects and dynamics simulations; these are generally
       defined with differential equations in a feedback loop.

       3.6  _O_b_j_e_c_t__O_r_i_e_n_t_a_t_i_o_n

       5D is an object-oriented language.  The fundamental paradigm
       is object-oriented dataflow programming: a lattice, or
       directed acyclic graph, of arithmetic expressions feeds a
       set of software operations with numerical information.
       These operations may draw geometric objects, make sounds,











                                  - 7 -



       send messages over communications channels, or control
       force-feedback devices.

       Since these I/O devices must be controlled in real-time, 5D
       does not contain constructs which require an unpredictable
       amount of time to execute.  Whether this or that construct
       is "efficient" is irrelevant to real-time work;
       predictability is the issue.  Thus, very high-level language
       concepts like actors, object messaging, dynamic
       instantiation, etc. are not used.  The contents of the
       lattice is limited to operations of known execution time.
       Otherwise, the frame rate of the system would randomly vary
       from several frames per second to several seconds per frame.

       Objects are used as the organizing principle for defining
       the possible componenents of the lattice, and their possible
       interconnection.  There is a large built-in library of
       _p_r_i_m_i_t_i_v_e _c_l_a_s_s_e_s.  Programs may also define their own
       classes.  References to user-defined classes are _r_e_w_r_i_t_t_e_n
       according to their class definitions until the lattice is
       entirely in terms of the primitive classes.  The resulting
       lattice is incrementally compiled and executed repetitively.


       4.  _L_a_n_g_u_a_g_e__R_e_f_e_r_e_n_c_e

       5D uses an extremely simple language.  It is built on
       several elements:  objects, classes, properties, templates,
       trees, and IDs.  These language elements are used to
       describe rich, complex user interaction environments in a
       very dense format.

       4.1  _O_b_j_e_c_t_s__a_n_d__C_l_a_s_s_e_s

       An _o_b_j_e_c_t is an element of an interactive environment.  A
       _c_l_a_s_s is a generic description of a type of object.  Classes
       may be modified and combined to create new classes.  The
       original classes are called _p_a_r_e_n_t- or _s_u_p_e_r_c_l_a_s_s_e_s.  A deck
       starts off with many pre-defined _p_r_i_m_i_t_i_v_e _c_l_a_s_s_e_s.  A 5D
       program may include new class definitions which derive from
       the primitive ones.  A class may contain two or more objects
       from different parent classes.  This means that a class is
       always an extended or modified version of its parents.  It
       may add and delete operators and properties, possibly
       overriding definitions inherited from the parent classes.

       Objects are instances of their class definition.  Objects
       may be leaf nodes, or may be _c_o_n_s_t_r_u_c_t_e_d from objects of
       other classes.













                                  - 8 -



       4.1.1  _T_y_p_e_s
       Some classes are types, some are not.  _A_b_s_t_r_a_c_t _s_u_p_e_r_c_l_a_s_s_e_s
       are defined only so that child classes may be derived from
       them.  They are not useful for instancing objects, and thus
       do not allow this to occur.  Types are classes which may be
       used for instancing objects.

       4.2  _T_e_m_p_l_a_t_e_s

       A _t_e_m_p_l_a_t_e describes a space of possible 5D program trees.
       Templates are used several ways in 5D.  Most important,
       templates are used to describe the space of possible uses of
       an operator in a class definition.  This allows an operator
       definition to handle several different invocations.
       Templates are also used to verify a tree downloaded from a
       network connection; they supply a "syntax check" for
       accepted trees which can be used to decide whether to
       execute a downloaded tree.

       4.2.1  _T_e_m_p_l_a_t_e__s_y_n_t_a_x__[__p_r_o_p_o_s_e_d__]
       Template trees are separate type of tree node.  There are
       several forms of template node, defined by the _k_i_n_d=
       keyword.  Here are the values of the _k_i_n_d= keyword and the
       associated sub-tree formats:

       multi (X)           maps to 0 or more occurrences of the
                           tree node (X).

       order (X) (Y)       maps to the tree pair (X) (Y) or the
                           tree pair (Y) (X).

       sub (X)             maps to an arbitrary-shaped tree of
                           nodes described by (X).

       and (X) (Y)         maps to the boolean AND of the trees
                           described by (X) and (Y).

       or (X) (Y)          maps to the boolean OR of the trees
                           described by (X) and (Y).

       not (X)             maps to the boolean NOT of the tree
                           described by (X).

       Notes:
       The _o_r_d_e_r, _a_n_d, and _o_r nodes may contain two or more
       children.

       Templates are, by nature, underspecified.  A template
       without the _k_i_n_d keyword may use _t_y_p_e. A _t_y_p_e template may
       optionally use _v_a_l_u_e.  This template describes 0 or more
       Numbers:











                                  - 9 -



                (template kind=multi
                    (template type=Number))

       Tree templates may be used in combination. The template:
                (template kind=sub
                    (template kind=or
                        (template type=Void)
                        (template type=Number)))

       corresponds to one or more trees of algebraic expressions.
       Since the Number class does not operate on Voids, thus legal
       5D trees matching this template can be a one or more Number
       expressions hanging under a tree of Voids, or one Number
       expression with no Voids at all.
       Templates may be assigned IDs.

       A nodes of type Address may substitute at any place for any
       other node, if its referent node matches a template.  Nodes
       of type Address may also be specified in a template.
       [ Templates have proven the thorniest design task in 5D.
       I'm still not happy with the design. ]

       4.3  _P_r_o_p_e_r_t_i_e_s

       If objects are nouns, properties are adjectives.  Properties
       influence the nature of objects.  Drawable objects, as
       mentioned above, have colors and reflectivity.  Other
       objects have other properties:  sound channels, for example,
       have the property of volume.  The value of a property may be
       specified by a separate 5D program tree. The one restriction
       here is that no object used in the program tree may itself
       have properties.

       However, a property itself has a few attributes:

       Inheritance         The properties of a node may be
                           inherited automatically down the tree.
                           Every node of type X may use or set the
                           properties defined for class X.  An
                           inheritable property which is set at a
                           node overrides the inherited value of
                           those properties.  The new setting is
                           visible to all of its children of the
                           same type.

       Default             Every property description includes a
                           default value for a property.  If a
                           value is not specified or inherited for
                           that property, the default is used.













                                  - 10 -



       Writeability        A property may or may not be changed by
                           a node.  A read-only property may be set
                           at the top of a tree and then not reset
                           by its children.

       4.4  _T_r_e_e_s_,__L_a_t_t_i_c_e_s_,__a_n_d__C_y_c_l_i_c__G_r_a_p_h_s

       First, some basic Graph Theory:  a _g_r_a_p_h is a collection of
       nodes connected by edges.  A graph where the edges have a
       direction assigned to them is a _d_i_r_e_c_t_e_d _g_r_a_p_h.  A _t_r_e_e is a
       graph in which there are no loops at all.  A _l_a_t_t_i_c_e is a
       directed graph in which there are no loops at all.  Unlike a
       tree, a lattice may have two or more edges "pointing" at the
       same node.  A _d_i_r_e_c_t_e_d _c_y_c_l_i_c _g_r_a_p_h may have loops where the
       edges form a circle.

       In 5D a program is described by a directed graph which has
       aspects of a tree, a lattice, and a directed cyclic graph.
       A program is specified as a tree.  Each branch or leaf of
       the tree is called a _n_o_d_e.  Special _p_o_i_n_t_e_r _n_o_d_e_s may refer
       to other nodes, which may in fact be _p_a_r_e_n_t _n_o_d_e_s.  Thus,
       with pointer nodes the tree can become a lattice or even a
       cyclic graph.  [ Think of the UNIX file system with symbolic
       links. ]

       4.4.1  _P_r_o_p_e_r_t_y__I_n_h_e_r_i_t_a_n_c_e__v_i_a__p_o_i_n_t_e_r_s
       Properties are inherited statically, not dynamically.  When
       trees are executed via pointers, they still inherit their
       properties from their tree parent, not via pointing node.

       4.5  _I_D_s

       Any node in a 5D program tree may have a name attached to
       it.  This name must be unique within a subset of the tree.
       Names are assigned via the ID keyword.

       IDs is useful in several contexts.  Class definitions name
       themselves this way.  Variables named with IDs are used to
       transform the program tree into a lattice.  Certain IDs have
       special pre-defined meanings.

       4.6  _T_r_e_e__c_o_n_s_t_r_u_c_t_i_o_n_

       Each node of the tree is one of a few node types.  One or
       more keywords modify the node type.

       4.6.1  _N_o_d_e__t_y_p_e_s
       5D has several types of tree nodes:

       Class               indicates that the entire tree is a
                           class definition.  A class node must











                                  - 11 -



                           have the keywords IIIIDDDD and ssssuuuuppppeeeerrrr.

       Property            specifies a property of this node.  In a
                           class definition, a property node
                           defines a property which instances of
                           this class have.  In an object
                           instantiation, an property node sets a
                           property of this node.  A property node
                           must have the keywords IIIIDDDD and _t_y_p_e, and
                           must have a subtree containing the
                           default value of the property.

       Input               in a class definition specifies a
                           collection of superclass objects which
                           form this class.

       Data                in a class definition specifies a
                           collection of superclass objects which
                           are secret to an instantiation of this
                           class.

       Op                  specifies an operation node.  In a class
                           definition, an operation node and
                           subtree indicate a method the class
                           implements.  In an object instantiation,
                           an operation node invokes the
                           corresponding method in the class
                           definition.  An op node may have the
                           keywords IIIIDDDD and nnnnaaaammmmeeee.

       Template            specifies a variable-format tree.  A
                           template tree defines a space of
                           possible tree shapes.  It must have the
                           ffffoooorrrrmmmmaaaatttt keyword.

       Rewrite             specifies the replacement tree in a
                           method.

       Comment             is used for multi-line commentary.

       Set                 is the dataflow lattice connection
                           operation.  Set assigns the value of the
                           right-hand tree to the left-hand
                           nodename.

       4.6.2  _M_o_d_i_f_i_e_r_s
       5D has several basic modifiers:

       ID                  assigns a unique name to this node.  Any
                           node may have a name attached to it.
                           This name must be unique, subject to











                                  - 12 -



                           certain restrictions noted below in the
                           section "Scoping Rules".

       Super               indicates a superclass.  This is used
                           several ways in class definitions.  In
                           the class definition node, it names the
                           parent classes.  In the operator and
                           property definition nodes, it may be
                           used to refer to properties defined by
                           parent classes.

       Type                indicates the class of a property or
                           operation by naming the class definition
                           node.

       Name                indicates the name of the operation in
                           an operation node

       Value               indicates the actual value contained by
                           a leaf node.  A value is a number in
                           standard C decimal, octal, or hex
                           format.

       Format              defines the type of a template node in a
                           template subtree.

       Refer               means that this node is an indirect
                           node.  The value of the Refer keyword is
                           an ID.  This node receives its type and
                           value from the ID'd node.  This node may
                           also possess a Type keyword, which must
                           match the type of the ID'd node.  [ TTTThhhhiiiissss
                           iiiissss uuuuggggllllyyyy.... IIIItttt sssshhhhoooouuuulllldddd nnnnooootttt eeeexxxxiiiisssstttt....  CCCCllllaaaassssssss
                           AAAAddddddddrrrreeeessssssss hhhhaaaannnnddddlllleeeessss tttthhhhiiiissss....  EEEEiiiitttthhhheeeerrrr tttthhhhaaaatttt,,,, oooorrrr
                           ccccllllaaaassssssss AAAAddddddddrrrreeeessssssss sssshhhhoooouuuulllldddd nnnnooootttt eeeexxxxiiiisssstttt aaaannnndddd aaaallllllll
                           ppppooooiiiinnnntttteeeerrrrssss sssshhhhoooouuuulllldddd bbbbeeee ddddoooonnnneeee wwwwiiiitttthhhh RRRReeeeffffeeeerrrr.... ]

       IsType              is a boolean expression for whether or
                           not a class definition is a _t_y_p_e.  A
                           class definition which is not a type may
                           only be used as an abstract superclass,
                           it may not be used in a program.

       Inherited           is a boolean expression for whether or
                           not a property is inherited.  If it is
                           not, it must be explicitly specified in
                           each use of the object.

       Remove              deletes an inherited operator or
                           property from a class definition.












                                  - 13 -



       writeable           is a Boolean value in property
                           definitions.  If false, the property may
                           not be changed by its heirs or by the
                           "set properties" operator in the Void
                           object.

       Along with keywords, there may be arbitrary text surrounded
       by double quotes (").  These are comments and are ignored by
       the 5D interpreter.

       4.6.2.1  _C_o_m_m_e_n_t__c_o_n_v_e_n_t_i_o_n_s
       The 5D development system has several conventions for
       comments.  A comment beginning with the string "Summary:" is
       considered to be a short (one-line) summary of this tree
       node, and should be used in class, operator, and property
       definition nodes.  A comment beginning with the string
       "Treetype:" is a directive to the TTTTeeeerrrrrrrraaaaFFFFoooorrrrmmmmeeeerrrr that a tree is
       a specific type of database, such as a 3D model or a
       differential equation, and should be displayed or edited
       with a special application.

       4.7  _T_r_e_e__e_n_c_o_d_i_n_g

       There are two possible tree encodings, ascii & ASN.1 binary
       format.

       4.7.1  _A_s_c_i_i__F_o_r_m_a_t
       The 5D ASCII syntax is rudimentary, to say the least.  It is
       designed to be very quick to parse, both by a deck and by
       the TerraFormer.  It is in standard US 7-bit ASCII, with 8-
       bit and 16-bit text allowed in comments.  You may send it in
       e-mail, and control it with SCCS or RCS.  You're just not
       expected to read it, and you are strongly urged not to write
       it.

       A tree node is started by left parentheses (LP) and stopped
       by right parentheses (RP).  After the LP comes one of the
       above node type strings.  After the node type are zero or
       more keywords.  Some of the keywords may be of the form
       aaaaa=bbbbb.  These keywords are accepted by the node type
       keyword according to its wont.  After these keywords comes,
       you guessed it, another LP or an RP.  A series of RP's may
       be expressed by a right bracket (RB).  An RB substitutes for
       RP only if there can be nothing but the RP at that location.

       The exact syntax of the contents of data nodes is not final.
       Numbers are stored in the standard C "printf" floating point
       formats.  Images are stored in PBM format.  Sound samples
       are stored as a series of text numbers, unsigned.  Ascii
       text strings are not supported as data.  See section "Text".












                                  - 14 -



       4.7.2  _A_S_N_._1
       A 5D program is encoded as one large tree.  The node
       contains the type and whatever keywords are there as a data
       structure of strings.

       Existing source code from an SNMP agent which encodes and
       decodes a pre-defined ASN.1 grammar looks quite time-
       efficient.  Binary data is stored in the ASN.1 format in
       very compact formats.

       It may be necessary to process a received tree "on the fly"
       without storing the entire tree in source form.  The ASN.1
       format might work better in postfix format rather than the
       ASCII format's prefix format, Simple tree nodes are
       processed first, then knitted together.  The "incoming
       stack" maintains the database of processed trees which await
       the processing of their controlling nodes.

       4.7.3  _T_r_e_e__E_n_c_o_d_i_n_g__S_u_m_m_a_r_y
       The ASCII format is readable, and may be mailed and used
       under software control systems.  But, it is not very dense,
       and in particular uses very inefficient methods for storing
       binary data.  The ASCII format is used as a fluid medium for
       experiments in rearranging the 5D syntax.

       The ASCII format will be the dominant use in development,
       authoring, and workstation environments, but the broader
       network-based users will use ASN.1 almost exclusively
       because its an international standard and because of its
       space-efficiency.

       4.8  _C_l_a_s_s__d_e_f_i_n_i_t_i_o_n

       A class definition has up to five sections:

       Superclass          The superclasses used to derive this
                           class.

       Property            The properties used by the class.

       Data                Secret data objects used by a member of
                           this class.

       Input               Some classes are ordered lists of parent
                           objects.

       Method              The rewrite rules for the class.

       The Property, Data, and Input sections are optional.













                                  - 15 -



       4.8.1  _S_u_p_e_r_c_l_a_s_s__S_e_c_t_i_o_n
       The superclass section defines all the parent classes of a
       class.  The 5D class heirarchy is a lattice:  at the top is
       the class Object which effectively does nothing.  It is the
       only class with no superclass.  All other classes have one
       or more superclasses.  The properties and operators defined
       in the parent classes are automatically inherited by the
       class.

       4.8.2  _P_r_o_p_e_r_t_y__S_e_c_t_i_o_n
       The property section defines any properties which may affect
       the operation of this class.  For example, class Drawable
       contains 3D visible objects and thus has the properties of
       color, reflectivity, etc.  But, class Number has no
       properties:  "5 + 4" is always 9.

       4.8.3  _D_a_t_a__S_e_c_t_i_o_n
       The Data section defines secret data objects.  These are
       unique to each instantiation of a class, and may only be
       manipulated within the class definition.

       4.8.4  _I_n_p_u_t__S_e_c_t_i_o_n
       Classes which contain Input sections are "aggregations" or
       collections of objects.  For example, a Point is 3 Numbers.
       The Input section is optional.  Classes without Input
       sections may redefine the behavior of a parent class, or
       create a new class with behaviors of several parent classes.
       Operations on the members of the Input section are inherited
       _i_n _t_o_t_o:  see the definition of addition and subtraction on
       Complex numbers below.

       4.8.5  _M_e_t_h_o_d__s_e_c_t_i_o_n_s
       The Method sections give the substition rules for a class.
       A "method" handles a given operation on an object.  For
       example, class Number has a method `+' which handles adding
       two or more numbers.  Tree templates are used to describe
       possible invocations of an operator in the context of this
       type.  A second tree of object operations is substituted for
       the matched tree.  This second tree is called the _r_e_w_r_i_t_e
       rule, because operator invocations are _r_e_w_r_i_t_t_e_n.

       The template facility is a powerful context-sensitive device
       for describing the use of an object.  It describes the
       replacement expression tree for each operation that can be
       performed on the object.  For example, the operation
       Vertex_Normal on a Point is substituted with the appropriate
       mathematics on the constituent Numbers.

       When an object instance is evaluated, one of the methods in
       the object's tuple list is evaluated and its outputs are the
       outputs of the instance.  Which method? _T_h_e _o_n_e _w_h_o_s_e











                                  - 16 -



       _t_e_m_p_l_a_t_e _m_a_t_c_h_e_s _t_h_e _s_h_a_p_e _o_f _t_h_e _t_r_e_e _s_u_r_r_o_u_n_d_i_n_g _t_h_e
       _e_v_a_l_u_a_t_i_o_n _o_f _t_h_e _i_n_s_t_a_n_c_e.  There may not be two templates
       which both match the same tree.  [I think it is possible to
       discover this with static analysis of the entire class
       definition lattice.]  [On second thought, this may be
       "halting problem" material, or at least NP-nasty.]

       4.8.6  _C_l_a_s_s__I_n_h_e_r_i_t_a_n_c_e
       Classes automatically inherit properties and methods from
       all superclasses.  Properties which have the same name are
       disambiguated by class name.  Operators with the same name
       must be redefined.  The parent operators may be invoked
       within the rewrite rule via the _s_u_p_e_r=ppppaaaarrrreeeennnntttt keyword.

       4.8.6.1  _C_l_a_s_s_:__C_o_m_p_l_e_x__N_u_m_b_e_r
       For example, an abridged object definition for complex
       numbers:

            ( class
                ID=Complex
                superclass=Number
                ( input
                    (type=Number ID=re)
                    (type=Number ID=im)
                )
                / create a Complex number from two Numbers
                ( op name=Complex type=Complex
                    ( template
                        (type=Number ID=input1)
                        (type=Number ID=input2)
                    )
                    ( rewrite
                        (set (output.re, input1))
                        (set (output.im, input2))
                    )
                )
                / decompose a Complex number into its constituent Numbers
                ( op name=Real type=Number
                    ( template
                        ID=output
                        (type=Complex ID=input)
                    )
                    ( rewrite
                        (set (output, input1.re))
                    )
                )