| read through the OP and scanned a few examples on the J Project Wiki i suspect that, to capture the full value of J, one needs to already know the array-oriented paradigm (or at least have a strong motivation to learn the two in parallel) knowing the AOP paradigm also helps understand the programming patterns as well as the syntax still, the dense syntax has extraordinary power for instance, n-queens in J (from Rosetta Code) is just 4 short lines: perm =: ! A.&i. ]
comb2 =: (, #: I.@,@(</)&i.)~
mask =: [ */@:~:&(|@-/) {
queenst=: comb2 (] #"1~ mask)&.|: perm
a fundamental AOP patterns is evidenced here:line 1: create the 2D array (n x n chessboard) line 2: populate the array with candidate solutions line 3: eliminate invalid solutions ('mask' them) |
Yes, that's the power that's specific to J. Having a library of functions like anagram index, nub, antibase, matrix inverse, etc. can be done in pretty much any language. So can using really short names for everything (have a look at the J implementation). What J has that isn't so easy to export is the way first-order functions work on arbitrarily high-rank arguments, and even a lot of APLs don't let you mix argument ranks in the way that J does (e.g., vector-matrix addition). Without the inherently rank-polymorphic function application semantics, it would just be an idiosyncratic pointfree programming syntax for people who don't want to use anything higher than second-order functions (and maybe have a grudge against static parsing).