gc-arena | makelisp | |
---|---|---|
4 | 1 | |
415 | 0 | |
- | - | |
8.2 | 10.0 | |
11 days ago | over 1 year ago | |
Rust | Makefile | |
Creative Commons Zero v1.0 Universal | GNU General Public License v3.0 or later |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
gc-arena
-
I built a garbage collector for a language that doesn't need one
I'm going to point out one potential footgun with your library: circularly-linked Drops.
If you have values A and B, both instances of T that implement Drop and hold a Gc to one another, then either A sees a dropped B or B sees a dropped A, and you get UB. Technically this isn't a problem because you already marked it as an unsafe trait, but your documentation should also mention this problem.
You have a safe derive macro for Collectable, however, so it needs to reject Drop. This is possible with some weird macro magic[0].
For those wondering, while Python doesn't have UB, it used to enforce the same rules until PEP 442[1]. Circularly linked garbage that implemented __del__ would instead get stored in sys.gc.garbage and you'd have to go in there and break references on __del__ types. However, native code objects will actually still trigger this behavior[2] presumably to avoid UB.
I have no clue if Java finalizers need to worry about this.
[0] In Ruffle we use gc_arena as our garbage collector. It enforces no_drop in it's Collect derive macro. See: https://github.com/kyren/gc-arena/blob/master/src/gc-arena-d...
Actually, I lied: no_drop is one of two safe constraints you can use Collect with. The alternative is require_static, which only works because gc_arena treats the entire GC heap as a data structure that is owned and has a lifetime that all Gc pointers borrow. This doesn't work for dumpster, though, so ignore it.
[1] https://peps.python.org/pep-0442/
[2] https://docs.python.org/3/library/gc.html#gc.garbage
-
Make a LISP in Rust tutorial starting tomorrow.
I foresee some potential problems with this approach. I would recommend trying to find an arena-based GC crate that you could use. gc-arena looks promising, although I haven't tried it — it seems to be built for your specific use case.
-
Implementing a safe garbage collector in Rust
gc-arena uses closures to create "mutation sessions" where you are allowed to mutate the heap (see example).
-
GhostCell: Separating Permissions from Data in Rust
One example of the second approach is the gc-arena library- see the implementation of the make_arena! macro.
makelisp
-
Make a LISP in Rust tutorial starting tomorrow.
To get started just fork and clone this repository https://github.com/codeislove99/makelisp and start working. The starting file is rust/src/bin/step0_repl.rs If there are any questions or problems please ask. I could not get the MAL test code to work on windows so I am using GitHub codespaces for running the built-in tests.
What are some alternatives?
samsara - a reference-counting cycle collection library in rust
gcarena-demo - demo of gc-arena crate with linked lists
rune - Rust VM for Emacs
mal - mal - Make a Lisp