Ok. Thanks, Philip! —jmj

> On Oct 1, 2017, at 5:04 PM, Philip McGrath <[email protected]> wrote:
> 
> Using `mylang/semantics` will work as long as you have the `mylang` 
> collection installed, which is necessary for `#lang` to work anyway.
> 
> In cases when it is sensible to use your new language without the custom 
> reader (e.g. for languages which don't have a custom reader), it is often 
> pleasant to have the name of the language be the same regardless of whether 
> the programmer writes `#lang mylang` or `(module some-module mylang body 
> ...)`. This can be accomplished by putting the contents of your current 
> "semantics.rkt" in "main.rkt" and then giving "main.rkt" a reader submodule 
> that refers to the enclosing module, e.g. `(module reader 
> syntax/module-reader mylang)`. Whether or not this makes sense depends, of 
> course, on the particulars of the language you're defining.
> 
> -Philip
> 
>> On Sun, Oct 1, 2017 at 2:50 PM, Jordan Johnson <[email protected]> wrote:
>> Hi all,
>> 
>> I’ve been putting together a little language to learn more about how the 
>> Racket #lang ecosystem works, and I’m hung up on bundling up the language as 
>> a collection. I’m not sure I correctly understand the point where the reader 
>> attaches to the macros that specify how to expand the language forms, and I 
>> want to check.
>> 
>> So, say I have a file semantics.rkt (in mylang/, the main dir of the 
>> collection) defining the macros that make up the language, and a reader 
>> lang/reader.rkt (in the same dir):
>> #lang s-exp syntax/module-reader
>> "../semantics.rkt"
>> #:read my-read
>> #:read-syntax my-read-syntax
>> 
>> (require "lang/parser.rkt" syntax/strip-context)
>> ;; ...simple defs of my-read and my-read-syntax...
>> 
>> This much works. My question is how to attach the semantics.rkt file to my 
>> reader code correctly if I don’t use syntax/module-reader. If that’s not 
>> clear enough, a more detailed description of the problem follows.
>> 
>> Following the “Installing a Language” section in the Racket Guide, I moved 
>> this reader code into a main.rkt file in the main dir of the collection 
>> (call it mylang/):
>> (module reader racket
>>   (require "lang/parser.rkt" syntax/strip-context)
>>  
>>   (provide (rename-out [my-read read]
>>                        [my-read-syntax read-syntax]))
>>  
>>   (define (my-read in) (syntax->datum (my-read-syntax #f in)))
>> 
>>   (define (my-read-syntax src in)
>>     (with-syntax ([(program-part ...) (parse-program-file src in)])
>>       (strip-context
>>        #'(module IGNORE "semantics.rkt"
>>            program-part ...)))))
>> 
>> I can then write
>>      #lang mylang
>> in another file, and it works as expected iff the file I’m loading is in the 
>> mylang/ directory as well, failing otherwise with an error like this:
>> /path/to/mylang/main.rkt:17:24: cannot open module file
>>   module path: #<path:/tmp/semantics.rkt>
>>   path: /tmp/semantics.rkt
>> 
>> The module language spec I’ve highlighted in red seems brittle; because 
>> Racket’s looking for semantics.rkt in the directory of the file containing 
>> #lang mylang and not mylang/, I’ve been assuming that’s where the problem 
>> is. Correct me if I’m wrong in this understanding: the #'(module ...) is 
>> effectively replacing the body of whatever program is written in #lang 
>> mylang, so the path-string "semantics.rkt" must be interpreted relative to 
>> that program’s source file.
>> 
>> Anyway, the solution I found is to replace "semantics.rkt" with 
>> mylang/semantics, but that seems like it might be brittle as well; is that 
>> the right way, though? If not, how should I be specifying the connection to 
>> the macros?
>> 
>> Thanks,
>> Jordan
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> For more options, visit https://groups.google.com/d/optout.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to