Hacker News new | ask | show | jobs
by mlochbaum 1801 days ago
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.

1 comments

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.