procedure expand(pattern) local result, i, j, k, slist, s static brchars initial brchars := '[<{' result := "" pattern ? { while result ||:= tab(bal(brchars)) do { case move(1) of { "[" : { result ||:= repl(expand(tab(bal(',', '[', ']'))), (move(1), tab(upto(']')))) } "<" : { result ||:= reverse(expand(tab(bal('>', '<', '>')))) } "{" : { s := expand(tab(bal('}', '{', '}'))) slist := [] s ? { while put(slist, tab(upto('|') | 0)) do move(1) | break } every i := seq() do { k := *result every j := 1 to *slist do result ||:= slist[j][i] if *result = k then break # done } } } move(1) } return result || tab(0) } end