Just kidding, it isn't really called Qi++ . It's the same old Qi, but it now does have real macros!
What does that mean? Well, some time ago this paper about making DSLs "macro extensible" was doing the rounds in the community. Unfortunately it was way over my head and so, covetous of the kind of macro-extensibility it talked about, I implemented a simple hack to achieve it in Qi in cunning fashion. This meant that the language could indeed be extended by using macros, but the approach taken being superficial meant that user-defined macros could in a sense only be second class citizens of the Qi language.
Shortly after I posted about the initial macro-extensibility approach, Michael Ballantyne (who wrote that paper! Along with Alexis King and Matthias Felleisen) reached out and offered to help implement a proper solution in Qi. By his generous sharing of expertise (and the support and encouragement of his advisor, Matthias), I'm pleased to report that Qi is now properly macro extensible, in a way that essentially puts it on even footing with Racket as a basis for writing language extensions and even new DSLs. As anyone who uses macros would appreciate, this is a major improvement in the language and opens up a lot of new possibilities. Some of these possibilities are foreshadowed in some exercises in the docs, including:
- adding monads (a new feature) to Qi
- adding pattern matching (a new DSL)
- and adding a custom compiler (for faster performance)
And I am sure that you will think of a lot more
Other things in this release:
- More docs. A quick
wc -w
estimate suggests Qi now has over 50 pages of docs! (at 300 words per page). There are some ideas guiding the organization of the docs that I hope make them easy to navigate and efficient. If you have any problems finding information please let me know. -
The "probe" debugger (for debugging flows) got an upgrade. Now there's no need to define flows using a debugging-specific macro in order to be able to debug them using
probe
-- it can debug existing flows as written. - A convenient way to embed DSLs like Deta and Sawzall into Qi
Btw, as this release leverages features only present in Racket 8.3+, older (i.e. <= 8.2) versions of Racket will go into maintenance mode and only receive bug fixes going forward.
Finally, I also want to give a special shout out to D. Ben Knoble, whose early input led to many improvements in Qi 1.0.
Alright enjoy!
-Sid