<html><body 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><br><div><div>On 13 Jul 2008, at 12:22, Marco Antoniotti wrote:</div><br><blockquote type="cite"><div>Hi<div><br></div><div>I am writing here because this may be the place closest to some of the issue I would like to raise (slowly!) with some of the typing issues in CL.</div><div><br></div><div>Consider the following (contrived) example</div><div><br></div><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><br></div><div>(defstruct arc</div><div>  (source nil :type (or null node))</div><div>  (sink nil :type (or null node)))</div><div><br></div><div>At least on LW, compiling the snippet the first time raises the following warning</div><div><div><br></div><div>; (SUBFUNCTION MAKE-NODE (DEFSTRUCT NODE))</div><div>;;;*** Warning in (SUBFUNCTION MAKE-NODE (STRUCTURE NODE)): Ignoring type declaration with illegal type (OR NULL ARC)</div><div>;;;*** Warning in (SUBFUNCTION MAKE-NODE (STRUCTURE NODE)): Ignoring type declaration with illegal type (OR NULL ARC)</div><div><br></div><div>There seem to be no way in CL to make a "forward" type declaration.  </div></div></div></div></blockquote><div><br></div><div>I see some possibilities for workarounds, all with different advantages and disadvantages:</div><div><br></div><div>1)</div><div><br></div><div>(defun %arcp (object)</div><div>  (typep object 'arc))</div><div><br></div><div>(deftype %arc ()</div><div>  '(satisfies %arcp))</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</div><div>  (source nil :type (or null node))</div><div>  (sink nil :type (or null node)))</div><div><br></div><div>2)</div><div><br></div><div>(defstruct root)</div><div><br></div><div>(defstruct (node (:include root))</div><div>  content</div><div>  (left nil :type (or null root))</div><div>  (right nil :type (or null root)))</div><div><br></div><div>(defstruct (arc (:include root))</div><div>  (source nil :type (or null root))</div><div>  (sink nil :type (or null root)))</div><div><br></div><div>3)</div><div><br></div><div>(defclass node ()</div><div>  (content left right))</div><div><br></div><div>(defclass arc ()</div><div>  ((source :initform nil :type (or null node))</div><div>   (sink :initform nil :type (or null node))))</div><div><br></div><div>(defclass node ()</div><div>  (content</div><div>   (left :initform nil :type (or null arc))</div><div>   (right :initform nil :type (or null arc))))</div></div></div></blockquote><div><br></div><div>(2) and (3) are better for different reasons.  In any case, the problem exhibits itself especially with DEFSTRUCTs.  E.g., (3) could look like</div><div><br></div><div>(defstruct node)</div><div><br></div><div>(defstruct arc (source nil :type (or null node) ...)</div><div>(defstruct node (left nil :type (or null arc))</div><div><br></div><div>but then you hit the "DEFSTRUCT cannot really be redefined" problem.</div><div><br></div><div><br></div><blockquote type="cite"><div><div><blockquote type="cite"><div><div><div><div>2 - where would you look in the ANSI spec for places where various clauses needs to be changed or removed to make recursive types "CDR-able"?</div></div></div></div></blockquote><div><br></div><div>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.</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><br></div><div>Also, note the following interesting behavior on LWM and ACL 8.1 (I have not tested other implementations).</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><br></div><div>Cheers</div></div><br><br><div> <div><div>--</div><div>Marco Antoniotti</div></div><br> </div><br></body></html>