func forperm(callback, n) { var idx = @^n loop { callback(idx...) var p = n-1 while (idx[p-1] > idx[p]) {--p} p == 0 && return() var d = p idx += idx.splice(p).reverse while (idx[p-1] > idx[d]) {++d} idx.swap(p-1, d) } return() } forperm({|*p| say p }, 3)