<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-family:arial,sans-serif;font-size:13px">The syntax of `enter!&#39; is supposed to be like `require&#39;, where the<br>
</span><span style="font-family:arial,sans-serif;font-size:13px">module name is not quoted</span></blockquote><div><br></div><div style>OK, I see what you&#39;re saying. And yes, the enter! / require connection is noted in the docs. </div>
<div style><br></div><div style>As a reader of docs, what trips me up here is that the docs for enter! and require both refer to a module-path, but they will not necessarily take as input something that returns #t for module-path?, for instance:</div>
<div style><br></div><div style><div><div>(require &quot;filename.rkt&quot;) ; works</div></div><div><br></div><div>(define name &quot;filename.rkt&quot;)</div><div>(module-path? name) ; returns #t</div><div>(require name) ; doesn&#39;t work</div>
<div><br></div><div style>However, dynamic-require works differently:</div><div style><br></div><div style><div>(define name &quot;filename.rkt&quot;)</div><div>(module-path? name) ; returns #t</div><div>(dynamic-require name &#39;foo) ;works</div>
</div><div style><br></div><div style>I notice that dynamic-require uses the module-path? contract, and enter! and require apparently do not. So OK, I guess that&#39;s why they can be more restrictive. But then when I look up the meaning of module-path?, it says:</div>
<div style><br></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style><div style><div style>Returns #t if v corresponds to a datum that <b>matches the grammar for module-path for require</b>, #f otherwise.</div>
</div></div></blockquote><div style><div style><div><br></div><div style>That is, module-path? seems to be defined in terms of what require will accept, but in practice module-path? accepts more than require will. Which, if true, is strange.</div>
<div style><br></div></div></div><div style><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Apr 28, 2013 at 6:11 AM, 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">The syntax of `enter!&#39; is supposed to be like `require&#39;, where the<br>

module name is not quoted. If you remove the quote, then something like<br>
<br>
 (enter! file/gif)<br>
