\

Mastering Dyalog APL

112 points - today at 11:42 AM

Source
  • gobdovan

    today at 2:46 PM

    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.

      • shrubble

        today at 8:14 PM

        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…

        • tosh

          today at 4:38 PM

          > 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)

            • gobdovan

              today at 7:26 PM

              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'.

                • tosh

                  today at 7:48 PM

                  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

                    • gobdovan

                      today at 8:08 PM

                      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.

          • blowscum

            today at 3:45 PM

            > 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.

              • chillpenguin

                today at 4:23 PM

                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.

            • tosh

              today at 7:57 PM

              related: blog post on fast primes in BQN

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

              • adamgordonbell

                today at 3:15 PM

                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

                • floxy

                  today at 3:17 PM

                  https://lamport.azurewebsites.net/tla/tla.html ?

            • skruger

              today at 3:19 PM

              A more concise intro to APL for the modern era: https://xpqz.github.io/learnapl

              (author)

              • xvilka

                today at 7:37 PM

                In the modern world there is no place for the commercial compiler. They should have made it free (and open source) and only IDE (maybe) paid one. Even better - push into GCC or LLVM.

                  • gucci-on-fleek

                    today at 7:43 PM

                    I agree with you in principal, but I don't think that that's realistic at all, since that would completely destroy Dyalog's entire business model. I personally have little interest in learning a non-FOSS programming language, but Dyalog's paying customers are clearly okay with it, so I see little reason for them to change.

                    • radiator

                      today at 7:43 PM

                      But why? Commercial APL implementations have existed since decades ago. They always had customers. They were always at least partly owned by employees. Dyalog was not created in a void, but continuing this tradition.

                      • tosh

                        today at 7:51 PM

                        fwiw Dyalog APL is free for non-commercial use:

                        https://www.dyalog.com/prices-and-licences.htm

                    • meken

                      today at 2:42 PM

                      I had a little excursion into Dyalog APL recently and wound up writing an emacs mode to evaluate Dyalog APL [1]. It was a pretty nice experience using Claude to extract the small subset of features I wanted from gnu-apl-mode [2] to work with Dyalog APL.

                      I’d really like to properly get into APL though. My plan is to solve a bunch of problems on Kattis [3].

                      I'm really enjoying this way of learning a new language in the age of LLMs - starting with easy problems on an online code judge website and work with an LLM to come up with/explain simple solutions. It gives me dopamine hits, lots of reps, allows me to start coding right away, and is a nice way to slowly ramp up difficulty and get practice with different features of the language.

                      [1] https://github.com/ebanner/dyalog-mode

                      [2] https://github.com/lokedhs/gnu-apl-mode

                      [3] https://open.kattis.com

                      • raghavchamadiya

                        today at 12:42 PM

                        Nice to see this getting the Jupyter Notebook treatment. The original book was already one of the better introductions to APL. Interactive examples make a huge difference for a language where half the learning curve is just building muscle memory with the symbols

                        • twoodfin

                          today at 2:36 PM

                          For those like me who prefer a PDF:

                          https://www.dyalog.com/uploads/documents/MasteringDyalogAPL....

                          • pjmlp

                            today at 12:54 PM

                            I have no use for APL, yet this looks like a great bookmark for rainy days.

                            • Pay08

                              today at 2:37 PM

                              How useful would learning APL be for writing less strictly array-based languages like Matlab?

                                • gobdovan

                                  today at 2:54 PM

                                  Given you could even use it commercially (it requires an enterprise license, but I suppose Matlab does too), moderately useful conceptually, weakly useful mechanically. APL is very limited in what offers you. I did a ML course in Matlab a while ago and I remember I could scalar loops and procedural scripts, had nice tables and object-ike structures. You'd give that all up in APL so it wouldn't help you there, but you'd see how far you can get only with creative 'array language semantics'.

                                    • lokedhs

                                      today at 3:16 PM

                                      Dyalog APL, along with other modern array languages that are related to it can all do imperative programming with loops etc.

                                      There are certainly valid arguments that you hive certain things up when moving to an array language, but loops are not one of those.

                                      That said, you won't use loops as much, but that's not because loops are not available.

                              • UltraSane

                                today at 1:07 PM

                                I really wish learning this had a positive RoI

                                  • skruger

                                    today at 3:30 PM

                                    It has a huge RoI, even if you never use it in anger. It’s a bit like Lisp in that regard — it shapes your thinking.

                                    • robomartin

                                      today at 2:01 PM

                                      It does, over time. It changes the way you think about computational problem solving. It's like the difference between designing objects in 2D on a drafting table and moving to 3D CAD. It changes your brain visualizes, explores and solves problems.

                                      That said, learning APL isn't about learning the symbols any more than learning mathematics is not about learning the meaning of the various symbols it uses. To continue with that parallel, it also isn't about memorizing formulas. It is about using the tools to solve problems and, over time, changing the way you solve problems...now in 3D.

                                      I learned APL in the early 80's and used it professionally for about ten years. The way I think of solving problems is fundamentally different in many ways because of this experience.