Thanks Gustaf and Artur!<br><br>Not sure if this should be considered expected behaviour - but does the type have to be defined before declaration?<br>This simple script illustrates the issue - see the last couple of attempts.
<br><br>Class Base -slots { Attribute connects_to -multivalued true -type Base }<br>Class DerivedA -superclass Base -slots { Attribute connects_to -multivalued true -type DerivedB }<br>Class DerivedB -superclass Base -slots { Attribute connects_to -multivalued true -type DerivedA }
<br><br>Base b<br>DerivedA da<br>DerivedB db<br><br>b connects_to add da<br>b connects_to add db<br><br>db connects_to add b<br>&gt;&gt;&gt; can&#39;t set &quot;connects_to&quot;: b is not of type DerivedA&nbsp;&nbsp; &lt;&lt; This should be expected. all A-ok. 
<br><br>db connects_to add da<br>da connects_to add b<br>&gt;&gt;&gt; can&#39;t set &quot;connects_to&quot;: bad class &quot;DerivedB&quot;: must be alnum, alpha, ascii, control, boolean, digit, double, false, grap<br>h, integer, lower, print, punct, space, true, upper, wordchar, or xdigit
<br><br>da connects_to add db<br>&gt;&gt;&gt; can&#39;t set &quot;connects_to&quot;: bad class &quot;DerivedB&quot;: must be alnum, alpha, ascii, control, boolean, digit, double, false, grap<br>h, integer, lower, print, punct, space, true, upper, wordchar, or xdigit
<br><br><br><div class="gmail_quote">On Nov 7, 2007 12:06 AM, Gustaf Neumann &lt;<a href="mailto:neumann@wu-wien.ac.at">neumann@wu-wien.ac.at</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Shishir Ramam schrieb:<br><div class="Ih2E3d">&gt; Hi,<br>&gt; I have a need to represent a directed graph in XoTcl.<br></div>Here are two small examples for representing graphs<br><br>In version one, &nbsp;edges are lists of references to nodes stored
<br>as attributes of nodes. By specifying &quot;-multivalued true&quot;, it<br>is possible to &quot;add&quot; or &quot;delete&quot; elements from the list.<br>By using &quot;-type Node&quot; the code ensures, that only instances
<br>of Node may be added to the list, otherwise an error is thrown.<br><br> &nbsp; Class Node -slots {<br> &nbsp; &nbsp; Attribute connects_to -multivalued true &nbsp;-type Node<br> &nbsp; }<br><br> &nbsp;Node n1<br> &nbsp;Node n2<br> &nbsp;Node n3<br><br> &nbsp;n1 connects_to add n2
<br> &nbsp;n1 connects_to add n3<br><br> &nbsp;puts [n1 connects_to]<br><br>A &quot;destroy&quot; of a nodes automatically destroys the<br>edges as well, by refining the destroy method, one<br>could as well destroy the referenced edges (similar
<br>to aggregation (nesting objects), but one has to be<br>care about cyclical edges.<br><br>Another approach is to define Edges as objects<br>which makes it possible to provide methods for<br>Edges and to store attributes in it.
<br><br> &nbsp; Class Edge -slots {<br> &nbsp; &nbsp; Attribute from -type Node<br> &nbsp; &nbsp; Attribute to -type Node<br> &nbsp; }<br><br> &nbsp; Edge e1 -from n1 -to n2<br> &nbsp; Edge e2 -from n1 -to n3<br><br>Simarly as above, when a dynamic graph<br>is to be maintained, the destroy method of Node
<br>should care about deleting references in Edges<br>to ensure referencial integrity.<br>The easiest way is to check in the destroy method<br>of Node all Edges with [Edge info instances], if<br>their &quot;form&quot; or &quot;to&quot; attributes contain the node.
<br>One could as well build an index to make this<br>operation faster for large graph via a constructor<br>of Edge, which maintains e.g. a list of referenced<br>edges per node (e.g. via multivalued attribute<br>&quot;references&quot;, similar to approach 1)
<br><font color="#888888"><br><br>-gustaf neumann<br><br></font></blockquote></div><br><br clear="all"><br>-- <br>Don&#39;t worry about people stealing an idea. If it&#39;s original, you will have to ram it down their throats.
<br> &nbsp;- Howard Aiken