val factorial = fn(x) { if(x < 2: 1; x * fn((x - 1))) } val permute = fn(plist) { if plist is not list: throw "expected list" val limit = 10 if len(plist) > limit: throw "permutation limit exceeded (currently {{limit}})" var elements = plist var ordinals = series(len(elements)) val n = len(ordinals) var i, j for[p=[plist]] of factorial(len(plist))-1 { i = n - 1 j = n while ordinals[i] > ordinals[i+1] { i -= 1 } while ordinals[j] < ordinals[i] { j -= 1 } ordinals[i], ordinals[j] = ordinals[j], ordinals[i] elements[i], elements[j] = elements[j], elements[i] i += 1 for j = n; i < j ; i, j = i+1, j-1 { ordinals[i], ordinals[j] = ordinals[j], ordinals[i] elements[i], elements[j] = elements[j], elements[i] } p = more(p, elements) } } for e in permute([1, 3.14, 7]) { writeln e }