One fun side effect of lisp-style syntax: there's always a close token that corresponds to each expression. You can hover unambiguously.
(This tiny web page is at https://pl-toys.surge.sh/ if you want to play with it.)
I'm having fun writing a simple type checker, but I'm learning firsthand why syntax-directed checking doesn't work. It prevents inference.
My checker catches real bugs, but it can't handle cases like this:
[1, 2].map(fun(x) { x + 1; })
I think I need bidirectional checking.
A funny side effect of building software in Rust: my machine OOMs much more during development.
I'm not entirely sure why. I think Rust makes it easy to allocate data quickly, and sooner or later you write an infinite loop when coding.