<br><br><div class="gmail_quote">2011/7/29 Carl Eastlund <span dir="ltr">&lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On Fri, Jul 29, 2011 at 12:44 PM, Maurizio Giordano<br>
<div class="im">&lt;<a href="mailto:maurizio.giorda@gmail.com">maurizio.giorda@gmail.com</a>&gt; wrote:<br>
</div><div class="im">&gt; On Fri, 2011-07-29 at 12:20 -0400, Carl Eastlund wrote:<br>
&gt;&gt;<br>
</div><div class="im">&gt;&gt; There is one module called &quot;multiset&quot;, but all of its definitions are<br>
&gt;&gt; executed twice because your program uses them in two different phases:<br>
&gt;&gt; once at run-time and once at compile-time.  That means<br>
&gt;&gt; there are two different mset types with two different constructors and<br>
&gt;&gt; two different mset? predicates.  Call the run-time versions mset.1 and<br>
&gt;&gt; mset?.1, and the compile-time versions mset.2 and mset?.2.  Similarly,<br>
&gt;&gt; you have print-type.1 and print-type.2 at run-time and compile-time.<br>
&gt;&gt;<br>
&gt;&gt; Your custom reader produces an mset.1 value.  Your macro calls<br>
&gt;&gt; print-type.2 which checks mset?.2, and mset?.2 produces #false when<br>
&gt;&gt; given an mset.1 value.  The code your macro produces, however, calls<br>
&gt;&gt; print-type.1, which checks mset?.1, and that produces #true (I&#39;m using<br>
&gt;&gt; the new long-form names of #f and #t for readability).  So no<br>
&gt;&gt; information is being lost -- it&#39;s just that there are two versions of<br>
&gt;&gt; everything running around, and they cannot be mixed and matched.<br>
&gt; Now it is perfectly clear to me.<br>
&gt; thanks a lot.<br>
&gt;&gt;<br>
&gt;&gt;<br>
</div><div><div></div><div class="h5">&gt;&gt; Are you sure you want to put mset values in as literal syntax?  That<br>
&gt;&gt; leads to all sorts of odd behavior -- for instance, the contents of<br>
&gt;&gt; those msets will need to be syntax at compile-time if they are to<br>
&gt;&gt; contain expressions, but non-syntax at run-time if they are to contain<br>
&gt;&gt; useful values.  The expansion system will not do this plumbing for<br>
&gt;&gt; you.  You&#39;ll get a lot more &quot;bang for your buck&quot; if you instead just<br>
&gt;&gt; use a match expander as both a pattern to recognize msets and a<br>
&gt;&gt; constructor to build them.  This avoids all issues of crossing phase<br>
&gt;&gt; boundaries, because the compile-time code acts entirely by recognizing<br>
&gt;&gt; identifier bindings, and does not have to know about the<br>
&gt;&gt; representation of msets at all.<br>
&gt; The &quot;templates&quot; I generate at compile-time in the macro are some sort of<br>
&gt; a syntax tree:<br>
&gt;<br>
&gt; An example:<br>
&gt; the macro (three) inputs: &lt; (1 x), 2 &gt; x 3<br>
&gt; will generate an hash like this:<br>
&gt;<br>
&gt; #hash ((mset . #hash((list . #hash((integer . 1)<br>
&gt;                                   (symbol . x)))<br>
&gt;                     (symbol . x)))<br>
&gt;       (symbol . x)<br>
&gt;       (integer . 3))<br>
&gt;<br>
&gt; By using this nested hashtable, the &quot;inject-code&quot; function will<br>
&gt; produce a (recursive) pattern matchers code to be included in the lambda<br>
&gt; code generated by the macro. Symbols in the input are not evaluated,<br>
&gt; they will are considered identifiers to be bound (and unified)<br>
&gt; during the pattern matching.<br>
&gt;<br>
&gt; Therefore, I think I am not using the mset values at compile-time.<br>
&gt; I simply parse the macro inputs to generate a sort of syntax tree<br>
&gt; (i.e. the hashtable).<br>
<br>
</div></div>You are not using them as outputs, but you are using them as inputs.<br>
Even that is problematic, exactly as you have seen.  I suggest writing<br>
a macro using only standard syntax objects containing lists, strings,<br>
symbols, and numbers for both input and output if at all possible.<br></blockquote><div> </div><div>... unfortunately i need the macro to accept as input a &quot;mset&quot;, ricognize it, and parse recursively the inner mset elements (that can be list, numbers, or </div>
<div>even other msets).</div><div>The hashtable the macro produces at compile time is like </div><div>an Abstract Syntax Tree of the macro inputs. </div><div>In my new language implementation the mset</div><div>is a fundamental data structure, I cannot rely only on standard</div>
<div>syntax objects like lists, strings, etc.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
This will save a lot of trouble.  Using hash tables in syntax objects<br>
can work, but even that brings up some tricky issues.  I find it is<br>
almost always better to consume and produce code that refers to or<br>
produces complex data types, rather than code actually represented as<br>
complex data types.<br></blockquote><div>Maybe a way could be to generate the hash by making the macro parsing/processing the list of input syntaxes, rathen than the</div><div>inputs themselves. I mean, I can traverse the &quot;syntax&quot; representation</div>
<div>of each input and get the information I need. Maybe it will be more complex,</div><div>but it could work.... I don&#39;t know.</div><div><br></div><div>Another way could be to define a new &quot;match&quot; form, starting from</div>
<div>the one provided by racket. The new &quot;match&quot; should apply also to msets</div><div>and ... have other peculiar behaviours (???). Also this way is long.</div><div>I will decide which solution to follow.</div><div>
Thank you, Carl.</div><div>If you have any idea, it is welcome.</div><div><br></div><div>Cheers,</div><div>Maurizio.</div><div><br></div><div><br></div><div>PS. Sorry if I was not able to give more details... my implementation is composed of large-code modules... I am available to send the complete </div>
<div>code to everyone who is interested in collaborating to the project.</div><div>long and  </div><div>  </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
--Carl<br>
</font></blockquote></div><br>