procedure packdup(s) local result, packet, i, j s := copy(s) result := [] j := get(s) | return result packet := [j] while i := get(s) do { if i = j then put(packet, i) else { put(result, packet) packet := [i] j := i } } put(result, packet) return result end procedure packdupPDCO(L) local packet, i, j j := @L[1] | fail packet := [j] while i := @L[1] do { if i = j then put(packet, i) else { suspend packet packet := [i] j := i } } return packet end procedure packlen(s, i) local result, packet s := copy(s) result := [] while *s > 0 do { packet := [] every 1 to i do put(packet, get(s)) | break put(result, packet) } return result end procedure packup(s) local result, packet, i, j s := copy(s) result := [] j := get(s) | return result packet := [j] while i := get(s) do { if i > j then { put(packet, i) } else { put(result, packet) packet := [i] } j := i } put(result, packet) return result end procedure packlenv(s1, s2) local result, packet, i result := [] s1 := copy(s1) s2 := copy(s2) while i := get(s2) do { put(s2, i) # cyclic shift packet := [] every 1 to i do put(packet, get(s1)) | { put(result, packet) # short packet break break } put(result, packet) } return result end procedure flatpack(s) local result, x result := [] every x := !s do if type(x) == "list" then result |||:= flatpack(x) else put(result, x) return result end procedure flatpackPDCO(L) local x while x := @L[1] do if type(x) == "list" then suspend !flatpack(x) else suspend x end procedure imagepack(s) local result, x result := "" every x := !s do { if integer(x) then result ||:= x else result ||:= pimage(x) result ||:= "," } return "[" || result[1:-1] || "]" end