Add readme
This commit is contained in:
commit
5e5dddb3ba
|
|
@ -0,0 +1,55 @@
|
||||||
|
# leao
|
||||||
|
|
||||||
|
minimal scheme dialect implementation written in ISO C11 meant to be used
|
||||||
|
to write interpreters and compilers (that can therefore be easily bootstrapped).
|
||||||
|
|
||||||
|
## How to build
|
||||||
|
|
||||||
|
This project uses **GNU Make**, in order to build it, run in your shell:
|
||||||
|
|
||||||
|
> $ make
|
||||||
|
|
||||||
|
## leao features (or better, limitations)
|
||||||
|
|
||||||
|
Here is a list of features that are planned:
|
||||||
|
|
||||||
|
* Input source code can be encoded in UTF-8, but identifiers are very limited (cfr. `src/parser.c`)
|
||||||
|
* There are only integers (probably int64_t) and integer arithmetic
|
||||||
|
* **box** primitive datatype, being the only one that allows mutation, all the other values are immutable
|
||||||
|
* First class functions
|
||||||
|
* First class undelimited continuations (maybe? I'm not sure yet, but they seem easy to implement)
|
||||||
|
* First class delimited continuations (seem easy)
|
||||||
|
* Hygienic macros (this is very hard, even less sure, but they can help in writing an interpreter)
|
||||||
|
|
||||||
|
## Implementation notes
|
||||||
|
|
||||||
|
I'd like to implement a virtual machine influenced by the second architecture (stack based virtual machine)
|
||||||
|
exposed in Dybvig's thesis `Three Implementation Models for Scheme`.
|
||||||
|
|
||||||
|
Observe that the odd (for scheme) requirement of having all immutable values except for the **box** datatype
|
||||||
|
is to allow for a slightly optimised virtual machine implementation.
|
||||||
|
|
||||||
|
In fact by making the user manually mark the mutable values in the program, the compiler can spare
|
||||||
|
some heap allocations when needed.
|
||||||
|
|
||||||
|
Actually this limitation is not necessary at all, in fact the interpreter can do some analysis and automatically
|
||||||
|
determine whether a variable can be mutated or not, but at the moment i like the idea of having explicitly
|
||||||
|
marked mutations, it seems more functional (the idea is copied from _Standard ML_).
|
||||||
|
|
||||||
|
This limitation will probably change in the future.
|
||||||
|
|
||||||
|
For the garbage collection I'll get started with the Cheney's algorithm, which is pretty easy to implement.
|
||||||
|
Maybe later a different algorithm may be due.
|
||||||
|
|
||||||
|
### Core language
|
||||||
|
|
||||||
|
Since we want to hopefully implement macros, we start defining what the core, target, language looks like.
|
||||||
|
|
||||||
|
It has the following syntactic forms, whose semantics can be looked up on the R7RS standard:
|
||||||
|
|
||||||
|
* define
|
||||||
|
* let, letrec
|
||||||
|
* lambda
|
||||||
|
* quote
|
||||||
|
* if
|
||||||
|
* begin
|
||||||
Loading…
Reference in New Issue