The APL idiom is pretty simple, despite appearences - the -64 and 65 are for creating an "index vector" 1 2 3...n starting at A and ending at whatever letter represented by n - taken from the "atomic vector" []av which is a system variable representing the collating sequence. Once you simplify that it's just
@@(i"0 (-1+i SEQ i 'DATA'))@SEQ
where SEQ is the subset "@A...Z" of the atomic vector.
So this idiom
1) Creates an array with a number of rows = the number of letters in DATA, where each row is 1 2 3...L(n), L(n) being the nth letter in DATA.
2) Indexes that array into SEQ to produce the corresponding array of letters
3) "Unrolls" this enclosed array twice to produce the various permutations. The selection operator "from" is thus used three times, once dyadically and twice monadically. The indexing operator "index" (i) is also used once dyadically and twice monadically (not an accident, the operators are complementary). The "rank" operator allows the "index" operator to go inside the argument array by explicitly modifying the expected strucutre of the argument - this is a very powerful APL feature that is like a "view" on an array, that is, "for this case, this isn't an MxN matrix of scalars, it's M vectors of length N", etc. etc.
This is how APL programming works - one writes statements that exhibit algorithms.