git @ Cat's Eye Technologies Iphigeneia / 9d76344
Import of Iphigeneia version 1.0 revision 2011.1010 sources. Cat's Eye Technologies 10 years ago
36 changed file(s) with 198 addition(s) and 185 deletion(s). Raw diff Collapse all Expand all
00 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1 <!-- encoding: UTF-8 -->
12 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
23 <head>
34 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
45 <title>The Iphigeneia Programming Language</title>
6 <!-- begin html doc dynamic markup -->
7 <script type="text/javascript" src="/contrib/jquery-1.6.4.min.js"></script>
8 <script type="text/javascript" src="/scripts/documentation.js"></script>
9 <!-- end html doc dynamic markup -->
510 </head>
611 <body>
712
3944
4045 <p>The name Iphigeneia comes from the name of Agamemnon's daughter in Greek
4146 mythology. The name was not chosen because of any particular significance
42 this figure holds &mdash; I just think it's a nice name. However, I suppose
47 this figure holds — I just think it's a nice name. However, I suppose
4348 if you wanted to force an interpretation, you could say that Iphigeneia
4449 has two natures, princess and priestess, and so does her namesake: imperative
4550 and functional.</p>
0 (* Echo input to output until the first space *)
1 var x in
2 while x /= 32 do
3 begin
4 x := input c in c;
5 print x
6 end
0 (* "Hello, world!" (or actually just "Hello") in Iphigeneia *)
1 begin
2 print 72;
3 print 101;
4 print 108;
5 print 108;
6 print 111
7 end
+0
-3
test/01.iphi less more
0 (* Test 'var ... in ...' and assignment *)
1
2 var k in k := 5
+0
-1
test/01.out less more
0 k=5
+0
-6
test/02.iphi less more
0 (* Test 'begin ... end' *)
1
2 var k in begin
3 k := 5;
4 k := k + 1
5 end
+0
-1
test/02.out less more
0 k=6
+0
-10
test/03.iphi less more
0 (* Test nested 'var ... in ...' and arithmetic operators *)
1
2 var i in var j in var k in begin
3 i := 2;
4 j := 3;
5 k := i + j; (* 5 *)
6 i := j * k; (* 15 *)
7 j := i / 2; (* 7 *)
8 j := j - 1 (* 6 *)
9 end
+0
-3
test/03.out less more
0 j=6
1 i=15
2 k=5
+0
-9
test/04.iphi less more
0 (* Test 'if ... then ... else' command with negative result *)
1
2 var i in var j in begin
3 i := 2;
4 if i > 4 then
5 j := i * 2
6 else
7 j := i + 1
8 end
+0
-2
test/04.out less more
0 j=3
1 i=2
+0
-10
test/05.iphi less more
0 (* Test 'if ... then ... else' command with positive result *)
1
2 var i in var j in begin
3 i := 2;
4 j := 1;
5 if i < 4 & j = 1 then
6 j := i * 6
7 else
8 j := i + 1
9 end
+0
-2
test/05.out less more
0 j=12
1 i=2
+0
-10
test/06.iphi less more
0 (* Test 'while ... do ...' *)
1
2 var i in var j in begin
3 i := 100;
4 j := 0;
5 while i > 0 do begin
6 j := j + i;
7 i := i - 1
8 end
9 end
+0
-2
test/06.out less more
0 i=0
1 j=5050
+0
-14
test/07.iphi less more
0 (* Test 'while ... do ...' *)
1
2 var a in var b in var c in
3 begin
4 a := 10;
5 b := 1;
6 c := 2;
7 while a > 0 do
8 begin
9 b := b * c;
10 c := c + b;
11 a := a - 1
12 end
13 end
+0
-3
test/07.out less more
0 a=0
1 c=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847654374706155245147715674612235227680384069415566749494180212370357849936526549755341591854042821940420766722160615645816921368300
2 b=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847278898210361175931159590631877400396153764977561991761037132722898953457959352992281368361865140291306311370294857131871923863552
+0
-8
test/08.iphi less more
0 (* Test 'if ... then ... else' expression with negative result *)
1
2 var a in var b in var c in
3 begin
4 a := 10;
5 b := 2;
6 c := if a > 20 then a - b else a / b
7 end
+0
-3
test/08.out less more
0 c=5
1 b=2
2 a=10
+0
-8
test/09.iphi less more
0 (* Test 'if ... then ... else' expression with positive result *)
1
2 var a in var b in var c in
3 begin
4 a := 10;
5 b := 2;
6 c := if a < 20 then a - b else a / b
7 end
+0
-3
test/09.out less more
0 c=8
1 b=2
2 a=10
+0
-3
test/10.iphi less more
0 (* Test 'let ... in ...' *)
1
2 var a in a := let b = 7 in 10 - b;
+0
-1
test/10.out less more
0 a=3
+0
-8
test/11.iphi less more
0 (* Test 'valueof ... in ...' *)
1
2 var a in var b in begin
3 a := 10;
4 b := valueof c in begin
5 c := a * 2
6 end + 7
7 end
+0
-2
test/11.out less more
0 b=27
1 a=10
+0
-9
test/12.iphi less more
0 (* Test that 'var ... in ...' does not shadow *)
1
2 var a in var b in
3 begin
4 a := 1;
5 b := 2;
6 var a in
7 a := 3
8 end
+0
-1
test/12.out less more
0 ["Variable a already declared"]
+0
-8
test/13.iphi less more
0 (* Test that 'let ... in ...' does shadow *)
1
2 var a in var b in
3 begin
4 a := 2;
5 b := 3;
6 a := let b = 7 in a * b
7 end
+0
-2
test/13.out less more
0 a=14
1 b=3
+0
-11
test/14.iphi less more
0 (* Test 'loop ...' and 'repeat' *)
1
2 var a in a :=
3 let c = 5 in let d = 1 in
4 loop
5 if c = 0 then
6 d
7 else
8 let d = d * c in
9 let c = c - 1 in
10 repeat
+0
-1
test/14.out less more
0 a=120
+0
-25
test/Makefile less more
0 # Makefile for Iphigeneia regression test suite.
1 # $Id$
2
3 # This Makefile currently assumes GNU make.
4
5 # The suffixes are:
6 # .iphi Iphigeneia source code
7 # .out Program run output - used with 'diff' to check 'run'
8
9 IPHI?=../src/iphi
10 DIFF?=diff -u
11
12 TESTS=01.run 02.run 03.run 04.run 05.run 06.run 07.run 08.run 09.run 10.run \
13 11.run 12.run 13.run 14.run
14
15 all: ${TESTS}
16
17 .PHONY: %.run
18
19 %.run: %.iphi %.out
20 ${IPHI} $< >OUTPUT
21 ${DIFF} OUTPUT $*.out
22
23 clean:
24 rm -rf OUTPUT
+0
-7
test/cat.iphi less more
0 (* Echo input to output until the first space *)
1 var x in
2 while x /= 32 do
3 begin
4 x := input c in c;
5 print x
6 end
+0
-8
test/hello.iphi less more
0 (* "Hello, world!" (or actually just "Hello") in Iphigeneia *)
1 begin
2 print 72;
3 print 101;
4 print 108;
5 print 108;
6 print 111
7 end
0 #!/bin/sh
1
2 # This assumes Falderal 0.4 is installed. The easiest way to do this is to
3 # install it as a Cabal package:
4 # $ hg clone https://bitbucket.org/catseye/falderal
5 # $ cd falderal
6 # $ cabal install --prefix=$HOME --user
7
8 cd src && make iphi && cd ..
9 falderal test standard tests/Iphigeneia.falderal && echo "All tests passed!"
10 rm -f foo.txt
11 cd src && make clean && cd ..
0 Test Suite for Iphigeneia
1 =========================
2
3 -> Functionality "Interpret Iphigeneia program" is implemented by
4 -> shell command "(cat >foo.txt && src/iphi foo.txt)"
5
6 -> Tests for functionality "Interpret Iphigeneia program"
7
8 Test 'var ... in ...' and assignment.
9
10 | var k in k := 5
11 = k=5
12
13 Test 'begin ... end'.
14
15 | var k in begin
16 | k := 5;
17 | k := k + 1
18 | end
19 = k=6
20
21 Test nested 'var ... in ...' and arithmetic operators.
22
23 | var i in var j in var k in begin
24 | i := 2;
25 | j := 3;
26 | k := i + j; (* 5 *)
27 | i := j * k; (* 15 *)
28 | j := i / 2; (* 7 *)
29 | j := j - 1 (* 6 *)
30 | end
31 = j=6
32 = i=15
33 = k=5
34
35 Test 'if ... then ... else' command with negative result.
36
37 | var i in var j in begin
38 | i := 2;
39 | if i > 4 then
40 | j := i * 2
41 | else
42 | j := i + 1
43 | end
44 = j=3
45 = i=2
46
47 Test 'if ... then ... else' command with positive result.
48
49 | var i in var j in begin
50 | i := 2;
51 | j := 1;
52 | if i < 4 & j = 1 then
53 | j := i * 6
54 | else
55 | j := i + 1
56 | end
57 = j=12
58 = i=2
59
60 Test 'while ... do ...'.
61
62 | var i in var j in begin
63 | i := 100;
64 | j := 0;
65 | while i > 0 do begin
66 | j := j + i;
67 | i := i - 1
68 | end
69 | end
70 = i=0
71 = j=5050
72
73 Test 'while ... do ...'.
74
75 | var a in var b in var c in
76 | begin
77 | a := 10;
78 | b := 1;
79 | c := 2;
80 | while a > 0 do
81 | begin
82 | b := b * c;
83 | c := c + b;
84 | a := a - 1
85 | end
86 | end
87 = a=0
88 = c=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847654374706155245147715674612235227680384069415566749494180212370357849936526549755341591854042821940420766722160615645816921368300
89 = b=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847278898210361175931159590631877400396153764977561991761037132722898953457959352992281368361865140291306311370294857131871923863552
90
91 Test 'if ... then ... else' expression with negative result.
92
93 | var a in var b in var c in
94 | begin
95 | a := 10;
96 | b := 2;
97 | c := if a > 20 then a - b else a / b
98 | end
99 = c=5
100 = b=2
101 = a=10
102
103 Test 'if ... then ... else' expression with positive result.
104
105 | var a in var b in var c in
106 | begin
107 | a := 10;
108 | b := 2;
109 | c := if a < 20 then a - b else a / b
110 | end
111 = c=8
112 = b=2
113 = a=10
114
115 Test 'let ... in ...'.
116
117 | var a in a := let b = 7 in 10 - b;
118 = a=3
119
120 Test 'valueof ... in ...'.
121
122 | var a in var b in begin
123 | a := 10;
124 | b := valueof c in begin
125 | c := a * 2
126 | end + 7
127 | end
128 = b=27
129 = a=10
130
131 Test that 'var ... in ...' does not shadow.
132
133 | var a in var b in
134 | begin
135 | a := 1;
136 | b := 2;
137 | var a in
138 | a := 3
139 | end
140 = ["Variable a already declared"]
141
142 Test that 'let ... in ...' does shadow.
143
144 | var a in var b in
145 | begin
146 | a := 2;
147 | b := 3;
148 | a := let b = 7 in a * b
149 | end
150 = a=14
151 = b=3
152
153 Test 'loop ...' and 'repeat'.
154
155 | var a in a :=
156 | let c = 5 in let d = 1 in
157 | loop
158 | if c = 0 then
159 | d
160 | else
161 | let d = d * c in
162 | let c = c - 1 in
163 | repeat
164 = a=120