Commit graph

21 commits

Author SHA1 Message Date
80509f704c WIP ISA Unit tests
Some checks failed
per-push tests / build (push) Successful in 42s
per-push tests / test-utility (push) Successful in 1m58s
per-push tests / test-frontend (push) Successful in 2m4s
per-push tests / test-backend (push) Failing after 2m7s
per-push tests / timed-decomposer-parse (push) Successful in 2m12s
Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-08-04 12:11:45 -07:00
609e65a8db Test harness for HyphaeVM
All checks were successful
per-push tests / build (push) Successful in 49s
per-push tests / test-frontend (push) Successful in 53s
per-push tests / test-utility (push) Successful in 1m2s
per-push tests / test-backend (push) Successful in 54s
per-push tests / timed-decomposer-parse (push) Successful in 56s
This commit adds a testing framework for HyphaeVM which enables
testing various aspects of the VM state after running input programs
against a VM with possibly preinitialized state.

This includes a builder pattern initializer for the VM, and bespoke
logic for a test case tester.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-29 23:37:22 +00:00
ddb49788af String Instructions
All checks were successful
per-push tests / build (push) Successful in 47s
per-push tests / test-utility (push) Successful in 53s
per-push tests / test-frontend (push) Successful in 59s
per-push tests / test-backend (push) Successful in 43s
per-push tests / timed-decomposer-parse (push) Successful in 51s
The following instructions are modified to act on strings:
- INDEX: Now pulls a char out at index
- SUBSL: Now pulls a substring out of a source string
- INSER: Now inserts a char into a string at index
- LENGTH: Now returns length of a string

In addition to the above instructions, additional instructions
are now implemented to handle strings:
- CONCAT: appends a string onto another string
- S_APPEND: appends a char on to the end of a string

Fixes: #38

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-29 18:19:16 +00:00
63554191f8 fix: #39 Adds a garbage collected deep copy test
All checks were successful
per-push tests / build (push) Successful in 53s
per-push tests / test-utility (push) Successful in 40s
per-push tests / test-frontend (push) Successful in 40s
per-push tests / test-backend (push) Successful in 40s
per-push tests / timed-decomposer-parse (push) Successful in 39s
Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-28 23:39:32 +00:00
7579d81d7b add garbage collection tests to CI
All checks were successful
per-push tests / build (push) Successful in 2m21s
per-push tests / test-frontend (push) Successful in 38s
per-push tests / test-backend (push) Successful in 39s
per-push tests / test-utility (push) Successful in 2m29s
per-push tests / timed-decomposer-parse (push) Successful in 38s
Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-28 23:04:49 +00:00
2392d5c2fa Finish garbage collected heap
This commit adds unit tests for garbage collection as well as a
deep copy implementation for cons which fully deep copies the whole
tree and a clone implementation for Datum which deep copies cons.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-28 23:02:06 +00:00
524f79733c HyphaeVM Cons instruction prototype
All checks were successful
per-push tests / build (push) Successful in 49s
per-push tests / test-frontend (push) Successful in 33s
per-push tests / test-utility (push) Successful in 35s
per-push tests / test-backend (push) Successful in 29s
per-push tests / timed-decomposer-parse (push) Successful in 34s
This commit implements the Cons instruction with desired behavior.
Tests are yet to be implemented for any instruction, but are coming
soon.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-27 07:18:14 +00:00
cf626b2bfc HyphaeVM Garbage Collection
All checks were successful
per-push tests / build (push) Successful in 36s
per-push tests / test-utility (push) Successful in 36s
per-push tests / test-frontend (push) Successful in 37s
per-push tests / test-backend (push) Successful in 31s
per-push tests / timed-decomposer-parse (push) Successful in 34s
This commit removes the dependency upon Mycelium::sexpr::Datum from Hyphae
and instead adds a heap.rs module including three types:

- Gc: This is essentially a Box<Rc<T>> but passed around as a *const Rc<T>.
    not only does this allow the wrapped T to be passed around in a format
    that fits completely within a single physical register, this also
    applies a greedy reference counting garbage collection to each and
    every object allocated in the VM.

