A few days ago I wrote about adding a factorial operator to my assembler [1], and I noted that I knew not of any other languages that had such a feature. So imagine my surprise as I'm reading about XL (eXtensible Language) [2] (via Lobsters [3]) and the second example is factorial [4]! Not only that, but that was an example of extending the language itself! The last time I was this excited about software was reading about Synthesis OS (Operating System) [5], a JIT (Just-In-Time)-based operating system where you could create your own system calls [6].
How it handles precedence is interesting. In my assembler [7], I have left or right associativity as an explicit field [8], whereas in XL, it's encoded in the precedence level itself [9]—even if its left, odd if its right. I'm not sure how I feel about that. On the one hand it feels nice and it's one less field to carry around; on the other, being explicit as I did makes it clear if something is left or right. But on the gripping hand, it sounds like matching precedence on a left and right operator could lead to problems, so I still may have an explicitness problem.
But I digress.
It's a very simple language with only one keyword “is” and a user-definable precedence table. The parser generates a parse tree of only eight types, four leaf nodes (integer, real, text, name (or symbol)) and four non-leaf nodes (prefix, infix, postfix and block). And from there, you get XL.
This is something I definitely want to look into [10].
[2] https://xlr.sourceforge.io/
[3] https://lobste.rs/s/zu2wx1/xl_extensible_programming_language
[4] https://xlr.sourceforge.io/#factorial
[5] https://web.archive.org/web/20080318162920/http://valhenson.org/synthesis/SynthesisOS/abs.html
[6] https://en.wikipedia.org/wiki/Self-modifying_code#Synthesis
[7] https://github.com/spc476/a09
[8] https://github.com/spc476/a09/blob/main/expr.c#L337
[9] https://xlr.sourceforge.io/#operator-precedence-and-associativity