Lox is a Dynamically Typed Programming Language created by Bob Nystrom for his excellent book Crafting Interpreters.
This is yet another Javascript Implementation.
$ npm install yalijs
$ yali loxfile.lox
$ yali
> print "No semicolons needed!"
$ loxfmt --write --indent=" " loxfile.lox
$ lox2python loxfile.lox --out="a.py"
OR
$ lox2python loxfile.lox | python
The main interface of YALI.js is a run
method that will tokenize, parse, and interpret your lox source code, all in one function.
run(source_code, environment = new Environment(), printfn = console.log, debug = false)
You can pass in an environment
object, which lets you define built-in variables and functions like so:
const { run, Environment } = require('yalijs')
const env = new Environment()
env.setBuiltin('owner', 'dberezin')
env.setBuiltin('meaning_of_life', 42)
env.setBuiltin('alert', (interpreter, arg) => alert(arg[0]))
run('print meaning_of_life;', env)
You can also pass in a printfn
that will be called for every print
statement. Here's an example for capitalizing each word in the stdout:
run(
'print "hello world";',
new Environment(),
out => console.log(out.split(' ').map(_.capitalize).join(' '))
)
> Hello World
YALI.js also provides a parse
function to tokenize and parse lox source code, returning an array of AST nodes that can be manipulated as desired. See any of the transpiler examples for reference.
For any bugs and feature requests please open an issue. For code contributions please create a pull request. Enjoy!