---------- Forwarded message --------- From: Shu-Hung You <shh...@u.northwestern.edu> Date: Sat, Sep 3, 2022 at 1:03 PM Subject: Re: [racket-users] Writing a "command-line front-end" for a language To: Reuben Thomas <r...@sc3d.org>
Running `racket foo.asm` will produce the desired output, so a shell script that directly passes the arguments to Racket could work. Otherwise, just use (dynamic-require filename #f) in main.rkt. At the technical level, foo.asm is in fact an ordinary Racket module, just like any other .rkt file. Therefore it can be run in the same way using APIs that require and instantiate modules. ----------- On a side note, the forum has mostly moved to Discourse (https://racket.discourse.group/). On Sat, Sep 3, 2022 at 6:01 AM 'Reuben Thomas' via Racket Users <firstname.lastname@example.org> wrote: > > I'm a relative Racket newbie, and I've just enjoyed Beautiful Racket. > > I am working on a Racket implementation of a simple assembler (for the Hack > VM in the NAND2Tetris course). > > I have a partial implementation up and running using #lang lines. I would > like to add a more traditional command-line interface, so I can (eventually) > say: > > hackasm foo.asm > > on a file without a #lang line. > > My code is available at https://github.com/rrthomas/hackasm > > Here's the nub of the problem: I can't work out how to call the language > evaluator "manually". I have implemented the language as a dialect, so that > the "main.rkt" module is "free" to be used for the command-line interface. > (Perhaps this can be fixed too, that would be nice!) > > A typical assembler file might start like this: > > #lang hackasm/asm > @2 > D=A > @3 > > When I run this file (e.g. in DrRacket), I get some output as expected: > > 0000000000000010 > 1110110000010000 > 0000000000000011 > > (The assembler outputs ASCII-encoded binary!) > > The contents of my main.rkt looks like this: > > #lang br/quicklang > (require "parser.rkt" "tokenizer.rkt" (submod "asm.rkt" reader)) > > (module+ main > (require racket/cmdline) > (let ((filename > (command-line > #:program "hackasm" ; > #:args (filename) > filename))) > (read-syntax filename (open-input-file filename)))) > > So far, all I've worked out how to do is run the language's read-syntax > function (imported from parser.rkt), and thereby return the parsed syntax > object as the result. > > What I'd like to do is call the evaluator on the parse tree, but after a lot > of scratching my head over the Racket documentation and search results, I > cannot work out how to do that. I presume the code should look something like: > > (eval (??? (read-syntax filename (open-input-file filename)))) > > where in the end I'm eval-ing a form, and where ??? represents something that > turns the syntax object into a runnable module. > > Apologies for the length of this post (I was unsure how I could make it > shorter), and thanks in advance for any help! > > -- > https://rrt.sc3d.org > > -- > 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 racket-users+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/CAOnWdohy31fHyvUd9rbY8tZFLJKUpevgnZ8jPH2-5_QtSFm%2BhA%40mail.gmail.com. -- 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 racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAMTzy%2BYSy2DH3zzdpzujRuiu37zMzKYZvu0p%2Bfk1RsNqeuJRDQ%40mail.gmail.com.