News for hackers. Stuff that matters.
Re:Mastering Dyalog APL by gobdovan on Sunday May 24, 2026 @10:46AM (#48257679)
It always felt strange to me that the main implementation of something as niche and esolang-adjacent as APL is neither OSS nor casually usable commercially, but instead comes under an enterprise license.

Anyway, I had a fun time a while ago translating APL programs to NumPy. At some point you get what APL is all about, and you can move on with life without too many regrets. Turns out most of the time it's more like a puzzle to get an (often inefficient) terse implementation by torturing some linear algebra operators.

If you're after a language that's OSS, has terse notation, and rewires your brain by helping you think more clearly instead of puzzle-solving, TLA+ is the answer.

Edit: if you're curious to see at a glance what APL is all about:

APL code:

(2=+⌿0=∘.|⍨⍳N)/⍳N <- this computes primes up to N and is presented as the 'Hello world' of APL.

Equivalent NUMPY code:

```

R = np.arange(1, N + 1) # ⍳N

divides = (R[None, :] % R[:, None]) == 0 # 0=∘.|⍨⍳N

divisor_counts = divides.sum(axis=0) # +⌿

result = R[divisor_counts == 2] # (2=...)/⍳N

```

As you can see, the famous prime generator is not even the Eratostenes' sieve, but a simple N^2 divisor counting computation.

Re:Mastering Dyalog APL by blowscum on Sunday May 24, 2026 @11:45AM (#48258214)
> At some point you get what APL is all about, and you can move on with life without too many regrets.

Honestly this is how computers/software/programming feel in general these days and it’s ruined it all for me.

Re:Mastering Dyalog APL by chillpenguin on Sunday May 24, 2026 @12:23PM (#48258583)
I basically feel the same way. In a way it is very liberating. All of those esoteric languages that were on my ever-growing todo list are now things I can let go of. Ultimately we have to ask ourselves how we want to spend our time, and now it is much harder to justify spending countless hours studying one programming language after another. We still can, of course, but we are now more "free" to do other things instead.

It's sort of sad, but really I think it is a weight off my shoulders.

Re:Mastering Dyalog APL by adamgordonbell on Sunday May 24, 2026 @11:15AM (#48257925)
BQN exists and needs more attention I think. It has some modern affordances as well.

https://github.com/mlochbaum/BQN

https://mlochbaum.github.io/BQN/doc/quick.html

Re:Mastering Dyalog APL by floxy on Sunday May 24, 2026 @11:17AM (#48257947)
Re:Mastering Dyalog APL by gobdovan on Sunday May 24, 2026 @11:33AM (#48258093)
Yes! I put together some explanation and TLA+ related resources in this comment, the website is one of them: https://news.ycombinator.com/item?id=48075169
Re:Mastering Dyalog APL by tosh on Sunday May 24, 2026 @12:38PM (#48258766)
> Turns out most of the time it's more like a puzzle to get an (often inefficient) terse implementation by torturing some linear algebra operators.

solutions in APL can be very efficient if they are written in a machine sympathetic way

or in cases where the interpreter can map them onto one

for the curious:

https://aplwiki.com/wiki/Performance

https://www.youtube.com/watch?v=-6no6N3i9Tg (The Interpretive Advantage)

https://ummaycoc.github.io/wc.apl/ (Beating C with Dyalog APL: wc)

Re:Mastering Dyalog APL by gobdovan on Sunday May 24, 2026 @03:26PM (#48260255)
Thanks for the response. I'd interpret it as a valid technical caveat, but it feels somewhat orthogonal to what I was pointing out.

You focus on the 'often inefficient' parenthetical, yet, to me, your response highlights the puzzle nature of the thinking APL encourages. If anything, it shifts the question from 'how do I express this tersely' to a still narrower 'how do I express this tersely in a way the interpreter can also optimize'.

Re:Mastering Dyalog APL by tosh on Sunday May 24, 2026 @03:48PM (#48260413)
I think every programming language to a degree has some kind of puzzle aspect

I'm not sure APL has more or less of it compared to other languages

for example in Python, even though the language has a concept of "There should be one-- and preferably only one --obvious way" (PEP 20) it is quite multi paradigm, which I think is a strength of Python

oop, functional, imperative, …

and you get tons of libraries to choose from

e.g. numpy, pandas, polars, pytorch, keras, jax, … etc

but you still also have to figure out the algorithm and data structures you want to use (like in any language)

and you also kinda want to know (if you care about performance) how pytorch differs from numpy and how that differs from using a list with boxed values

Not saying this is not the case with APL

it definitely helps if you are familiar with the APL implementation you're using if you care about performance

I just don't think it's a disadvantage of APL over other languages

Re:Mastering Dyalog APL by gobdovan on Sunday May 24, 2026 @04:08PM (#48260584)
Agreed. I think I shouldn't put hard boxes around languages like 'puzzle language' vs 'abstraction/clear thinking language'.

What I was trying to point at was more specific: the way I experience APL thinking tends toward 'expression search' and 'notation compression', which feels, to me at least, somewhat at odds with clarity about the underlying problem. More often than not, I seemed to produce an APL-shaped model of the problem rather than a problem-shaped model expressed in a language.

When I first learned about APL, I was looking for new ways to think about computation. What I found was a language that rewarded deciphering APL programs and generating clever new ones. That is interesting and beautiful, but it was not quite the kind of brain-rewiring I was looking for. My original comment was targeting people in a position similar to mine and trying to set expectations about what they would learn best from APL. APL may change how you think about array expressions and how far they can go, but TLA+ is much closer to what I'd recommend if what you want is clearer thinking about programs, systems and state.

Re:Mastering Dyalog APL by tosh on Sunday May 24, 2026 @04:24PM (#48260703)
ty for the pointer to TLA+
Re:Mastering Dyalog APL by tosh on Sunday May 24, 2026 @03:57PM (#48260500)
related: blog post on fast primes in BQN

https://panadestein.github.io/blog/posts/ps.html

Re:Mastering Dyalog APL by shrubble on Sunday May 24, 2026 @04:14PM (#48260632)
It’s not truly fair to call it an esolang given that it was used by mainframe customers for decades. It’s more like a less popular product than COBOL…
Re:Mastering Dyalog APL by wwweston on Sunday May 24, 2026 @04:36PM (#48260772)
> Turns out most of the time it's more like a puzzle to get an (often inefficient) terse implementation by torturing some linear algebra operators.

In vector function space, no one can hear your eigen-scream.

Re:Mastering Dyalog APL by userbinator on Sunday May 24, 2026 @05:03PM (#48260970)
but instead comes under an enterprise license.

The reason for this is because APL is quite popular in fintech, and of course that industry has no qualms about things not being free.

Re:Mastering Dyalog APL by xelxebar on Sunday May 24, 2026 @06:14PM (#48261551)
> At some point you get what APL is all about, and you can move on with life without too many regrets.

Unfortunately, this seems to be a common experience. A lot of smart people only engage with APL via toy puzzles, like you did, and bounce off because that gives no insight about how to use the language in real life. IME, to really start getting APL you need to write and rewrite a full application 20 times.

It helps to read code from the masters, too [0, 1, 2, 3, 4]. These all approach architecture in different ways: pedagogical FP style, OOP heavy, data-oriented design, event-driven state-machine, or a mix of the above.

[0]:https://dfns.dyalog.com/

[1]:https://github.com/Co-dfns/MicroUI-APL

[2]:https://github.com/Dyalog/ewc

[3]:https://github.com/Co-dfns/Co-dfns

[4]:https://github.com/Dyalog/Jarvis/blob/master/Source/Jarvis.d...

> As you can see, the famous prime generator is not even the Eratostenes' sieve, but a simple N^2 divisor counting computation.

Well, that's because you wrote a divisor function, not a seive. Arguably, the ease of typing an outer product (i.e ∘.|⍨⍳N) can tempt us into writing quadratic algorithms unnecessarily, but this is just an experience issue, IMO.

If we want a seive, we can just write one directly:

    p⊣{ω~n×1+⍳⌊N÷p⍪←n←ω↑⍨1⌊≢ω}⍣≡1↓1+⍳N⊣p←⍬
The algorithm is O(N log log N) as expected of a naive Eratosthenes implementation. You'll need ⎕IO←0 if you want to try it out.

There's also a faster seive by Roger Hui [0] in the dfns workspace as well as a family of prime number functions [1] for things more than just prime generation.

[0]:https://dfns.dyalog.com/n_sieve.htm

[1]:https://dfns.dyalog.com/n_pco.htm

Re:Mastering Dyalog APL by mlochbaum on Sunday May 24, 2026 @07:51PM (#48262202)
That's not O(N log log N), it's more like (edit) N^(3/2). Prime sieves are hard to implement well with immutable arrays for obvious reasons; there are some cool methods but they're definitely harder. I'm ashamed to be part of a community that won't cop to this.

The algorithm iterates over numbers ⍺ from 2 to N, removing the multiples that are greater than ⍺ and no greater than N from p. If the removal with ~ has to inspect all of p, then all the primes are there so we have asymptotically at least N/log N entries by the prime number theorem and we get N^2/log N time (when ⍺ is over N/2, no multiples are in range so this can be skipped, but that just cuts a constant factor 2 from the time). Conceivably p could be marked sorted, so the entries to remove could be found with a binary search. This is a bit harder to analyze, but I think each prime under √N will cause the list to change, and incur N/log N data movement. So you get at least (N/log N)^(3/2) cost, still quite a bit worse than linear.

Edit: changed the algorithm while I was writing... the new one is better, it keeps one list p of primes and one list ω of not-yet-marked-out numbers. However, for the first √N primes generated, ω changes, and it contains at least N/log N - √N/log√N primes, where the √ part drops out because it's asymptotically small. You end up with at least (N/log N)^(3/2) cost again. Mutating a bit array in place is pretty important to classical sieve performance.

Re:Mastering Dyalog APL by mlochbaum on Sunday May 24, 2026 @08:49PM (#48262490)
It's possible to get O(N^(3/2)/log N) in an ordinary interpreter with some changes to the code, assuming linear-time ~ with hashing. The idea is to leave the primes in ⍵ and stop when it stops changing, which will happen at the first prime over √N. To get the complexity multiply by O(N) for each step. It's also a small change to get the multiples to remove to start at n×n instead of n.

    i←¯1⋄{⍵~n×n↓⍳1+⌊N÷n←i⊃⍵⊣i+←1}⍣≡1↓1+⍳N
I think this is about as good as can be done with ~ instead of marking out bits. And I wouldn't say it's as easy as the imperative version!
Re:Mastering Dyalog APL by xelxebar on Tuesday May 26, 2026 @02:46AM (#48275960)
Eep. You're right. Evidently, I didn't even know what a sieve was in this context and wrote a search instead. You got me to do a bit of research. Actually, this discussion is exactly where I think APL shows one of it's strengths. It feels like a human communication tool more than any other PL I've mucked about with. The hard parts here are not language issues but fundamental understanding ones.

It's a tad tricky to carefully analyze the asymptotics of my above prime generator, since the search space of Without (~) shrinks on each iteration. I think Merten's theorem gives an estimate of e^-γ/log(p_i), which we need to sum for all primes up to N. Taking prime density 1/log(n) and integrating N/(log x)^2 over our range is O(N^2/log N), I think.

> Mutating a bit array in place is pretty important to classical sieve performance.

Challenge accepted:

    p⊣{x[⍵+n×⍳⌊N÷n←p⍪←x[⍵]]←0 ⋄ 1+⍣{(x⍪1)[⍵+1]≠0}⊢⍵}⍣{⍵=N-2}0⊣x p←(1↓1+⍳N)⍬
We just directly set roughly N/p items to 0 on each iteration—proper sieve semantics—which should give O(N log log N), unless I'm missing something.
Re:Mastering Dyalog APL by ofalkaed on Sunday May 24, 2026 @07:05PM (#48261901)
>A lot of smart people only engage with APL via toy puzzles

I think part of this is because that is how most (possibly all) sources teach APL and array languages, solving puzzles and manipulating arrays. If you learn to write programs in an Algol derived language, you can write programs in most common languages without having to learn how to write programs, you just need to learn the language. Modern array languages sort of allow us to use them like the Algol derived languages, but this does not seem to work out so well and often does not work to the strengths of array languages.

Re:Mastering Dyalog APL by fnord77 on Sunday May 24, 2026 @07:46PM (#48262167)
> If you're after a language that's OSS, has terse notation, and rewires your brain by helping you think more clearly

I found MATLAB/Octave was good

Matrix conjugate transpose:

    H = A';
Re:Mastering Dyalog APL by zerr on Monday May 25, 2026 @05:47AM (#48265077)
Is it evaluated lazily? How about APL?