############################################################################
#
#	File:     proto.icn
#
#	Subject:  Program to show Icon syntactic forms
#
#	Author:   Ralph E. Griswold
#
#	Date:     January 3, 1993
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program doesn't "do" anything.  It just contains an example of
#  every syntactic form in Version 7 of Icon (or close to it).  It might
#  be useful for checking programs that process Icon programs.  Note, however,
#  that it does not contain many combinations of different syntactic forms.
#
############################################################################
#
#  Program note:
#
#     This program is divided into procedures to avoid overflow with
#  default values for Icon's translator and linker.
#
############################################################################
#
#  Links: options
#
#  Requires:  co-expressions
#
############################################################################

link options

record three(x,y,z)
record zero()
record one(z)

invocable all

global line, count

procedure main()
   expr1()
   expr2()
   expr3()
   expr4(1,2)
   expr4{1,2}
   expr5(1,2,3,4)
end

procedure expr1()
   local x, y, z
   local i, j
   static e1

   initial e1 := 0

   exit()			# get out before there's trouble

   ()
   {}
   ();()
   []
   [,]
   x.y
   x[i]
   x[i:j]
   x[i+:j]
   x[i-:j]
   (,,,)
   x(,,,)
   not x
   |x
   !x
   *x
   +x
   -x
end

procedure expr2()
   local x, i, y, j, c1, c2, s1, s2, a2, k, a1

   .x
   /x
   =x
   ?x
   \x
   ~x
   @x
   ^x
   x \ i
   x @ y
   i ^ j
   i * j
   i / j
   i % j
   c1 ** c2
   i + j
   i - j
   c1 ++ c2
   c1 -- c2
   s1 || s2
   a1 ||| a2
   i < j
   i <= j
   i = j
   i >= j
   i > j
   i ~= j
   s1 << s2
   s1 == s2
   s1 >>= s2
   s1 >> s2
   s1 ~== s2
   x === y
   x ~=== y
   x | y
   i to j
   i to j by k
   x := y
   x <- y
   x :=: y
   x <-> y
   i +:= j
   i -:= j
   i *:= j
end

procedure expr3()
   local i, j, c1, c2, s1, s2, a1, a2, x, y, s

   i /:= j
   i %:= j
   i ^:= j
   i <:= j
   i <=:= j
   i =:= j
   i >=:= j
   i ~=:= j
   c1 ++:= c2
   c1 --:= c2
   c1 **:= c2
   s1 ||:= s2
   s1 <<:= s2
   s1 <<=:= s2
   s1 ==:= s2
   s1 >>=:= s2
   s1 >>:= s2
   s1 ~==:= s2
   s1 ?:= s2
   a1 |||:= a2
   x ===:= y
   x ~===:= y
   x &:= y
   x @:= y
   s ? x
   x & y
   create x
   return
   return x
   suspend x
   suspend x do y
   fail
end

procedure expr4()
   local e1, e2, e, x, i, j, size, s, e3, X_

   while e1 do break
   while e1 do break e2
   while e1 do next
   case e of {
     x:   fail
     (i > j) | 1    :  return
     }
   case size(s) of {
     1:   1
     default:  fail
     }
   if e1 then e2
   if e1 then e2 else e3
   repeat e
   while e1
   while e1 do e2
   until e1
   until e1 do e2
   every e1
   every e1 do e2
   x
   X_
   &cset
   &null
   "abc"
   "abc_
    cde"
   'abc'
   'abc_
    cde'
   "\n"
   "^a"
   "\001"
   "\x01"
   1
   999999
   36ra1
   3.5
   2.5e4
   4e-10
end

procedure expr5(a,b,c[])
end
