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