<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 13 Jul 2008, at 12:22, 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; ">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><font class="Apple-style-span" face="'Courier New'">(defstruct node</font></div><div><font class="Apple-style-span" face="'Courier New'">  content</font></div><div><font class="Apple-style-span" face="'Courier New'">  (left nil :type (or null arc))</font></div><div><font class="Apple-style-span" face="'Courier New'">  (right nil :type (or null arc)))</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">(defstruct arc</font></div><div><font class="Apple-style-span" face="'Courier New'">  (source nil :type (or null node))</font></div><div><font class="Apple-style-span" face="'Courier New'">  (sink nil :type (or null node)))</font></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><font class="Apple-style-span" face="'Courier New'">; (SUBFUNCTION MAKE-NODE (DEFSTRUCT NODE))</font></div><div><font class="Apple-style-span" face="'Courier New'">;;;*** Warning in (SUBFUNCTION MAKE-NODE (STRUCTURE NODE)): Ignoring type declaration with illegal type (OR NULL ARC)</font></div><div><font class="Apple-style-span" face="'Courier New'">;;;*** Warning in (SUBFUNCTION MAKE-NODE (STRUCTURE NODE)): Ignoring type declaration with illegal type (OR NULL ARC)</font></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><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><div>So, the questions I raise are two.</div><div>1 - which would be the best forum (<font class="Apple-style-span" face="'Courier New'">:if-exists :use-it :if-does-not-exist :do-not-use-c.l.l.-yet</font>) where to have this discussion?</div></div></div></div></blockquote><div><br></div><div>Maybe lisp forum: <a href="http://www.lispforum.com/">http://www.lispforum.com/</a> - but it's quite new, don't know yet how good it is.</div><div><br></div><div>Maybe #lisp.</div><div><br></div><div>At c.l.l, you would probably get responses telling that X solves this, where X is one or more of {Cells, OCaml, F#}, so that's probably not a good option.</div><div><br></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><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><br></div><div><br></div><div>Pascal</div></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>