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.

