7,325 karma · joined February 13, 2010
"drunk driving may kill a lot of people, but it also helps a lot of people get to work on time, so, it;s impossible to say if its bad or not,"
docs/demos: https://beyondloom.com/decker/pdf.html
browsable source: https://github.com/JohnEarnest/Decker/blob/main/examples/dec...
There's also quite a bit of novel functionality, like easy mechanisms for defining new brushes, new transitional visual effects, and even custom "widgets". Decker has grids and a SQL-like query language for working with bulk data, and a growing ecosystem of libraries and tools. Development is ongoing! The scripting language, Lil, is deliberately unlike HyperTalk, but tries to thread the needle between offering accessibility to beginners and power tools to experts. (It's secretly in the APL family.)
If you give it a chance, I hope you'll find that Decker is much more than a superficial imitation of HyperCard's look and feel.
This is a profound misapprehension of the nature of language design. Languages exist within contexts, and embody tradeoffs. It is possible- common, even- to fully grasp the capabilities of a language like lisp and still find it inappropriate or undesirable for a given task. Pick any given context- safety-critical medical applications, constrained programming for microcontrollers or GPUs, livecoding environments where saving keystrokes is king- and you can find specialized languages with novel tools, execution models, and affordances. Perhaps it never crossed Paul Graham's mind that lisp itself might be a "blub" to others, in other situations.
The idea of a linear hierarchy in languages is the true flatlander mindset.
> Turtle (noun): any of an order (Testudines synonym Chelonia) of terrestrial, freshwater, and marine reptiles that have a toothless horny beak and a shell of bony dermal plates usually covered with horny shields enclosing the trunk and into which the head, limbs, and tail usually may be withdrawn.
I suspect that in the fullness of time, mainstream languages will eventually fully incorporate tabular programming in much the same way they have slowly absorbed a variety of idioms traditionally seen as part of functional programming, like map/filter/reduce on collections.
[0] https://en.wikipedia.org/wiki/Q_(programming_language_from_K...
[1] https://ryelang.org/blog/posts/comparing_tables_to_python/
AWK scripts don't have any kind of dependency management features, so they naturally lend themselves toward being freestanding and self-contained. Perl, on the other hand, has a massive package ecosystem with transitive dependencies and widely varied quality and design aesthetic, amplified by the baroque design of the language. AWK is as close as a language can be to immune to dependency hell.
When Perl was new, perhaps many people saw it as "a better AWK", but I suspect most of the newcomers to AWK today don't see it in relation to Perl at all.
oK is a slow browser-based FOSS implementation of k6, with fun bells and whistles like "iKe", a visual livecoding environment. ngn/k and oK have diverged a bit, but are largely similar: https://github.com/JohnEarnest/ok
Q is a K-derived language built into kdb+; this is probably the most commercially viable dialect to learn, with the best educational materials (I recommend Nick Psaris' Q Tips), but it is proprietary, with (last I checked) free licenses available for personal use.
If you've seen Decker you may also have been exposed to Lil, which is similar in many ways to Q. It is more verbose and less expressive than Q or K, but I've generally heard people say they find it comparatively accessible: http://beyondloom.com/tools/trylil.html
I've never found it hard to come back to reading K after long absences, in no small part because the set of primitives in K is a small fraction of the set in J (or uiua) and the notation, while terse, is more suggestive and legible to me than J's emphasis on digraphs and forks, or the "unicode-soup" of mismatched characters that some modern APL descendants reach for. K is an equally excellent notation for experimenting in a REPL or discussing ideas on a whiteboard.
less important things can have longer names. variables in a broader scope can have longer names.
if you have a hundred different vectors, don't just dump them in a pile; put them in dictionaries, tables, namespaces, or scopes.
t=\:t:!xLet your kid call a crude simulacrum of dead relatives, let religious folks call a crude simulacrum of $DEITY, make an "adult" version that crudely simulates a phone-sex hotline (charge extra to recharge the minutes on that one obviously), etc, etc.
i:"%j" parse shell["curl -s https://api.weather.gov/gridpoints/BOU/63,62/forecast"].out
t:i.properties.periods..temperature
o.average:(sum t)/count t
o.minimum:min t
o.maximum:max t
show[o]
Lil doesn't have implicit parsing of .json arguments like Blots- certainly a nice feature for the niche Blots is aimed at. Lil also doesn't have an arithmetic average as a builtin like Blots, but in this case it's easy enough to do without.The biggest difference here is how Lil handles indexing: The ".." in that second line can be read as "for every index"; a wildcard. I can follow the mapping that occurs in Blots' "via" expression, but I find it less clear in this example.
It can also be nice to treat lists-of-objects as proper SQL-like tables:
select number name temperature windSpeed from table i.properties.periods
+--------+-------------------+-------------+---------------+
| number | name | temperature | windSpeed |
+--------+-------------------+-------------+---------------+
| 1 | "This Afternoon" | 54 | "14 mph" |
| 2 | "Tonight" | 46 | "3 to 12 mph" |
| 3 | "Wednesday" | 69 | "5 mph" |
| 4 | "Wednesday Night" | 45 | "3 mph" |
| 5 | "Thursday" | 79 | "5 mph" |
| 6 | "Thursday Night" | 49 | "5 mph" |
| 7 | "Friday" | 83 | "2 to 6 mph" |
| 8 | "Friday Night" | 52 | "6 mph" |
| 9 | "Saturday" | 81 | "3 to 8 mph" |
| 10 | "Saturday Night" | 53 | "3 to 8 mph" |
| 11 | "Sunday" | 81 | "3 to 7 mph" |
| 12 | "Sunday Night" | 54 | "3 to 7 mph" |
| 13 | "Monday" | 77 | "3 to 7 mph" |
| 14 | "Monday Night" | 53 | "3 to 7 mph" |
+--------+-------------------+-------------+---------------+
I hope you continue to tinker and evolve Blots; a personal scripting language guided by the use-cases you encounter naturally can be very rewarding and useful.