Hacker News new | ask | show | jobs
by pault 1801 days ago
This is my first encounter with K, and it looks absolutely bonkers. The amount of logic you can express in a few characters is mind boggling. However, it makes my brain hurt. Is this a paradigm that becomes intuitive once you learn it, or is it like Ruby in the sense that it’s so flexible that every developer uses their own custom DSL and onboarding is like solving an infinite series of brain teasers?
4 comments

It becomes intuitive. APL primitives are particular instantiations of clean high-level concepts. While a C programmer would think "I'll make a sparse encoding of this boolean array" a K programmer would just write Where. Having a rigorous definition for a pattern like this is a nice guide for the intuition, but it's possible to get in a situation where what you want to do and what the language provides don't line up. And there are domains like graph algorithms that largely don't fit into an array style. For these you'd have to fall back to writing scalar-style code.

There's not much of a custom DSL problem, because APL/K emphasize using the primitives that are built in, and user-defined functions will have names not symbols. Some codebases will be a challenge to read because these languages tend to attract programmers who write things their own way, and for K in particular many users—the inventor Arthur Whitney most of all—don't like to write long explanations of how their code works. The OP, while well explained, is pretty advanced material. Knowing a lot about array programming makes the high-level picture clear but I would say many of the code examples would take some effort for even a good array programmer to understand.

The high level description sounds a bit like Clojure...? Both sound very tied to the datastructures and built in algorithms provided. As long as your problem maps well to the built in tool it's very terse (in a very good way!). I find this makes coding much more productive. Most languages avoid committing that way

Would be curious to hear from someone's that's used both

Yeah, I've not used lisps much myself but it's definitely similar. See https://kparc.com/lisp.txt.

The quote by Alan Perlis, 'It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.' is also relevant to both lisp dialects and array languages.

Oh, of course. Lisp is maybe a more natural analogue.

I guess Clojure takes things a step further. It goes from "everything is a list" to something slightly broader with Vectors/Maps/Sets/etc. - all through language primitives. (the algorithmic layer is cleverly done through the sequence abstraction)

Coming from C++, in effect having your STL containers/algos baked into the language is a breath of fresh air :)

Good maps + sets + other data structures is definitely something that I miss occasionally in array languages. I should look into Clojure more, I've heard lots of good things about it.
Once you look at the verbs as symbols for algorithms, it will make much more sense. Most languages make you create algorithms. k code is the composition of algorithms.
It's unfamiliar, but highly learnable. The problem solving style can then be applied elsewhere to great effect.

If anything, K is the opposite of a language where everyone disappears into DSLs- you can write expressive code without wrapping it in custom abstractions. An anti-lisp, if you will. It's not uncommon for K programmers playing with a puzzle to independently arrive at character-for-character identical solutions.

That's great to hear. I am always interested in learning new languages that are vastly different to mainstream languages to see if there are any hidden gems that I can incorporate into my day job.
The only real disadvantage is finding yourself annoyed by obvious absences in the standard libraries of every non-APL-family language you come across.

"ugh why can't this sort() just give me a grade instead?"

"why does this provide reduce(), but no scan?"

"this would be so much cleaner if I had transpose, or even just laminate..."

from my small experience with K and its links with APL would imagine that it becomes intuitive once learnt.

Don't know DSL ability, though aware someone wrote expanders from symbols to words, - imagine DSL doable but forth, lisp macros spring to mind first in the DSL space