<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Jul 28, 2014, at 10:15 PM, Roman Klochkov <<a href="mailto:kalimehtar@mail.ru">kalimehtar@mail.ru</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
<div><br><br><br>Mon, 28 Jul 2014 13:51:12 -0400 от "Alexander D. Knauth" <<a href="mailto:alexander@knauth.org">alexander@knauth.org</a>>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br>
On Jul 28, 2014, at 11:41 AM, Roman Klochkov <<a href="x-msg://17/compose?To=kalimehtar@mail.ru">kalimehtar@mail.ru</a>> wrote:<br><br>
> I tried to make it with module</div></div></div></blockquote>.....<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br>
> (require 'm)<br>
> <br>
> Works just fine<br><br>
Yes because GENSYM was provided by ‘m, but if it’s a #lang then that doesn’t matter unless you specifically require experiment-with-hygenic-reader-extensions/lang/reader.  And as I say below, I shouldn’t have to do that, and I shouldn’t have to provide GENSYM either. </div></div></div></blockquote>Read macros return source code. So there are no other way.<br></div></blockquote><div><br></div><div>They can return syntax-objects, and it seems to work for lambda (if there’s no local variable conflicting), so I’m trying to understand why it works for lambda and not for GENSYM.  </div><div>By the way the language does not have to provide lambda in this case:</div><div><div>#lang afl s-exp "no-lambda.rkt"</div><div>(map #λ(+ % %2) '(1 2 3) '(1 2 3)) ; '(2 4 6)</div><div>where afl is a meta-language that adds #λ to a language, and no-lambda.rkt is this:</div><div><div>#lang racket/base</div><div>(provide (except-out (all-from-out racket/base) lambda))</div><div><br></div><div>So since “no-lambda.rkt” doesn’t have to provide lambda for #λ to work, why would you have to provide GENSYM?  That’s (part of) what I’m trying to figure out.  Why does one work and the other not work?  </div></div></div><br><blockquote type="cite"><div><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br><br>
> I'm not very proficient with lang, but you should require module with `make-reader' to you last module.<br>
> <br>
> I installed your package via `raco pkg install <a href="git://github.com/AlexKnauth/experiment-with-hygenic-reader-extensions'">git://github.com/AlexKnauth/experiment-with-hygenic-reader-extensions'</a>, but<br>
> <br>
> $ /usr/racket/bin/racket try-it.rkt<br>
> default-load-handler: cannot open module file<br>
>  module path: experiment-with-hygenic-reader-extensions/lang/reader<br>
>  path: /home/monk/.racket/6.0.1/pkgs/experiment-with-hygenic-reader-extensions/experiment-with-hygenic-reader-extensions/lang/reader.rkt<br>
>  system error: No such file or directory; errno=2<br>
> <br>
> Maybe something wrong.<br><br>
Hmm, it doesn't do that for me.  <br>
But I’m just wondering, when you look at …/pkgs/experiment-with-hygenic-reader-extensions, does it have …extensions/langreader.rkt instead of …extensions/lang/reader.rkt ? </div></div></div></blockquote>Yes, …extensions/langreader.rkt<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br><br>
> I think you should add (require (submod experiment-with-hygenic-reader-extensions/lang/reader reader)) to try-it. Or make another module with make-reader, which will be required by lang and result program.<br><br>
Well another good thing about hygienic macros and syntax-objects is encapsulation so that a macro can use GENSYM without having to provide GENSYM, so that GENSYM does not have visible to the user of the macro.  So you shouldn’t have to add a (require experiment-…/lang/reader) to try-it.rkt.</div></div></div></blockquote>Yes. Because macros in Scheme/Racket don't build code, they build syntax. But read-macros build source code (in the meaning of "program text"). Don't know why, maybe because syntax context, returned by read-syntax should be current context, not the context of language definition.<br></div></blockquote><div><br></div><div>Well it should, for normal things.  However since I want the lambda produced by #λ to be the same no matter what module it’s in, I want to use the lexical context from the reader.rkt module, and I also want to figure out what works, what doesn’t, and why?  </div><div><br></div><div>It seems like you’re trying to tell me that “hygienic reader extensions” can’t work.  But if it’s working for lambda (if …), then why wouldn’t it work for GENSYM?  </div><div><br></div><blockquote type="cite"><div><blockquote style="border-left-width: 1px; border-left-style: solid; border-left-color: rgb(8, 87, 166); margin: 10px; padding: 0px 0px 0px 10px; position: static; z-index: auto;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br><br>
But for some reason that’s not always working for reader extensions.  <br><br>
It seems to work when the binding is from racket/base and there’s no local binding conflicting with it (but module-level bindings conflicting with it are ok), but not when it’s from a different module other than racket/base? </div></div></div></blockquote>It always work, when the binding is from current module (if it doesn't require racket/base, then its bindings won't work also).<br><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;"><div id=""><div class="js-helper js-readmsg-msg"><div id="style_14065698790000000618_BODY"><br><br>
I don’t know.  <br><br>
> <br>
> Mon, 28 Jul 2014 11:08:20 -0400 от "Alexander D. Knauth" <<a href="x-msg://17/compose?To=alexander@knauth.org">alexander@knauth.org</a>>:<br>
>> Well that works fine when it’s in the same module (or namespace), but when I put it in a #lang, it breaks and I get this error:<br>
>> experiment-with-hygenic-reader-extensions/try-it.rkt:<br>
>> #lang experiment-with-hygenic-reader-extensions<br>
>> $<br>
>> ; g15667: unbound identifier in module in: g15667<br>
>> <br>
>> That’s one problem with unhygienic reader extensions. <br>
>> Since you used (datum->syntax #f ‘(GENSYM …)), it eventually took on the lexical context of try-it.rkt, where the GENSYM name isn’t there.<br>
>> <br>
>> Though strangely, if I put some lexical context on GENSYM by using (datum->syntax #f `(,#'GENSYM …)), then it gives me this error:<br>
>> experiment-with-hygenic-reader-extensions-2/try-it.rkt:<br>
>> #lang experiment-with-hygenic-reader-extensions-2<br>
>> $<br>
>> ; require: namespace mismatch;<br>
>> ; reference to a module that is not available<br>
>> ;  reference phase: 0<br>
>> ;  referenced module: “…/experiment-with-hygenic-reader-extensions-2/lang/reader.rkt"<br>
>> ;  referenced phase level: 0 in: g24<br>
>> <br>
>> <a href="https://github.com/AlexKnauth/experiment-with-hygenic-reader-extensions" target="_blank">https://github.com/AlexKnauth/experiment-with-hygenic-reader-extensions</a><br>
>> <br><br>
> <br>
> <br>
> -- <br>
> Roman Klochkov<br><br></div></div></div></blockquote>
<br>
<br>-- <br>Roman Klochkov<br></div>
</blockquote></div><br></body></html>