<br>
doesn&#39;t work.<br>
<br>
<br>
It would make sense to move the transitive module-reloading part of<br>
`enter!&#39; to a a new module and provide a `dynamic-re-require&#39; function<br>
that&#39;s similar to `do-enter!&#39; --- and that would more directly be what<br>
you want, I think. I&#39;ll look into that.<br>
<div class=""><div class="h5"><br>
<br>
At Sun, 28 Apr 2013 00:09:13 -0700, Matthew Butterick wrote:<br>
&gt; Thanks, I&#39;ll try that. However, I still think there might be a bug in<br>
&gt; racket/enter.rkt. Currently lines 10-11 look like this:<br>
&gt;<br>
&gt;      [(enter! mod flag ...) (andmap keyword? (syntax-&gt;datum #&#39;(flag ...)))<br>
&gt;       #&#39;(do-enter! &#39;mod &#39;(flag ...))]<br>
&gt;<br>
&gt; But when I remove the quoting from mod in line 11, like so …<br>
&gt;<br>
&gt;      [(enter! mod flag ...) (andmap keyword? (syntax-&gt;datum #&#39;(flag ...)))<br>
&gt;       #&#39;(do-enter! mod &#39;(flag ...))]<br>
&gt;<br>
&gt; Then (enter! module-name-variable) works as hoped, and (enter!<br>
&gt; &quot;module-name-string.rkt&quot;) still works too.<br>
&gt;<br>
&gt; Making it work proves nothing ;) I will file a bug report.<br>
&gt;<br>
&gt; Matthew Butterick<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Sat, Apr 27, 2013 at 7:17 PM, Matthew Flatt &lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; I think you probably want to create a new namespace for each<br>
&gt; &gt; instantiation of the Scribble module, and attach Scribble (or whatever<br>
&gt; &gt; modules you want to stay the same across runs) to the namespace before<br>
&gt; &gt; `dynamic-require&#39;ing the module in the new namespace:<br>
&gt; &gt;<br>
&gt; &gt;  #lang racket/base<br>
&gt; &gt;  (require scribble/base)<br>
&gt; &gt;<br>
&gt; &gt;  (define (re-run module-path)<br>
&gt; &gt;    (define ns (make-base-namespace))<br>
&gt; &gt;    (namespace-attach-module (current-namespace) &#39;scribble/base)<br>
&gt; &gt;    (parameterize ([current-namespace ns])<br>
&gt; &gt;      (dynamic-require module-path #f)))<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; At Sat, 27 Apr 2013 19:08:53 -0700, Matthew Butterick wrote:<br>
&gt; &gt; &gt; OK, so the proposed solution failed once I tried to pass in the module<br>
&gt; &gt; name<br>
&gt; &gt; &gt; as a variable. Even though enter! claims to take a module-path as an<br>
&gt; &gt; &gt; argument, this will not work:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; (define name &quot;module.rkt&quot;)<br>
&gt; &gt; &gt; (module-path? name) ; reports #t<br>
&gt; &gt; &gt; (enter! name) ;  error: collection &quot;name&quot; not found<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; enter! is treating &quot;name&quot; as a module path instead of resolving it as a<br>
&gt; &gt; &gt; defined term. What I can&#39;t tell is whether this is mandatory behavior for<br>
&gt; &gt; &gt; enter!, or if it&#39;s a bug in the enter! macro. (I did look at enter.rkt,<br>
&gt; &gt; but<br>
&gt; &gt; &gt; this week, it&#39;s over my head.)<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Matthew Butterick<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; On Sat, Apr 27, 2013 at 6:16 PM, Matthew Butterick<br>
&gt; &gt; &gt; &lt;<a href="mailto:mb.list.acct@gmail.com">mb.list.acct@gmail.com</a>&gt;wrote:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Aha, combining enter! with dynamic-require seems to do the trick:<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; (define (route req)<br>
&gt; &gt; &gt; &gt;     (enter! &quot;module.rkt&quot;)<br>
&gt; &gt; &gt; &gt;     (define foo (dynamic-require &quot;module.rkt&quot; &#39;foo))<br>
&gt; &gt; &gt; &gt;     (response/xexpr `(p ,(format &quot;~a&quot; foo))))<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Once this route is running in the web server, I can make changes to<br>
&gt; &gt; &gt; &gt; module.rkt, then click reload in the browser, and the changes will<br>
&gt; &gt; appear<br>
&gt; &gt; &gt; &gt; in the browser.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; If this is a terrible idea let me know, otherwise I&#39;ll consider this<br>
&gt; &gt; &gt; &gt; solved.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; On Sat, Apr 27, 2013 at 9:56 AM, Matthew Butterick &lt;<br>
&gt; &gt; <a href="mailto:mb.list.acct@gmail.com">mb.list.acct@gmail.com</a><br>
&gt; &gt; &gt; &gt; &gt; wrote:<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;&gt; I&#39;m building a website using Scribble as the source format. As a<br>
&gt; &gt; &gt; &gt;&gt; development tool, I&#39;ve built a web server in Python that lets me view<br>
&gt; &gt; all<br>
&gt; &gt; &gt; &gt;&gt; my Scribble source files and look at them in different states of<br>
&gt; &gt; &gt; &gt;&gt; processing. To view the results of the Scribble files, the Python<br>
&gt; &gt; server<br>
&gt; &gt; &gt; &gt;&gt; just sends the files to Racket via a system command (os.Popen) and<br>
&gt; &gt; reads<br>
&gt; &gt; &gt; &gt;&gt; the result. This works but it&#39;s slow, because it  has to launch a new<br>
&gt; &gt; &gt; &gt;&gt; Racket thread for every request.<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; I thought I could speed things up by rewriting the development web<br>
&gt; &gt; server<br>
&gt; &gt; &gt; &gt;&gt; in Racket. But having tried a few approaches, I&#39;m not sure how to<br>
&gt; &gt; duplicate<br>
&gt; &gt; &gt; &gt;&gt; this functionality within a Racket web servlet:<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; *(require &lt;modulename&gt;) *<br>
&gt; &gt; &gt; &gt;&gt; This only gets evaluated once, when the server is started. That<br>
&gt; &gt; doesn&#39;t<br>
&gt; &gt; &gt; &gt;&gt; help, since the &lt;filename&gt; is going to be passed in as a parameter<br>
&gt; &gt; while<br>
&gt; &gt; &gt; &gt;&gt; the server is running.<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; *(dynamic-require &lt;** modulename **&gt;) *<br>
&gt; &gt; &gt; &gt;&gt; This gets evaluated only when invoked, and thus can take &lt;modulename&gt;<br>
&gt; &gt; as<br>
&gt; &gt; &gt; &gt;&gt; a parameter, but then &lt;filename&gt; can&#39;t be reloaded (this is<br>
&gt; &gt; essential, as<br>
&gt; &gt; &gt; &gt;&gt; the point of the system is to be able to edit the files and see the<br>
&gt; &gt; changes<br>
&gt; &gt; &gt; &gt;&gt; in the web browser immediately)<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; *(enter! &lt;modulename&gt;)*<br>
&gt; &gt; &gt; &gt;&gt; This reloads the file, but it&#39;s not clear how to get access to names<br>
&gt; &gt; &gt; &gt;&gt; provided by &lt;modulename&gt;. (The documentation for enter! suggests that<br>
&gt; &gt; this<br>
&gt; &gt; &gt; &gt;&gt; is not how it&#39;s meant to be used anyhow.)<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; Obviously, I could call a new instance of Racket as a system command,<br>
&gt; &gt; but<br>
&gt; &gt; &gt; &gt;&gt; that wouldn&#39;t offer any advantage over the current approach.<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; I suppose what I&#39;m looking for is an equivalent of the Python<br>
&gt; &gt; &gt; &gt;&gt; reload(&lt;modulename&gt;) command.<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;&gt; Matthew Butterick<br>
&gt; &gt; &gt; &gt;&gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; ____________________<br>
&gt; &gt; &gt;   Racket Users list:<br>
&gt; &gt; &gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt; &gt;<br>
</div></div></blockquote></div><br></div></div>