procedure scollate(args[])
   local lseq, i

   args := copyargs ! args

   lseq := []

   repeat
      every i := 1 to *args do
         put(lseq, get(args[i])) | break break

   return lseq

end

procedure copyargs(args[])
   local new_args

   new_args := []

   every put(new_args, copy(spromote(!args)))

   return new_args

end

procedure splace(x1, x2)
   local lseq, i

   x1 := copy(spromote(x1))

   x2 := spromote(x2)

   lseq := []

   every i := !x2 do
      every put(lseq, !x1 + i - 1)

   return lseq

end

procedure sscale(x, i)
   local lseq, j

   lseq := copy(spromote(x))

   every j := 1 to *lseq do
       lseq[j] := (lseq[j] - 1) * i + 1

   return lseq	

end

procedure srepl(x, i)
   local lseq, j

   lseq := []

   every j := !spromote(x) do
      every 1 to i do
         put(lseq, j)

   return lseq

end