There is something wholesome in graycat’s comments on HN - especially ones where KEdit is involved!
These posts have inspired me to learn REXX / KEXX. Turns out my Slackware machine has Regina REXX.
Here is how to get the permutations of A B C D:
/* REXX */
CALL Permute "ABCD"
EXIT
Permute: PROCEDURE
PARSE ARG str
CALL PermuteHelper str, 1, LENGTH(str)
RETURN
PermuteHelper: PROCEDURE
PARSE ARG str, l, r
IF l = r THEN
SAY str
ELSE
DO i = l TO r
str = Swap(str, l, i)
CALL PermuteHelper str, l+1, r
str = Swap(str, i, l) /* backtrack */
END
RETURN
Swap: PROCEDURE
PARSE ARG str, i, j
IF i = j THEN RETURN str
a = SUBSTR(str, i, 1)
b = SUBSTR(str, j, 1)
str = OVERLAY(b, str, i)
str = OVERLAY(a, str, j)
RETURN str
Fun! How could we run this on a real mainframe?