<div dir="ltr"><br><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Wed, Jul 10, 2013 at 11:28 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">At Wed, 10 Jul 2013 23:15:46 -0400, Ryan Culpepper wrote:<br>
&gt; On 07/10/2013 09:04 PM, Asumu Takikawa wrote:<br>
&gt; &gt; Hi all,<br>
&gt; &gt;<br>
&gt; &gt; I&#39;m currently trying to fix the Typed Racket unit tests. I think I&#39;ve<br>
&gt; &gt; narrowed down the issue to a certain syntax property for keyword<br>
&gt; &gt; functions.<br>
&gt; &gt;<br>
&gt; &gt; The issue is illustrated by the following example:<br>
&gt; &gt;<br>
&gt; &gt;    #lang racket<br>
&gt; &gt;<br>
&gt; &gt;    (require racket/file<br>
&gt; &gt;             (for-syntax racket/file<br>
&gt; &gt;                         racket/keyword-transform))<br>
&gt; &gt;<br>
&gt; &gt;    ;; the property is #f<br>
&gt; &gt;    (begin-for-syntax<br>
&gt; &gt;     (displayln<br>
&gt; &gt;       (syntax-case (expand-syntax #&#39;(copy-directory/files 1 2)) ()<br>
&gt; &gt;         [(let-values (((temp1) _)<br>
&gt; &gt;                       ((temp2) _))<br>
&gt; &gt;            (if _<br>
&gt; &gt;                (#%plain-app1 copy-directory/files15 e1 ...)<br>
&gt; &gt;                (#%plain-app2 copy-directory/files17 e2 ...)))<br>
&gt; &gt;          (syntax-procedure-converted-arguments-property<br>
&gt; #&#39;copy-directory/files15)])))<br>
&gt; &gt;<br>
&gt; &gt;    ;; property is syntax<br>
&gt; &gt;    (begin-for-syntax<br>
&gt; &gt;     (displayln<br>
&gt; &gt;       (syntax-case (local-expand #&#39;(copy-directory/files 1 2) &#39;expression<br>
&gt; null) ()<br>
&gt; &gt;         [(let-values (((temp1) _)<br>
&gt; &gt;                       ((temp2) _))<br>
&gt; &gt;            (if _<br>
&gt; &gt;                (#%plain-app1 copy-directory/files15 e1 ...)<br>
&gt; &gt;                (#%plain-app2 copy-directory/files17 e2 ...)))<br>
&gt; &gt;          (syntax-procedure-converted-arguments-property<br>
&gt; #&#39;copy-directory/files15)])))<br>
&gt; &gt;<br>
&gt; &gt; There are two syntax-time computations here. Both are expanding an<br>
&gt; &gt; application of a keyword function (one with local-expand, one with<br>
&gt; &gt; expand) and looking at the resulting syntax.<br>
&gt; &gt;<br>
&gt; &gt; The key point here is that I want to find the property looked up by<br>
&gt; &gt; `syntax-procedure-converted-arguments-property` on an output identifier<br>
&gt; &gt; because Typed Racket needs it to type-check the expansion.<br>
&gt; &gt;<br>
&gt; &gt; Unfortunately, as the comments indicate, only the second piece of code<br>
&gt; &gt; can find the property. The reason appears to be that the property key is<br>
&gt; &gt; actually a private `gensym`ed symbol and the two pieces of code appear<br>
&gt; &gt; to get separate instantiations of the kw.rkt module (perhaps at different<br>
&gt; &gt; phases).<br>
&gt; &gt;<br>
&gt; &gt; To check that, if I modify kw.rkt to use a plain symbol, both of the<br>
&gt; &gt; snippets above return the same property value.<br>
&gt; &gt;<br>
&gt; &gt; Anyone have any idea how I can keep using `expand` but still be able to<br>
&gt; &gt; look up the property?<br>
&gt;<br>
&gt; To get information about a phase-0 &#39;#%app&#39; expansion, you need to call<br>
&gt; the phase-1 version of &#39;syntax-procedure-converted-arguments-property&#39;.<br>
&gt; That&#39;s going to require a bit of phase-crossing trickery, because the<br>
&gt; identifier you want to query is a phase-0 (dynamic) value, and you want<br>
&gt; the result as a phase-0 value, but the phase-1 function naturally<br>
&gt; consumes and produces phase-1 values.<br>
&gt;<br>
&gt; One solution is to use &#39;quote-syntax&#39;, &#39;eval&#39;, and &#39;phase1-eval&#39; all<br>
&gt; together. Use &#39;eval&#39; with &#39;quote-syntax&#39; to convert the phase-0<br>
&gt; identifier to a phase-1 identifier. Use &#39;phase1-eval&#39; to run the<br>
&gt; computation at phase 1 and capture the phase-1 result as a phase-0 value<br>
&gt; (also using &#39;quote-syntax&#39;).<br>
<br>
</div></div>I haven&#39;t thought about this much, but would it make more sense to move<br>
the property key to a cross-phase persistent module (with a `protected&#39;<br>
provide) in this case?<br></blockquote><div><br></div><div>That came up on IRC.  I believe Asumu said the key is an uninterned identifier, meaning it&#39;s a stateful value.  Right now, cross-phase persistent modules can&#39;t store anything stateful other than generative struct types.<br>

<br></div><div>--Carl<br></div></div></div></div>