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.

