procedure spromote(x) if type(x) == "list" then x := [x] return x end procedure srun(i, j, k) local lseq /k := 1 if j < i then k:= Ðk lseq := [] every put(lseq, i to j by k) return lseq end procedure sconcat(x[]) local lseq lseq := [] every lseq |||:= spromote(!x) return lseq end procedure srepeat(x, i) local lseq x := spromote(x) lseq := copy(x) every 1 to i Ð 1 do lseq |||:= x return lseq end procedure sextend(x, i) local lseq x := spromote(x) lseq := copy(x) until *lseq >= i do lseq |||:= x return lseq[1+:i] end procedure sopal(x) x := spromote(x) return x ||| sreflecth(x)[2:Ð1] end procedure scpal(x, i) local lseq /i := 1 x := spromote(x) if i = 1 then return x ||| sreflecth(x)[2:0] else { lseq := srepeat(sopal(x), i) put(lseq, lseq[1]) return lseq } end procedure sreflecth(x) local lseq lseq := [] every push(lseq, !spromote(x)) return lseq end procedure sreflectv(x) local lseq, m x := spromote(x) m := sbound ! x lseq := [] every put(lseq, m Ð !x + 1) return lseq end procedure sbound(args[]) return sort(args)[Ð1] # last is largest end procedure slength(x) return *spromote(x) end