2.2 KiB
Serene lang (Bootstrap interpreter)
The bootstrap version of Serene is used to bootstrap the compiler which is written in Serene itself. It's an interpreter with minimal set of features and rough edges.
Heads up
Since the interpreter is there to bootstrap the compiler the goal is to keep it simple and good enough too run the compiler. So we don't want to over engineer things because the interpreter will go away evantually. Here is the list of things that we implemented ( or will implement ) differently:
- Normal Macros (Syntax macro): Since bootstrap version is an interpreter we don't have clear
distinction between compile time and runtime (We have only runtime) - unless we build bytecode support into the interpreter to be able to cache the compiled ast - So we can't really implemeent normal macros as they meant to be implemented.
- List implementation: We don't follow the actual list implementation as a single or doubly linked
list. So far we kept it really stupid by creating a wrapper around Go slices. But we need to fix this one in the future.
- Since we didn't write the reader in Serene itself, there is no reader macroes.
New contributors
If you're a new contributor and you want to start working on the source code and don't know where to start,
just look through the source code for TODO: sections and the dev.org
on the root for some higher level
TODOs.
In order to start reading the code start from the pkg/core/parser.go
file which is the parser implementation
and then take a look at pkg/core/core.go
and pkg/core/eval.go
. If you have any question feel free to ask them
either on the mailing list or the gitter/IRC channel.
Development hint
Use Make… functions
In order to create a new value in any type use the designated Make function, for example: MakeList
Setup development environment
Emacs
All you have to do is to install LSP
and gopls
that's it.
Running the REPL
In order to run the REPL by compiling the code just do:
go run serene.go repl
There is a --debug
parameter which enables more debug output (For example: read -> AST -> out data).