Hi all - <br><br>is it possible to create an complex object during syntax expansion but return it as the result of the expansion?&nbsp; It is possible to do so for basic types such as numbers.<br><br>(module add mzscheme <br>&nbsp; (define (add a b) (+ a b))
<br>&nbsp; (provide (all-defined)))<br>(require add)<br>(require-for-syntax add)<br>(define-syntax (macro-add stx)<br>&nbsp; (syntax-case stx () <br>&nbsp;&nbsp;&nbsp; ((_ a b)<br>&nbsp;&nbsp;&nbsp;&nbsp; (with-syntax ((val (datum-&gt;syntax-object <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; #&#39;_ 
<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; (add (syntax-object-&gt;datum #&#39;a)<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; (syntax-object-&gt;datum #&#39;b)))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&#39;val))))<br>(= (add 5 6) (macro-add 5 6)) ; =&gt; #t ; as both returns 11. 
<br><br>But this does not hold for complex object such as struct with the following code - is this something wrong with the code or is it something else? <br><br>(module foo mzscheme<br>&nbsp; (define-struct foo (vals))<br>&nbsp; (define (create-foo vals)
<br>&nbsp;&nbsp;&nbsp; (make-foo vals))<br>&nbsp; (provide (all-defined)))<br>(require foo)<br>(require-for-syntax foo)<br>(define-syntax (macro-foo stx)<br>&nbsp; (syntax-case stx () <br>&nbsp;&nbsp;&nbsp; ((_ val1 val2 ...)<br>&nbsp;&nbsp;&nbsp;&nbsp; (with-syntax ((foo (datum-&gt;syntax-object 
<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; #&#39;_ <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; (create-foo (syntax-&gt;list #&#39;(val1 val2 ...))))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&#39;foo))))<br>(define f1 (macro-foo 1 2 3))<br>f1 ; =&gt; shows #&lt;struct:foo&gt;<br>
(foo? f1) ; =&gt; #f <br>(foo-vals f1) ; =&gt; error: foo-vals: expects args of type &lt;struct:foo&gt;; given instance of a different &lt;struct:foo&gt;<br><br>Any insights are appreciated, thanks,<br>yc<br><br>