to ! :object :&p [:&v gproph :object ifelse listp :&p [first :&p][:&p]] if emptyp :&v [op []] if wordp :&v[op :&v] if "# = first :&v [ ifelse listp :&p ~ [.maybeoutput run fput char 40 fput last :&v lput char 41 bf :&p ]~ [.maybeoutput run bf :&v]] op :&v end to !o :& .maybeoutput ! :object :& end to !s :& :&p [:&s gprop :& "parent] if emptyp :&s[( pr :& [has no parent])stop] .maybeoutput (! :&s :&p) end TO addpropl :&o :&p :&v[:&prop gproph :&o :&p] if emptyp :&v [stop] if listp :&v [addpropl :&o :&p first :&v addpropl :&o :&p bf :&v stop] if wordp :&prop[make "&prop (list :&prop)] if memberp :&v :&prop [stop] pprop :&o :&p lput :&v :&prop END to ancestors :n [:parent gprop :n "parent] if "object = :parent [op [object]] if emptyp :parent [op []] op fput :parent ancestors :parent end to buryall bury contents end to combine :this :those if wordp :those [output word :this :those] output fput :this :those end to descendants :& op filter [memberp :& ancestors ?] last contents end to gproph :&o :&p [:&v gprop :&o :&p] if not emptyp :&v [op :&v] make "&o gprop :&o "parent if emptyp :&o [op []] op gproph :&o :&p end to object.add :&n :&val addpropl :object :&n :&val end to object.ancestors op ancestors :object end TO object.create :&obj pprop :&obj "parent :object localmake "&pl gprop :object "children if memberp :&obj :&pl [stop] pprop :object "children lput :&obj :&pl end to object.descendants [:children gprop :object "children] if emptyp :children [op []] op map [ localmake "object ? fput ? object.descendants ] :children end to object.destroy foreach gprop :object "children [! ? "destroy] localmake "parent gprop :object "parent pprop :parent "children remove :object gprop :parent "children er (list [][] (list :object)) end to object.er :&name remprop :object :&name end TO object.make :&rubr :&v pprop :object :&rubr :&v END TO object.method :&n [:&nom word :object word ". :&n] pprop :object :&n list "# :&nom ed :&nom END to object.remove :&n :&val rempropl :object :&n :&val end to rempropl :&o :&p :&v[:&prop gproph :&o :&p] if emptyp :&v [stop] if listp :&v [rempropl :&o :&p first :&v rempropl :&o :&p bf :&v stop] if wordp :&prop [make "&prop (list :&prop)] make "&prop remove :&v :&prop ifelse emptyp :&prop [remprop :&o :&p][pprop :&o :&p :&prop] end to unburyall unbury buried end Pprop "object "children [] Pprop "object "initialcontents [[! !o !s addpropl ancestors buryall descendants edall gproph object.add object.ancestors object.create object.descendants object.destroy object.er object.make object.method object.remove rempropl savel unburyall] [&p &v object] [object]] Pprop "object "create [# object.create] Pprop "object "add [# object.add] Pprop "object "method [# object.method] Pprop "object "make [# object.make] Pprop "object "remove [# object.remove] Pprop "object "display [# object.display] Pprop "object "er [# object.er] Pprop "object "position [0 0] Pprop "object "ancestors [# object.ancestors] Pprop "object "descendants [# object.descendants] Pprop "object "destroy [# object.destroy] bury ! "object "initialcontents