7 ms·
My Ideal Array Language
- abcd_f 1y ago> User-Extensible Rank Polymorphism > IMO this is what makes something an array language. Great to hear. So what is it?
- preommr 1y agoNot 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.
- goldenCeasar 1y agoA question, would you interpret this as rank polymorphism? schema do input do array :regions do float :tax_rate array :offices do float :col_adjustment array :employees do float :salary float :rating end end end end trait :high_performer, input.regions.offices.employees.rating > 4.5 value :bonus do on high_performer, input.regions.offices.employees.salary * 0.25 base input.regions.offices.employees.salary * 0.10 end value :final_pay, (input.regions.offices.employees.salary + bonus * input.regions.offices.col_adjustment) * (1 - input.regions.tax_rate) end result = schema.from(nested_data)[:final_pay] # => [[[91_000, 63_700], [58_500]], [[71_225]]]
- CraigJPerry 1y agoI think i'm misunderstanding, rank is explicit throughout this example but i'm not familiar with this syntax (ruby maybe?) but whatever the case i don't see the rank polymorphism. If i'm reading the syntax correctly, this would translate in kdb/q to a raze (flatten) on the 3 dimensions (regions, offices, employees). Probably more likely to be expressed as a converge but in either case, the calculations here are not possible in a rank polymorphic way.
- goldenCeasar 1y agoThe broadcasting handles the rank differences automatically. When bonus (at employee level) multiplies with col_adjustment (at office level), each employee's bonus gets their office's adjustment applied, no flattening or manual reshaping. The structure [[[91_000, 63_700], [58_500]], [[71_225]]] was preserved. This is from a Ruby DSL I'm working on (Kumi). Probably the broadcasting semantics are very different from traditional rank operators in q/APL? Edit: I realized that I missed the input structure: Region 0: Office 0 has 2 employees, Office 1 has 1 employee Region 1: Office 0 has 1 employee
- CraigJPerry 1y agoJust had a quick browse of the kumi readme - very cool, i like it
- goldenCeasar 1y agoThat means a lot, thanks!
- npalli 1y agoI didn't downvote but was utterly puzzled with your example. After your response below, it occurs to me that you are confusing Employee rank (a business concept) with Array rank a mathematical concept. Either that or it is very strange explanation for rank polymorphism.
- djoldman 1y agoThe 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.
- almostgotcaught 1y 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 1y agoWhy gibberish ? It's a common feature in both array languages and Iverson ghosts, and many find it extremely useful.
- tracker1 1y agoYou mean like a "winner" function able to check for both Tic-Tac-Toe, a Connect Four field and a Similar 3D+ tower game?
- taeric 1y agoI'm not sure I follow? The "winning" condition is different in all of those examples?
- tracker1 1y agoX adjacent cell values in an N dimensional array? For tic tac toe, it's 3 in a row, for connect 4 it's 4 in a row.
- taeric 1y agoFair enough, I guess. The "available moves" would be dramatically different, such that I'm not clear I see much of a win on this reuse. But, yeah, fair enough.
- CapsAdmin 1y agogame 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..)
- deleted 1y ago[deleted]
- cl3misch 1y agoI wondered the same. Similarly I wish the author had provided examples for statements like > Numpy also needs to be paired with a JIT compiler to make python a real array language
- adregan 1y agoThe 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-language https://www.arraycast.com/episodes/episode111-ideal-array-la...
- teleforce 1y agoDlang 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/glas-gemm-benchmark.html http://blog.mir.dlang.io/glas/benchmark/openblas/2016/09/23/...
- cdavid 1y agoIf 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
- pjmlp 1y agoUnfortunely, while the community is great, what it doesn't have is a direction, thus keeps pivoting every couple of years, and with that lost the adoption opportunity window it had a decade ago.
- teleforce 1y agoForm is temporary, class is permanent.
- nromiun 1y 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.
- hyperbrainer 1y agoI 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.
- KineticLensman 1y ago"All shall love me and despair"
- badlibrarian 1y agoWhen 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 1y 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.”
- ashleyn 1y agoIt's giving APL: https://en.wikipedia.org/wiki/APL_(programming_language) https://en.wikipedia.org/wiki/APL_(programming_language)
- deleted 1y ago[deleted]
- rramadass 1y agoA previous relevant discussion since there is so little on Array Languages - https://news.ycombinator.com/item?id=38981639 https://news.ycombinator.com/item?id=38981639
- goldenCeasar 1y agoFunny, 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
- hinkley 1y agoYou explain the evolution of CPUs but then don’t explain Rank Polymorphism.
- IncreasePosts 1y agoIt's just like polymorphism, only stinkier
- jph00 1y 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.)
- hinkley 1y agoThat just sounds like someone needing to feel smarter than 'multidimensional arrays' sounds. Which if you ask the average unskilled laborer, already sounds pretty damned fancy.
- diziet_sma 1y agoIt's not the same thing as multidimensional arrays though. You can have multidimensional arrays without rank polymorphism. Rank polymorphism makes working with multidimensional arrays much easier because you can write one function which works over input arrays with different shapes.
- npalli 1y agoStrange to read this article and find no mention of Julia (but APL, Mojo, MLIR BQN etc.. which are not exactly widely used languages). It checks many of the boxes User-Extensible Rank Polymorphism is just beautiful with the broadcast dot syntax. I don't think any other language has this clean and flexible implementation. Others -- GPU programing, parallelism, etc. are pretty good with Julia. Real shame it hasn't taken off.
- capyba 1y agoI love working in Julia, it makes clean numerical code so easy to write.
- deleted 1y ago[deleted]
- slwvx 1y ago> User-Extensible Rank Polymorphism is just beautiful with the broadcast dot syntax ... Just to be clear, I guess that Julia's broadcast (dot) syntax is an implementation of "User-Extensible Rank Polymorphism"; is that right? Or does Julia's dot syntax include more than UERP?
- electroly 1y agoI'm in a position of supporting a Julia environment but not writing Julia myself. From my perspective, they need to fix time-to-first-plot before it can be adopted more broadly. It's horrendous. The "2-3 minutes" I see online is an aggressive estimate; it's more than that for our modest set of data science packages on very beefy workstations. I had to use PackageCompiler.jl to build a sysimage which shifted a ton of burden onto me (and onto GitHub Actions) to avoid a long precompile on every user machine. I had to do the same to get my Julia Docker image to stop precompiling on every new cloud machine even though it had already been precompiled during docker build. I would describe this process as a nightmare, and it was a serious problem--the thing was precompiling every time on every job run in the cloud using the docker image.
- xgdgsc 1y agoThat' s solved more than 1 year ago https://news.ycombinator.com/item?id=38783886 https://news.ycombinator.com/item?id=38783886 https://modernjuliaworkflows.org/optimizing/#compilation https://modernjuliaworkflows.org/optimizing/#compilation .
- pklausler 1y agoMy ideal array language is one in which array operations are function compositions, since arrays are functions. A functional view of array expressions naturally minimizes needless temporaries in most cases. See https://github.com/llvm/llvm-project/blob/main/flang/docs/ArrayComposition.md https://github.com/llvm/llvm-project/blob/main/flang/docs/Ar....