Many of the other answers here are good, but I want to try and give a couple more options and a little more context.
First of all, in Racket, the phrase “syntactically correct” is a little bit vague. It could mean that a program is successfully parsed from text to s-expressions, which is the reader step, or it could mean that macroexpansion completes successfully. The former definition is the more traditional definition of “syntactically correct”, but being able to parse an AST means little in a language where the code effectively is the AST. For that reason, something like (define) is obviously a “syntax error”, but it’s perfectly valid from the reader’s point of view. So the question is, which of the two things do you want to check? Obviously, checking if macros properly expand is a strictly stronger check than checking if the program is properly read. - If you want to check that a program is properly read, you can use `raco read` from the command line, or you can use `read` in combination with with-module-reading-parameterization from syntax/modread to achieve something similar programatically. - If you want to check that a program properly macroexpands, you can use `raco expand` from the command line, or you can use `expand` on the value produced by the previous step after setting current-namespace to (make-base-namespace). However, be aware of the implications of both of these things! Performing macroexpansion on a program can have arbitrary side-effects. It’s perfectly possible to write a macro that will open an HTTP connection and send all your private data over the wire. For this reason, macroexpansion is no safer than actually running the program, so you should do it in a sandbox if you are running arbitrary user-submitted code. In contrast, the reader step seems safe, but it’s actually not. Due to the existence of #lang and #reader, users can supply arbitrary readers for their programs, which can also run arbitrary code. If you do not need to support arbitrary #lang languages, you could set read-accept-reader and read-accept-lang to #f, then do the reading yourself, and that would be safe, but then you can’t use with-module-reading-parameterization mentioned above. If you are going to run either of the two steps above using the command-line tools, I would recommend that you run them inside a virtual machine with no network access or access to the host filesystem. You could also use the programmatic approach and use racket/sandbox, which allows restricting what programs can do, but I don’t claim to know how strong the security guarantees are that racket/sandbox provides. (Of course, if you’re running arbitrary code, anyway, then you are probably aware of those things. I just want to make it clear that using this as a “safe precheck” is not a valid assumption for future readers who might stumble upon this thread.) Alexis > On Nov 25, 2016, at 17:28, David Storrs <david.sto...@gmail.com> wrote: > > As part of my pre-checkin test suite I'd like to be able to check that all > files are syntactically correct, but I don't want to actually execute them > because, e.g. executing 'server.rkt' would start the server and I don't want > that. Is there a way to do this? Nothing I see under 'raco help' or the > racket docs suggests a solution. > > -- > 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. > 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 racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.