At long last, my subterranean labors have come to fruition, and it is time to emerge from my cave, blinking in the searing light of the daystar, and trumpet the public release of Decker, a HyperCard-inspired pixel-perfect holistic programming environment. In my famously unbiased opinion, one of Decker’s juiciest morsels is Lil, the scripting language which serves as a substitute for HyperTalk. At first blush, Lil is almost unbearably unassuming:
on lies x do if x > 1 lies[x-1]+lies[x-2] else x end end
Don’t be deceived by initial appearances, dear reader: beneath its Lua-skin suit, Lil blisters and oozes with a remarkable and innovative collection of Bad Ideas. For example,
JSON can’t represent NaN or Infinities, so Lil can’t represent them in its numbers, either. Simple! If you wanted to do serious numerical work in Lil, you’re even crazier than I am.
Absolutely no Unicode support. Hell, Lil strings aren’t even capable of representing the full range of ASCII control characters. The hoary tabs-versus-spaces debate is deftly resolved by Lil and Decker having absolutely no idea what a tab is, or how to make one. I might consider adding EBCDIC support, for a terrible price…
Absolutely no runtime errors. Except for, y’know, the kind that are caused by interpreter bugs, the host OS, sunspot activity, or a general malaise. Lil has excruciatingly straightforward control flow and operates upon the highly dubious yet daring, even brave, premise that any consistent behavior at runtime is conceivably more useful than a crash. You can thank me later.
Uniform operator precedence. PEMDAS be damned, I say- expressions evaluate right-to-left unless acted upon by parentheses or brackets. Not only does this cruelly throw your middle-school math textbooks directly into the trash, it robs the implementer of the language of any excuse to shoehorn Dijkstra’s shunting-yard algorithm into their hobbycraft. Alas.
A mushy, coercion-happy closed type system that generally aims at that lofty and deeply problematic goal of “doing the right thing” and generalizing operations over all reasonable datatypes. With indexing and application fused together into a uniform syntax, what possibly could
foo.bar[zami]:quux represent? Does it result in a local assignment? Runtime only knows!
Have we scared all the PLT weenies off yet? Alright, then- let’s look at some of the Good Ideas, too:
sound[16*sin(440/8000)*2*pi*range 8000] on oval pos size do flip pos+size*flip unit 2*pi*(range 20)/20 end
on mode a do extract first key orderby value desc from select key:first value value:count value by value from a end
Lil is easy to learn, and easier to forget. It provides boons and flaws in equal measure. It’s got moxie. Personality. Curb appeal. Favorable zoning. Good fixer-upper. Excellent freeway access and local elementary schools. You can love it, or simply not notice it’s there.
Even among those who will use Decker, I imagine many Lil scripts will never grow more complex than:
on click do score.value:score.value-10 play["fart noise"] end
Nonetheless, should users ever desire more of this curious, humble language, I believe they will find it- whatever, precisely it may be- in abundance. Happy Lil-ing, Lilateers1.
Yes, that‘s canon. That’s what a Lil programmer is officially called. Accept no substitutions. ↩︎