- Datum: This is a simplified enum for type polymorphism. Similar to the
    original Mycelium::sexpr::Datum.

- Cons: This is a very standard Cons cell type.

Additionally, two new instructions are added:
- DUPL: a deep copy instruction
- CONST: an instruction to create number datum from embedded constants
- NTOI: casts a number to its inexact form
- NTOE: casts a number to its exact form

Fixes: #35 and #36

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-25 22:27:51 -07:00
8d2d0ebf0c Clean up project structure
All checks were successful
per-push tests / build (push) Successful in 32s
per-push tests / test-utility (push) Successful in 32s
per-push tests / test-frontend (push) Successful in 34s
per-push tests / test-backend (push) Successful in 30s
per-push tests / timed-decomposer-parse (push) Successful in 26s
The number package is moved into its own package henceforth referred
to as "organelle". Hyphae and Mycelium are updated accordingly. In
addition, Hyphae gets a copy of the sexpr module of Mycelium. This
will not remain a copy, rather it will be the basis of a heap manager
module within Mycelium to be worked on in the future.

Fixes #32

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-24 19:44:43 +00:00
6f95381e5e normalize edition to 2024
All checks were successful
per-push tests / build (push) Successful in 38s
per-push tests / test-frontend (push) Successful in 31s
per-push tests / test-utility (push) Successful in 34s
per-push tests / timed-decomposer-parse (push) Successful in 26s
per-push tests / test-backend (push) Successful in 30s
Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-24 19:28:25 +00:00
14396895e9 add forgejo CI
Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-07-24 19:28:25 +00:00
4ad319213d HyphaeVM - WIP
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>
2025-07-24 19:26:31 +00:00
3a0a141738 QuickMap and CI
This commit adds a new datatype: the quickmap. It provides an extremely
fast but relatively high collision string hash to whatever key hashmap.

This is optimized purely for variable names, and is intended to use for
variable name lookup during (eval ...) or (string->symbol ...) if I must
implement that.

The hashmap is bucketed, with a set number of buckets (199 in this case).
Each bucket is preallocated at initialization containing an empty vector.
There will only ever be one of these initialized as it is only to contain
globally accessible names.

The interface provides new, get, remove, contains_key, insert, and an
iterator implementation.

Unit tests are included and CI is updated.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-06-10 14:16:38 -07:00
a12d15b2cd StackStack and CI Updates
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>
2025-05-28 11:54:40 -07:00
528a61749d Readme and early CI
This commit prepares the code to be uploaded to gitlab.
Included is a small readme and basic CI.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-05-21 15:10:44 -07:00
e4c6e0924a Decomposer: fixes from found code
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>
2025-05-21 14:48:36 -07:00
86f905ba1d Parser
This commit adds a parser, complete with tests. The parser implements
an iterator which returns Datum. It wraps around a Lexer and uses the
Lexer's iterator interfact to consume lexemes. It may return an error
which may wrap around a LexError or a fully lexed lexeme.

In the implementation of the Parser bugs were found in the lexer
package. This resulted in the lexing tests being extended as well as
several small logic updates.

The number package has had slight tweaks to make number representations
less cumbersome.

Finally, the Datum display logic in the sexpr package has also been updated.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-05-19 14:38:11 -07:00
a48fc52fab Number: fix frac.pow(frac) issue and better make_inexact() for sci
This commit fixes a bad procedure used to raise a fraction to the
power of another fraction, and adds additional test cases for this.

It also fixes a todo in the number package for implementing
make_inexact on ScientificNotation numbers such that they can handle
negative exponents.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-05-16 15:04:53 -07:00
3174494001 Lexer supports hexadecimal escaping and number literals
This commit updates the Lexer to fully support character and string
escaping as well as hexadecimal in number literals. Updates to lexing
were performed according to the R7RS small specification. Test cases
were extended to cover new support, as well as more number cases
mirrored in the parsing logic of the number package.

Signed-off-by: Ava Affine <ava@sunnypup.io>
2025-05-15 19:30:18 -07:00
41216d3526 Number library and integrations
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>
2025-05-15 12:59:00 -07:00
6554a0639a Lexer and S-Expression data types
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>
2025-05-07 09:19:33 -07:00