Alice
Alice was created between October 2016 and April 2017 by me, with a lot of help from Sp3000. It started out as "a quick one-or-two week project" just for the sake of getting something done because I wasn't making any progress with my other language ideas. Well, you can count the months yourself... I guess it's what I deserve for turning feature creep into a design goal.
Alice is a feature-rich Fungeoid with many high-level functions that make programming in it comparably doable (hopefully). I originally started working on it when Sp3000 suggested to combine two of my ideas into a single language:
- Many 2D programming languages use
/
and\
to reflect the instruction pointer on the 45 degree diagonal. But I figured in most fonts those characters are closer to 67.5 degrees, so they should really reflect between orthogonal and diagonal movement in some way. - I wanted to create a feature-rich Fungeoid where operators have different meanings depending on what direction the IP is moving, so I could overload them with even more commands.
So here we have Alice. A language in which mirrors change orthogonal movement to diagonal movement and vice-versa, and in which the language works in two very different modes depending on whether you're moving orthogonally or diagonally: in Cardinal mode (moving orthogonally), Alice is much like other Fungeoids that can only work with integers on a stack or tape (although Alice has both); in Ordinal mode (moving diagonally), Alice turns into a string processing language and now only knows about strings as a data type.
I also resolved early on to give every single printable ASCII character a distinct function in Alice. So Cardinal mode has a lot of built-ins for basic arithmetic, number theory, combinatorics and some other shenanigans. Ordinal mode has a wide variety of commands for string manipulation and set theoretic operations.
And finally, we come to the name (and theme) of the language: the language is of course named after Lewis Carroll's Alice. Much as Alice in Through the Looking-Glass, you step through mirrors to switch between two mirror universes. What this means for the language is that the two functions performed by any of the characters in the two modes, are (sometimes subtly and sometimes not so subtly) related, in terms of their effect, their theme or their structure. When a Cardinal command works with the divisors of a number, the corresponding Ordinal mode command will often do something similar with the substrings of a string. When a Cardinal command picks a random number in a range, the corresponding Ordinal command picks a random character from a string. And so on...
If you want a first taste of the language, here is Collatz step counter. For a more elaborate example that makes proper use of both modes, see this answer. The language repository also has some example programs.
I've got a bunch of people to thank for their help with this language. As I said above, Sp3000 has been a huge help, testing the language, giving feedback, and throwing ideas back and forth. But I've also worked in some ideas from discussions on SE: thanks to Basic Sunset, flawr, Mistah Figgins, muddyfish, Nathan Merrill, Peter Taylor and Poke (and probably some others whom I forgot).
- GitHub repository. Includes language specification, reference implementation (Ruby), example programs and issue tracker.
- Try it online! (by Dennis) backed by the Ruby interpreter.
- SE Chatroom. For any questions and discussions about the language, bug reports, etc. I'll usually be pingable in there.