The Programming Languages Zoo
plzoo.andrej.com
plzoo.andrej.com
Old recordings of his other classes are also the only thing that helped me actually understand proofs of program correctness last semester. Seriously, I went through all our lectures and basic materials twice and still didn't get it. Then someone sent me one of his recordings and in 30 minutes, it all just clicked for me. Ended up getting 100% on that part of the exam, where before I wasn't sure I'd even pass.
In terms of implementation, you can probably implement backtracking good enough for Prolog via backtracking, but you really need immutable maps for minikanren due to the interleaving. On the prolog side of things, prolog implementations typically care a lot more about being able to dynamically interact with the database including adding/retracing goals. Finally, minikanren tends to play nicer when combined with another language compared to prolog so it might be interesting to do include have it embedded in another language.
The Programming Languages Zoo - https://news.ycombinator.com/item?id=18638290 - Dec 2018 (13 comments)
The new and improved Programming Languages Zoo - https://news.ycombinator.com/item?id=12441903 - Sept 2016 (2 comments)
> The Programming Languages Zoo is a collection of miniature programming languages which demonstrates various concepts and techniques used in programming language design and implementation. It is a good starting point for those who would like to implement their own programming language, or just learn how it is done. [emphasis added]
And I know you've posted about Ada++ a few times (I thought I recognized your name, you were the submitter the day after April Fool's Day), but Ada++ is still not a real language. At best it's a cosmetic (and poorly done) transformation of Ada itself. I mean, this is a code sample from the site:
case Variable:
when 0 => Put_Line ("Zero");
when 1 .. 9 => Put_Line ("Positive Digit");
when 10 | 12 | 14 | 16 | 18 =>
Put_Line ("Even Number between 10 and 18");
when others => Put_Line ("Something else");
}
Note the weird mismatch of the : as the starting delimiter for the block and } for the closing delimiter. Because literally `is` becomes `:` and `end` becomes `}`, and `begin` becomes `{`. Since `case` statements in Ada don't use `begin` but do use `is` you end up with this gross translation.