My Ideal Array Language

(ashermancinelli.com)

83 points | by bobajeff 6 hours ago ago

33 comments

  • adregan 4 hours ago ago

    The author of this post was the guest on the most recent episode of the podcast The Array Cast

    https://www.arraycast.com/episodes/episode111-ideal-array-la...

  • abcd_f 5 hours ago ago

    > User-Extensible Rank Polymorphism

    > IMO this is what makes something an array language.

    Great to hear. So what is it?

    • preommr 4 hours ago ago

      Not op, but I assume it means that there's rank polymorphism (i.e. data can be of arbitrary dimensions, and there's support for things like functions working on both N-dimensions, without having to specify n, or maybe setting constraints on n), and that the polymorphism can be used on the programmer side (so it's not limited to just a handful of language builtins) through the oop equivalent of subclasses and interfaces.

    • djoldman 3 hours ago ago

      The programmer can define functions that operate on matrices without having to be explicit about the number of dimensions and possibly (types of data, size of data, or length).

      Example 1: A function that can take as input a 4x2x8 matrix or a 3x7 matrix.

      Example 2: A function that can take as input a 4x2x8 matrix and a 3x7 matrix and output a third matrix.

      • tomsmeding an hour ago ago

        Rank polymorphism means that a function can be polymorphic in the additional dimensions of arrays. For example, if you write a function that takes a 2x3 and a 4x5 array, it can also work on 10x15x2x3 and 10x15x4x5 arrays by broadcasting.

        If rank polymorphism results in accepting both 4x2x8 and 3x7, then that means the function was a function on elements to begin with. Which is possible, but not the most interesting application of rank polymorphism.

      • almostgotcaught 3 hours ago ago

        > A function that can take as input a 4x2x8 matrix and a 3x7 matrix and output a third matrix.

        which shows that this feature request is complete jibberish

        • rscho 5 minutes ago ago

          Why gibberish ? It's a common feature in both array languages and Iverson ghosts, and many find it extremely useful.

    • CapsAdmin 3 hours ago ago

      game math libraries often have this (and glsl gpu shader language), like "2 * vec3(1,2,3)" results in "vec3(2,4,6)"

      There are other cases like adding vectors to matrices and so on, but in the end this logic is defined in some custom add operator overload on a class or object in the language.

      (I had no idea what it meant either until i searched for examples..)

  • goldenCeasar an hour ago ago

    Funny, on another totally unrelated domain (business logic/rules engines) I was building something very very related - array broadcasting with semantic preservation through arbitrary nesting levels

  • nromiun 4 hours ago ago

      ⊢×0≠∧˝˘∧⌜∧˝           # Marshall & Dzaima (tacit!)
      (≠⥊∧´)˘{×(⌾⍉∧)0≠} # Dzaima & Rampoina
      {×(∧˝˘∧≢⥊∧˝)0≠}     # Dzaima
    
    Call me old fashioned and stuck in C style syntax but I can't imagine anyone describing this as beautiful art.
    • rscho a few seconds ago ago

      This type of syntax allows rapid iteration when looking at different implementations and experimenting with array problems. It should be thought of more as math notation than general programming.

    • mlochbaum 2 hours ago ago

      Well, do you know how it works? Don't judge a book by its cover and all. Although none of these are entirely aiming for elegance. The first is code golf and the other two have some performance hacks that I doubt are even good any more, but replacing ∧≢⥊ with ∧⌜ in the last gets you something decent (personally I'm more in the "utilitarian code is never art" camp, but I'd have no reason to direct that at any specific language).

      The double-struck characters have disappeared from the second and third lines creating a fun puzzle. Original post https://www.ashermancinelli.com/csblog/2022-5-2-BQN-reflecti... has the answers.

    • badlibrarian 3 hours ago ago

      When the junior programmers start saying "Turing complete" or the academics build a DSL in Julia that uses RegEx to parse Logic Symbols and stuffs the result in variables that use ancient characters that don't appear on your keyboard, it's a sure sign of imminent progress. Bonus if the PhD with nine years of schooling and five months of PHP experience at Facebook starts using emoji in commit messages.

      • hinkley an hour ago ago

        “irony! Oh, no, no, we don't get that here. See, uh, people ski topless here while smoking dope, so irony's not really a, a high priority. We haven't had any irony here since about, uh, '83, when I was the only practitioner of it. And I stopped because I was tired of being stared at.”

    • skydhash 2 hours ago ago

      Array Programming is an acquired taste, but once you do, solutions can be extremely simple, both to write and to explain.

      Think about using matrix to describe geometric transformations instead of using standard functions.

    • ashleyn 3 hours ago ago
      • icen 3 hours ago ago

        It is BQN, a descendant language

        • pavlov 2 hours ago ago

          Why is it BQN instead of BQM? Clearly the idea was to increment every letter from APL, but then they had to go one further on the third letter.

          • taolson 15 minutes ago ago

            Supposedly it stands for "Big Questions Notation", but that could just be a backronym.

          • hinkley an hour ago ago

            I’m hoping they pronounce it “beacon” but the off by one error jokes also just write themselves.

            • rscho 4 minutes ago ago

              No, it's 'bacon' :-)

          • ModernMech an hour ago ago

            They were following a Fibonacci sequence.

          • mlochbaum 2 hours ago ago

            It's just. So gross. Say it. Sudden interruption of slime coming up your throat. Like walking out the door into a spiderweb. Alphabetically I was mistaken but in every way that matters I was right.

            • pavlov 2 hours ago ago

              Hmm. I guess it if was BQM, it would be pronounced “bequem” which means comfortable in German.

              And a comfortable APL is clearly an oxymoron.

              • mlochbaum 2 hours ago ago

                Ordinarily I'd make fun of the Germans for giving such an ugly name to a nice concept, but I've always found "comfortable" to be rather unpleasant too (the root "comfort" is fine).

    • hyperbrainer 3 hours ago ago

      I see it as beautiful the same way Galadriel would be beautiful as the Dark Queen. Utterly captivating and powerful, and yet something that should never be.

  • hinkley an hour ago ago

    You explain the evolution of CPUs but then don’t explain Rank Polymorphism.

    • jph00 an hour ago ago

      "Rank" means the number of dimensions of an array.

      So "rank polymorphism" means being able to write expressions that work correctly regardless of how many dims the arrays involved have.

      For example, in numpy you can write a function that handles both lists and matrices automatically, by taking advantage of broadcasting. (The J language takes this idea a lot further -- numpy is a fairly minimal implementation of the idea.)

    • IncreasePosts an hour ago ago

      It's just like polymorphism, only stinkier

  • rramadass 3 hours ago ago

    A previous relevant discussion since there is so little on Array Languages - https://news.ycombinator.com/item?id=38981639

  • teleforce 4 hours ago ago

    Dlang does not has rank polymorphism and it handle array just fine with crazy speed in both compilation and execution.

    It can be faster than Fortran based library that is still being used by Matlab, Rust and Julia [1].

    It will be interesting to compare Mojo moblas BLAS library with GLAS library performance in D.

    [1] Numeric age for D: Mir GLAS is faster than OpenBLAS and Eigen (2016):

    http://blog.mir.dlang.io/glas/benchmark/openblas/2016/09/23/...

    • cdavid 4 hours ago ago

      If I understand correctly what is meant by rank polymorphism, it is not just about speed, but about ergonomics.

      Taking examples I am familiar w/, it is key that you can add a scalar 1 to a rank 2 array in numpy/matllab without having to explicitly create a rank 2 array of 1s, and numpy somehow generalizes that (broadcasting). I understand other array programming languages have more advanced/generic versions of broadcasting, but I am not super familiar w/ them