4.3BSD/usr/contrib/icon/book/17/swap.icn

procedure swap(s)
   static labels, trans, max
   initial {
      labels := "12"
      trans := "21"
      max := *labels
      trans := swap(string(&cset))
      labels := string(&cset)
      max := *labels
      }
   if *s <= max then
      return map(left(trans,*s),left(labels,*s),s)
   else return swap(left(s,*s - max)) ||
      map(trans,labels,right(s,max))
end