4.3BSD/usr/contrib/icon/book/18/add2.icn

procedure large(s)
   local a
   a := []
   s ? {
      &pos := 0	# start at right end
      while put(a,integer(move(-segsize)))
	# add remaining digits
      if &pos ~= 1 then put(a,integer(tab(1)))
      }
   return a
end

procedure add(a1,a2,carry)
   local sum
   /carry := [0]	# default carry
   if *a1 = *a2 = 0 then
      return if carry[1] ~= 0 then carry else []
   if *a1 > *a2 then a1 :=: a2
   if *a1 = 0 then return add(carry,a2)
   sum := a1[1] + a2[1] + carry[1]
   carry := [sum / base]
   return push(add(a1[2:0],a2[2:0],carry),sum % base)
end

procedure lstring(a)
   local s
   s := ""
   every s := right(!a,segsize,"0") || s
   s ?:= (tab(upto(~'0') | -1) & tab(0))
   return s
end