This commit is a WORK IN PROGRESS for the base implementation of the
HyphaeVM. This will be squashed into a larger commit eventually when
the work of implementing the HyphaeVM is finished.
Of note, the ISA is mostly finished and much of the VM design is in
place. Yet to be done are a few traps in mycelium, migrating pieces
like the number package and the sexpr package into the VM package,
and of course much testing.
Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit adds a new data type to the codebase. It organizes data
into first in last out linked lists of first in last out linked lists.
Hence the name: StackStack.
This data type was made to represent frames of execution, where there
there is a stack for each function call containing local variables and
arguments. The following tertiary goals were also met:
- no relocating of adjacent data on push or pop
- no copying or cloning of contained data on modification or mutation
- index access to all elements of all contained stacks starting with
most recent insertions.
There are operations to allocate a new stack on the stackstack and
to deallocate the top stack on the stackstack. Additionally there are
operations for pushing and popping from the top stack.
Unit tests are added and CI is updated to include them.
Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit includes a new utility, the decomposer, which has
primarily been used to test the AST against found scheme code in
the wild (internet). Decomposer will time and test the lexing and
parsing of any document full of scheme.
This commit includes additional test cases and logical fixes for
issues found during the testing performed.
Signed-off-by: Ava Affine <ava@sunnypup.io>
This commit adds a number library which handles fractions, floats,
whole numbers, scientific notation, and special symbolic numbers
all according to the R7RS small specification.
Numeric trait is used to abstract operations across all number types
and a Number enum is used to offer a non-opaque type that stores any
kind of number.
Upon the Number enum is implemented the following traits:
- Add, Div, Sub, Mul
- Pow
- PartialEq
- PartialOrd
Which then offer the following operators to use on the Number enum
instances themselves: + - / * == != < > <= >= and of course x.pow(y).
Additionally, the number package contains parsing logic for each type
of number. FromStr is implemented as part of the Numeric trait, and
then in turn implemented on Number. Additionally Into<String> is
implemented for the Numeric trait and then on the Number enum type
as well.
Test cases have been added for basic cases, but could be expanded.
Additional modifications:
- LexError has a custom display implementation that properly outputs
formatted errors.
- Sexpr package updated to use new number package
Signed-off-by: Ava Affine <ava@sunnypup.io>
The lexer is complete with tests. It fully encapsulates the logic
of splitting an input document into a stream of tokens. It can be
instantiated from an Rc<str>, meaning no lifetimes need be managed
references to the original document (like a stringview) can be
passed around carelessly. The Lexer implements the iterator
method which should help elegantly design repls / compilers, etc.
The S-Expression data type represents the parsed AST. The actual
parsing logic is yet to be added. It is intended that the AST be
the last step before compiling to bytecode. The data representation
here is cons cells of datum. Formatting is implemented.
Signed-off-by: Ava Affine <ava@sunnypup.io>