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

procedure add(s1,s2,carry)
   local size, sum
   /carry := 0	# default carry
   if *s1 > *s2 then s1 :=: s2
   size := *s2
   if size <= segsize then return s1 + s2 + carry
   s1 := right(s1,size,"0")
   sum := right(s1,segsize) + right(s2,segsize) + carry
   return add(left(s1,size - segsize),
      left(s2,size - segsize),sum / base) ||
      right(sum % base,segsize,"0")
end