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