Hi all - <br><br>I&#39;m hacking away on enabling custom struct via Swindle object system and run into a peculiar issue - if I make a custom struct with proc-spec turned on, instead of returning a struct, &quot;make&quot; returns an swindleobj.&nbsp; I suspect  this is due to some inheritance hierarchy precedence but can&#39;t figure out how to trace swindle&#39;s initialization process - any thoughts? 
<br><br>Below is the sample code that reproduces the issue - note I had to modify swindle/extra.ss and change <br><br>(define struct-type-&gt;class* ...) to <br>(define* struct-type-&gt;class* ...) to export the definition for the syntax to work.
<br><br>Any help is appreciated - thanks! <br><br>(require (lib &quot;swindle.ss&quot; &quot;swindle&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lib &quot;extra.ss&quot; &quot;swindle&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lib &quot;kw.ss&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (planet &quot;
struct.ss&quot; (&quot;ryanc&quot; &quot;macros.plt&quot; 1)))<br>(require-for-syntax (planet &quot;stx.ss&quot; (&quot;ryanc&quot; &quot;macros.plt&quot; 1)))<br><br>(defsyntax* (defstruct* stx) ; wraps around define-struct* and struct-type-&gt;class* for custom struct 
<br>&nbsp; (define &lt;&gt;-re #rx&quot;^&lt;(.*)&gt;$&quot;)<br>&nbsp; (define (&lt;&gt;-id? id)<br>&nbsp;&nbsp;&nbsp; (and (identifier? id)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (regexp-match? &lt;&gt;-re (symbol-&gt;string (syntax-e id)))))<br>&nbsp; (define (&lt;&gt;-id id)
<br>&nbsp;&nbsp;&nbsp; (datum-&gt;syntax-object <br>&nbsp;&nbsp;&nbsp;&nbsp; id <br>&nbsp;&nbsp;&nbsp;&nbsp; (string-&gt;symbol<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (regexp-replace &lt;&gt;-re (symbol-&gt;string (syntax-e id)) &quot;\\1&quot;))))<br>&nbsp; (syntax-case stx ()<br>&nbsp;&nbsp;&nbsp; ((_ (name super) (slot ... ) exp ...)
<br>&nbsp;&nbsp;&nbsp;&nbsp; (&lt;&gt;-id? #&#39;name)<br>&nbsp;&nbsp;&nbsp;&nbsp; (with-syntax* ((name-sans-&lt;&gt; (&lt;&gt;-id #&#39;name))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (struct:name (datum-&gt;syntax-object #&#39;stx (string-&gt;symbol (string-append &quot;struct:&quot; (symbol-&gt;string (syntax-e #&#39;name-sans-&lt;&gt;))))))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (make-struct (datum-&gt;syntax-object #&#39;stx (string-&gt;symbol (string-append &quot;make-&quot; (symbol-&gt;string (syntax-e #&#39;name-sans-&lt;&gt;))))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (super (if (syntax-e #&#39;super)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt;&gt;-id #&#39;super)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&#39;super)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (quasisyntax/loc stx <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define-struct* name-sans-&lt;&gt; (slot ...) 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #,@(if (syntax-e #&#39;super) #&#39;((#:super super)) #&#39;())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (#:inspector (make-inspector))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define name <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let () <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (struct-type-&gt;class* struct:name make-struct &#39;(slot ...))))))))
<br>&nbsp;&nbsp;&nbsp; ((_ name (slot ...) exp ...) <br>&nbsp;&nbsp;&nbsp;&nbsp; (&lt;&gt;-id? #&#39;name)<br>&nbsp;&nbsp;&nbsp;&nbsp; #&#39;(_ (name #f) (slot ...) exp ...))<br>&nbsp;&nbsp;&nbsp; ((_ name more ...) <br>&nbsp;&nbsp;&nbsp;&nbsp; (not (&lt;&gt;-id? #&#39;name))<br>&nbsp;&nbsp;&nbsp;&nbsp; (raise-syntax-error #f &quot;requires a name that looks like \&quot;&lt;...&gt;\&quot;&quot; stx #&#39;name))))
<br><br>(defstruct* &lt;foo1&gt; (value)<br>&nbsp; (#:guard (lambda (value struct)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (values value))))<br>(make &lt;foo1&gt; 1) ; returns a regular struct <br><br>(defstruct* &lt;foo2&gt; (value)<br>&nbsp; (#:guard (lambda (value struct) ; can the value be null?
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (values value)))<br>&nbsp; (#:procedure<br>&nbsp;&nbsp; (lambda/kw (object #:optional (value (void)))<br>&nbsp;&nbsp;&nbsp;&nbsp; object))<br>&nbsp; )<br>(make &lt;foo2&gt; 1) ; returns a swindle instance?? how? <br><br><br><br><br><br><br><br>
<div><span class="gmail_quote">On 9/6/07, <b class="gmail_sendername">YC</b> &lt;<a href="mailto:yinso.chen@gmail.com">yinso.chen@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thanks Will!&nbsp; I tried it and it works ;) except the generic make method - i.e. can&#39;t do (make &lt;my-struct&gt; ...). <br><br>After looking at the defstruct code - it appears that it calls a private function called struct-type-&gt;class* and this function builds on top of struct-type-&gt;class and use it to track the slots for all the types created via defstruct and thus allow the structs to be created via made.&nbsp; 
<br><br>I guess to fully integrate with the make method the function struct-type-&gt;class* should be exported...?<br><br>Thanks!<br><span class="sg">yc</span><div><span class="e" id="q_114dc56c1b3b9f86_2"><br><br><div><span class="gmail_quote">
On 9/6/07, <b class="gmail_sendername">Will M Farr
</b> &lt;<a href="mailto:farr@mit.edu" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">farr@mit.edu</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Sep 6, 2007, at 2:43 PM, YC wrote:
<br><br>&gt; Hi all -<br>&gt;<br>&gt; how can one create a custom struct (i.e. make-struct-type or define-<br>&gt; struct* from ryanc) but make it work with swindle&#39;s object system?<br><br>Keep the structure type descriptor (the first value which make-struct-
<br>type returns), and use swindle&#39;s struct-type-&gt;class on that<br>descriptor to obtain a class object which describes structs of that<br>type.&nbsp;&nbsp;For example:<br><br>(define-values (struct:my-struct make-my-struct my-struct? my-struct-
<br>get my-struct-set!)<br>&nbsp;&nbsp; (make-struct-type &#39;my-struct #f 1 0))<br><br>(define &lt;my-struct&gt; (struct-type-&gt;class struct:my-struct))<br><br>Now you can use &lt;my-struct&gt; anywhere a class object could be used in
<br>Swindle.<br><br>Good luck!<br><br>Will<br><br></blockquote></div><br>
</span></div></blockquote></div><br>