<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 21 Jul 2008, at 17:04, Marco Antoniotti wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jul 13, 2008, at 17:54 , Pascal Costanza wrote:</div><br><blockquote type="cite"><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">As far as I can tell, a modification of deftype should be sufficient, such that (deftype name) "announces" a type without saying yet what it will be.</span></div></blockquote><blockquote type="cite"><div><div><div><br></div><div>Maybe write a first draft of such a CDR, and then ask the vendors what they think, they should know best whether and where this hurts...</div></div></div></blockquote><div><br></div><div>That is my intention.  However, just modifying DEFTYPE already raises issues.  See the following...</div><div><br></div><div><font class="Apple-style-span" face="'Courier New'">(deftype foo)</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">(deftype bar)</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">(deftype foo-or-bar () '(or foo bar))</font></div><div><br></div><div><br></div><div>Now, all these types are actually "empty" from a set-theoretic point of view.</div></div></div></blockquote><div><br></div><div>Hm, well, my idea was that (deftype foo) only "announces" the type foo but doesn't define it yet, so that you can do things like this:</div><div><br></div><div>(deftype arc) ;; not yet defined, but tells the compiler that it will be defined later</div><div><br></div><div>(defstruct node</div><div>  content</div><div>  (left nil :type (or null arc))</div><div>  (right nil :type (or null arc))</div><div><br></div><div>(defstruct arc ;; now it is defined as a struct</div><div>  (source nil :type (or null node))</div><div>  (sink nil :type (or null node)))</div><div><br></div><div>The tricky part is in (a) specifying where an announced but not yet defined type is allowed to be used and (b) specifying what is the latest point in time when an announced type must effectively be defined (like, for example, performing the first type test with the given type - it's unclear to me what the most adequate criterion should be here).</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">Also, note the following interesting behavior on LWM and ACL 8.1 (I have not tested other implementations).</span></div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 13 > (deftype gnao ())</font></div><div><font class="Apple-style-span" face="'Courier New'">GNAO</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 14 > (typep nil 'gnao)</font></div><div><font class="Apple-style-span" face="'Courier New'">NIL</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 15 > (defstruct gnao a s d)</font></div><div><font class="Apple-style-span" face="'Courier New'">GNAO</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 16 > (make-gnao)</font></div><div><font class="Apple-style-span" face="'Courier New'">#S(GNAO :A NIL :S NIL :D NIL)</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 17 > (typep (make-gnao) 'gnao)</font></div><div><font class="Apple-style-span" face="'Courier New'">NIL</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">CL-USER 18 > (type-of (make-gnao))</font></div><div><font class="Apple-style-span" face="'Courier New'">GNAO</font></div><br></div><div>AFAIAC this is not good.   And the culprit is the DEFTYPE that does introduce an extra namespace in CL without really defining what is in there and how I can manipulate it.</div></div></div></blockquote><div><br></div><div>Why? You got what you asked for. (deftype gnoa ()) has an empty body, so by default it returns nil, which happens to be the type that doesn't have any instances.</div><div><br></div><div>Furthermore, ANSI CL doesn't say anything about type redefinition, so we are in unspecified realm here. ANSI CL only says something about class redefinition, but that doesn't change the corresponding types. The CLOS MOP says that changing the metaclass of a class is forbidden, so you can't change (the kind of) types using the CLOS MOP either.</div></div><div><br></div><div><br></div><div>Pascal</div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>-- </div><div>Pascal Costanza, mailto:pc@p-cos.net, <a href="http://p-cos.net">http://p-cos.net</a></div><div>Vrije Universiteit Brussel, Programming Technology Lab</div><div>Pleinlaan 2, B-1050 Brussel, Belgium</div><div><br class="khtml-block-placeholder"></div><div><br class="khtml-block-placeholder"></div><br class="Apple-interchange-newline"></div></span></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"> </div><br></body></html>