Thanks Matthew for all your help, it would have been tough figuring this out on my own.<br><br>you said:<br>&gt;I think you should imagine that a program is read and compiled on a<br>
&gt;different machine where it is run, and so you can&#39;t directly share<br>
&gt;state between the reader and run-time code.<br><br>Ok, I&#39;m starting to get the feeling that I shouldn&#39;t be doing what I&#39;m trying to do, especially if I would like to keep updating meta-count at runtime.<br>
<br>meta-count was just an example and doesn&#39;t actually reflect what I am trying to do.<br><br>My new approach is instead of discarding the metadata, I create a syntax object for it and discard it at expansion time or compile time. I plan to keep a copy of the syntax tree with the metadata inside for later use. I&#39;m not seeing any documentation on how to get involved in the expansion or compilation stages, removing the metadata is not as easy as creating a macro as the metadata can be embedded anywhere. What I&#39;d like to know is where is read-syntax being called from so that I can step in and filter out the metadata before expansion begins. Is there a way to do this without modifying any racket code?<br>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Dec 16, 2012 at 9:08 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">At Sat, 15 Dec 2012 13:12:50 -0800, Rajah Mahsohn Omega wrote:<br>
&gt; So from what I&#39;m gathering the only way to share data with the reader and<br>
&gt; expander layer is to add the reader as a submodue in the main.rkt file.<br>
<br>
</div>No, I don&#39;t think that works. It might work under some circumstances,<br>
but I think you should imagine that a program is read and compiled on a<br>
different machine where it is run, and so you can&#39;t directly share<br>
state between the reader and run-time code. (Ideally, Racket would<br>
enforce that separation, but it currently doesn&#39;t.)<br>
<br>
Instead, I meant instead that the reader needs to produce module that<br>
has a submodule.<br>
<div class="im"><br>
&gt; So<br>
&gt; I&#39;ve done that and it works but now I have a new problem, provide doesn&#39;t<br>
&gt; seem to be providing anything. Here is an example main.rkt file that<br>
&gt; provides meta-count.<br>
<br>
</div>The module that your reader produces uses the language `racket&#39; (as<br>
specified after the `syntax/module-reader&#39; language), which doesn&#39;t<br>
export `meta-count&#39;.<br>
<br>
More generally, I think you will need to use `#:wrapper2&#39; so that you<br>
get control over the whole `module&#39; form to add a nested `module&#39; form<br>
to hold metadata. Here&#39;s an example, based on your code.<br>
<br>
------------------------------------------------------------<br>
&quot;meta-count.rkt&quot;<br>
------------------------------------------------------------<br>
#lang racket<br>
<br>
(module* reader syntax/module-reader<br>
  racket<br>
  #:wrapper2 wrapper2<br>
  (require syntax/readerr)<br>
<br>
  (define meta-count 0)<br>
<br>
  (define (wrapper2 in f)<br>
    (define mod<br>
<div class="im">      (parameterize ([current-readtable (make-meta-readtable)])<br>
</div>        (f in)))<br>
    (define new-mod<br>
      (syntax-case mod ()<br>
        [(_mod _name _lang (_mb body ...))<br>
         (quasisyntax/loc (if (syntax? mod) mod #&#39;here)<br>
           (_mod _name _lang<br>
                 (_mb (module meta-count racket/base #,meta-count)<br>
                      body ...)))]))<br>
    (if (syntax? mod)<br>
        new-mod<br>
        (syntax-&gt;datum new-mod)))<br>
<div class="im"><br>
  (define (make-meta-readtable)<br>
    (make-readtable (current-readtable)<br>
                    #\^ &#39;terminating-macro read-meta))<br>
  (define read-meta<br>
    (case-lambda<br>
     [(ch in)<br>
      (rread (object-name in) in)]<br>
     [(ch in src line col pos)<br>
      (rread src in)]))<br>
<br>
  (define (rread src in)<br>
    (define-values (line col pos) (port-next-location in))<br>
    (let ([meta (regexp-match #rx&quot;[^ ([&#39;`#]+&quot; in)])<br>
      (if meta<br>
          (begin<br>
            (set! meta-count (add1 meta-count))<br>
            (make-special-comment meta))<br>
          (raise-read-error &quot;expected a metadata name&quot; src line col pos 1)))))<br>
<br>
</div>------------------------------------------------------------<br>
&quot;m.rkt&quot;:<br>
------------------------------------------------------------<br>
#lang reader (submod &quot;meta-count.rkt&quot; reader)<br>
<div class="im">^meta (+ ^meta1 1 2)<br>
<br>
</div>------------------------------------------------------------<br>
Comamnd line, looking at the expanded form of &quot;m.rkt&quot;:<br>
------------------------------------------------------------<br>
% raco expand m.rkt<br>
(module m racket<br>
  (#%module-begin<br>
   (module meta-count racket/base<br>
     (#%module-begin (#%app call-with-values (lambda () &#39;2) print-values)))<br>
   (#%app call-with-values (lambda () (#%app + &#39;1 &#39;2)) print-values)))<br>
<br>
------------------------------------------------------------<br>
REPL:<br>
------------------------------------------------------------<br>
&gt; (require &quot;m.rkt&quot;)<br>
3<br>
&gt; (require (submod &quot;m.rkt&quot; meta-count))<br>
2<br>
<br>
</blockquote></div><br></div>