Import of Iphigeneia version 1.0 revision 2011.1010 sources.
Cat's Eye Technologies
10 years ago
0 | 0 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
1 | <!-- encoding: UTF-8 --> | |
1 | 2 | <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> |
2 | 3 | <head> |
3 | 4 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
4 | 5 | <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 --> | |
5 | 10 | </head> |
6 | 11 | <body> |
7 | 12 | |
39 | 44 | |
40 | 45 | <p>The name Iphigeneia comes from the name of Agamemnon's daughter in Greek |
41 | 46 | mythology. The name was not chosen because of any particular significance |
42 | this figure holds — 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 | |
43 | 48 | if you wanted to force an interpretation, you could say that Iphigeneia |
44 | 49 | has two natures, princess and priestess, and so does her namesake: imperative |
45 | 50 | 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 | (* 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 | (* 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 | (* 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 | (* 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 | (* 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 | a=0 | |
1 | c=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847654374706155245147715674612235227680384069415566749494180212370357849936526549755341591854042821940420766722160615645816921368300 | |
2 | b=140982598893793678070294688422804665931354981644880911847733136248186424030732278900819020480668973702640170212905160639132296847278898210361175931159590631877400396153764977561991761037132722898953457959352992281368361865140291306311370294857131871923863552 |
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 | (* 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 | (* 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 | (* 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 | (* 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 | (* 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 | # 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 | (* 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 | #!/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 |