4.3BSD/usr/contrib/icon/samples/pdco.icn

#
#          D E F I N E D   C O N T R O L   O P E R A T I O N S
#

#  This program illustrates how programmer-control operations can be
#  implemented in Icon using co-expressions and the p{ ... }
#  syntax that facilitates their use.

procedure main()
   every write(Galt{1 to 10,!"abcd",1 to 10})
   write(Seqimage{star("abc") \ 10})
   write(Seqimage{1 to 1000,5})
   write("---")
   every write(Limit{1 to 100,3})
   write("---")
   every write(Ranseq{!"abcd",1 to 10})
end

procedure star(s)
   suspend "" | (star(s) || !s)
end

procedure Galt(a)
   local e
   every e := !a do suspend |@e
end

procedure Limit(a)
   local i, x
   while i := @a[2] do {
      a[1] := ^a[1]
      every 1 to i do
         if x := @a[1] then suspend x
         else break
      }
end

procedure Ranseq(a)
   local x
   while x := @?a do suspend x
end

procedure Seqimage(a)
   local seq, result, i
   seq := ""
   i := @a[2]
   while result := image(@a[1]) do
      if *a[1] > \i then {
         seq ||:= ", ..."
         break
         }
      else seq ||:= ", " || result
   return "{" || seq[3:0] || "}" | "{}"
end