This might interest you if you like the idea of proving properties of programs.
https://en.m.wikipedia.org/wiki/Curry%E2%80%93Howard_corresp...
It's actually not a lot of work and very rewarding to write a proof-checker that uses this principle.
This property of dependent types:
> In fact, if you don't mind writing a proof or two, our sprintf function can be called on format strings that aren't fully known at compile-time! You only need to be able to prove that the string will have certain format specifiers, and then calling sprintf can typecheck.
It's not new to me, but I also find it pretty cool. Proving things at compile-time that certain runtime conditions will hold using a programming language is so much cooler than just proving it to yourself in your head or on paper, and then doing a runtime assertion in the actual code. Or, not doing a check at all, and just having crashes or security vulnerabilities if you're mistaken.