I have added eval and a repl (read eval print loop) to Church.
> + 3 4 7 > length "foobar" 6 > eval "* 19 3" 57 > load "church/test/hello.church" true > (main) "hello" true
Up to now I have only been using Church as a command-line compiler which produces executable files. Yet I have always preferred interactive language environments (lisp, smalltalk, python etc) to stop-compile-run languages.
All the machinery for writing a repl has been in Church for a while, including
- Church parser available as a library
- Church compiler available at runtime
- Machine code generator and dynamic linker available at runtime
- The ability to modify the dispatch table at runtime
This makes the repl easy to implement:
repl loop do rstr = (read-line) if (null? rstr) return-from repl nil else print (eval rstr)
Eval is a little bit more messy because the compiler is designed to compile a whole method at a time and doesn’t know what to do with variables that are not either a global or local variable.
To implement eval I wrapped the eval string in a lambda that I return from a method which gets run after compilation.
set-eval-compiled-function eval-compiled-function = (fn -- eval_str)
This works for certain language expressions, but does not presently provide the ability to assign to “repl” variables.
Another drawback is that multiline statements are currently not possible (unlike python and lisp).
In the future I hope to experiment with a SLIME-like extension to emacs which communicates to Church across a socket, allowing interactive evaluation and compilation of source code from within the editor.