@effekt-lang/effekt 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +36 -0
- package/bin/effekt +0 -0
- package/bin/effekt.sh +2 -0
- package/libraries/chez/THIRD-PARTY.txt +11 -0
- package/libraries/chez/callcc/datatype.ss +188 -0
- package/libraries/chez/callcc/effekt.effekt +221 -0
- package/libraries/chez/callcc/effekt.ss +31 -0
- package/libraries/chez/callcc/seq.ss +44 -0
- package/libraries/chez/callcc/seq0.ss +69 -0
- package/libraries/chez/callcc/tail.ss +76 -0
- package/libraries/chez/callcc/tail0.ss +89 -0
- package/libraries/chez/common/effekt_matching.ss +100 -0
- package/libraries/chez/common/effekt_primitives.ss +97 -0
- package/libraries/chez/common/immutable/cslist.effekt +31 -0
- package/libraries/chez/common/immutable/dequeue.effekt +78 -0
- package/libraries/chez/common/immutable/list.effekt +643 -0
- package/libraries/chez/common/immutable/option.effekt +39 -0
- package/libraries/chez/common/immutable/result.effekt +29 -0
- package/libraries/chez/common/io/args.effekt +20 -0
- package/libraries/chez/common/mutable/array.effekt +27 -0
- package/libraries/chez/common/mutable/dict.effekt +30 -0
- package/libraries/chez/common/mutable/heap.effekt +12 -0
- package/libraries/chez/common/test.effekt +59 -0
- package/libraries/chez/common/text/pregexp.scm +772 -0
- package/libraries/chez/common/text/regex.effekt +33 -0
- package/libraries/chez/common/text/string.effekt +46 -0
- package/libraries/chez/lift/effekt.effekt +217 -0
- package/libraries/chez/lift/effekt.ss +118 -0
- package/libraries/chez/monadic/effekt.effekt +218 -0
- package/libraries/chez/monadic/effekt.ss +84 -0
- package/libraries/chez/monadic/seq0.ss +76 -0
- package/libraries/js/effekt.effekt +284 -0
- package/libraries/js/effekt_builtins.js +26 -0
- package/libraries/js/effekt_matching.js +79 -0
- package/libraries/js/effekt_runtime.js +385 -0
- package/libraries/js/immutable/dequeue.effekt +78 -0
- package/libraries/js/immutable/list.effekt +643 -0
- package/libraries/js/immutable/option.effekt +49 -0
- package/libraries/js/immutable/result.effekt +29 -0
- package/libraries/js/io/args.effekt +9 -0
- package/libraries/js/io/async.effekt +28 -0
- package/libraries/js/io/async.js +2 -0
- package/libraries/js/io/file.effekt +50 -0
- package/libraries/js/io/file_include.js +13 -0
- package/libraries/js/mutable/array.effekt +98 -0
- package/libraries/js/mutable/heap.effekt +32 -0
- package/libraries/js/mutable/map.effekt +32 -0
- package/libraries/js/test.effekt +59 -0
- package/libraries/js/text/regex.effekt +34 -0
- package/libraries/js/text/string.effekt +64 -0
- package/libraries/js/unsafe/cont.effekt +11 -0
- package/libraries/js/web/dom.effekt +45 -0
- package/libraries/llvm/buffer.c +181 -0
- package/libraries/llvm/effekt.effekt +243 -0
- package/libraries/llvm/forward-declare-c.ll +24 -0
- package/libraries/llvm/hole.c +11 -0
- package/libraries/llvm/immutable/list.effekt +678 -0
- package/libraries/llvm/immutable/option.effekt +53 -0
- package/libraries/llvm/immutable/result.effekt +29 -0
- package/libraries/llvm/io/args.effekt +24 -0
- package/libraries/llvm/io.c +24 -0
- package/libraries/llvm/main.c +39 -0
- package/libraries/llvm/rts.ll +619 -0
- package/libraries/llvm/sanity.c +16 -0
- package/libraries/llvm/text/string.effekt +179 -0
- package/libraries/llvm/types.c +20 -0
- package/libraries/ml/effekt.effekt +267 -0
- package/libraries/ml/effekt.sml +63 -0
- package/libraries/ml/immutable/dequeue.effekt +81 -0
- package/libraries/ml/immutable/list.effekt +674 -0
- package/libraries/ml/immutable/option.effekt +53 -0
- package/libraries/ml/immutable/result.effekt +29 -0
- package/libraries/ml/immutable/seq.effekt +903 -0
- package/libraries/ml/internal/option.effekt +18 -0
- package/libraries/ml/io/args.effekt +41 -0
- package/libraries/ml/mutable/array.effekt +43 -0
- package/libraries/ml/random.effekt +85 -0
- package/libraries/ml/test.effekt +60 -0
- package/libraries/ml/text/regex.effekt +107 -0
- package/libraries/ml/text/string.effekt +81 -0
- package/licenses/THIRD-PARTY.txt +21 -0
- package/licenses/apache-2.0 - license-2.0.txt +202 -0
- package/licenses/eclipse public license, version 2.0 - epl-2.0.html +61 -0
- package/licenses/kiama-license.txt +373 -0
- package/licenses/kiama-readme.txt +186 -0
- package/licenses/mit license - mit-license.html +769 -0
- package/licenses/the apache software license, version 2.0 - license-2.0.txt +202 -0
- package/licenses/the bsd license - bsd-license.html +762 -0
- package/licenses/the mit license - mit.html +769 -0
- package/package.json +26 -18
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
module effekt
|
|
2
|
+
|
|
3
|
+
extern include "rts.ll"
|
|
4
|
+
extern include "forward-declare-c.ll"
|
|
5
|
+
|
|
6
|
+
// Effekt-closed stdlib facilities
|
|
7
|
+
|
|
8
|
+
def min(n: Int, m: Int): Int =
|
|
9
|
+
if (n < m) n else m
|
|
10
|
+
|
|
11
|
+
def max(n: Int, m: Int): Int =
|
|
12
|
+
if (n > m) n else m
|
|
13
|
+
|
|
14
|
+
def neg(n: Int): Int =
|
|
15
|
+
0 - n
|
|
16
|
+
|
|
17
|
+
def abs(n: Int): Int =
|
|
18
|
+
max(n, neg(n))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
// i/o
|
|
22
|
+
|
|
23
|
+
extern io def println(n: Int): Unit = """
|
|
24
|
+
call void @c_io_println_Int(%Int %n)
|
|
25
|
+
ret %Pos zeroinitializer ; Unit
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
extern io def println(b: Boolean): Unit = """
|
|
29
|
+
call void @c_io_println_Boolean(%Pos %b)
|
|
30
|
+
ret %Pos zeroinitializer ; Unit
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
extern io def println(x: Double): Unit = """
|
|
34
|
+
call void @c_io_println_Double(%Double %x)
|
|
35
|
+
ret %Pos zeroinitializer ; Unit
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
extern io def println(str: String): Unit = """
|
|
39
|
+
call void @c_io_println_String(%Pos %str)
|
|
40
|
+
call void @c_buffer_refcount_decrement(%Pos %str)
|
|
41
|
+
ret %Pos zeroinitializer ; Unit
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def println(u: Unit): Unit = println("unit")
|
|
45
|
+
|
|
46
|
+
// strings
|
|
47
|
+
|
|
48
|
+
extern pure def infixEq(x: String, y: String): Boolean = """
|
|
49
|
+
%res = call %Pos @c_buffer_eq(%Pos %x, %Pos %y)
|
|
50
|
+
call void @c_buffer_refcount_decrement(%Pos %x)
|
|
51
|
+
call void @c_buffer_refcount_decrement(%Pos %y)
|
|
52
|
+
ret %Pos %res
|
|
53
|
+
"""
|
|
54
|
+
def infixNeq(x: String, y: String): Boolean = not(x == y)
|
|
55
|
+
|
|
56
|
+
extern pure def infixConcat(s: String, z: String): String = """
|
|
57
|
+
%spz = call %Pos @c_buffer_concatenate(%Pos %s, %Pos %z)
|
|
58
|
+
call void @c_buffer_refcount_decrement(%Pos %s)
|
|
59
|
+
call void @c_buffer_refcount_decrement(%Pos %z)
|
|
60
|
+
ret %Pos %spz
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
// integer arithmetic
|
|
64
|
+
|
|
65
|
+
extern pure def infixAdd(x: Int, y: Int): Int = "%z = add %Int ${x}, ${y} ret %Int %z"
|
|
66
|
+
extern pure def infixSub(x: Int, y: Int): Int = "%z = sub %Int ${x}, ${y} ret %Int %z"
|
|
67
|
+
extern pure def infixMul(x: Int, y: Int): Int = "%z = mul %Int ${x}, ${y} ret %Int %z"
|
|
68
|
+
extern pure def infixDiv(x: Int, y: Int): Int = "%z = sdiv %Int ${x}, ${y} ret %Int %z"
|
|
69
|
+
|
|
70
|
+
extern pure def mod (x: Int, y: Int): Int = "%z = srem %Int ${x}, ${y} ret %Int %z"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
// floating-point arithmetic
|
|
74
|
+
|
|
75
|
+
extern pure def infixAdd(x: Double, y: Double): Double = "%z = fadd %Double ${x}, ${y} ret %Double %z"
|
|
76
|
+
extern pure def infixSub(x: Double, y: Double): Double = "%z = fsub %Double ${x}, ${y} ret %Double %z"
|
|
77
|
+
extern pure def infixMul(x: Double, y: Double): Double = "%z = fmul %Double ${x}, ${y} ret %Double %z"
|
|
78
|
+
extern pure def infixDiv(x: Double, y: Double): Double = "%z = fdiv %Double ${x}, ${y} ret %Double %z"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
// ordering on signed integers
|
|
82
|
+
|
|
83
|
+
extern pure def infixEq(x: Int, y: Int): Boolean = """
|
|
84
|
+
%z = icmp eq %Int %x, %y
|
|
85
|
+
%fat_z = zext i1 %z to i64
|
|
86
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
87
|
+
ret %Pos %adt_boolean
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
extern pure def infixNeq(x: Int, y: Int): Boolean = """
|
|
91
|
+
%z = icmp ne %Int %x, %y
|
|
92
|
+
%fat_z = zext i1 %z to i64
|
|
93
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
94
|
+
ret %Pos %adt_boolean
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
extern pure def infixLt(x: Int, y: Int): Boolean = """
|
|
98
|
+
%z = icmp slt %Int %x, %y
|
|
99
|
+
%fat_z = zext i1 %z to i64
|
|
100
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
101
|
+
ret %Pos %adt_boolean
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
extern pure def infixLte(x: Int, y: Int): Boolean = """
|
|
105
|
+
%z = icmp sle %Int %x, %y
|
|
106
|
+
%fat_z = zext i1 %z to i64
|
|
107
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
108
|
+
ret %Pos %adt_boolean
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
extern pure def infixGt(x: Int, y: Int): Boolean = """
|
|
112
|
+
%z = icmp sgt %Int %x, %y
|
|
113
|
+
%fat_z = zext i1 %z to i64
|
|
114
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
115
|
+
ret %Pos %adt_boolean
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
extern pure def infixGte(x: Int, y: Int): Boolean = """
|
|
119
|
+
%z = icmp sge %Int %x, %y
|
|
120
|
+
%fat_z = zext i1 %z to i64
|
|
121
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
122
|
+
ret %Pos %adt_boolean
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
// boolean algebra
|
|
127
|
+
|
|
128
|
+
extern pure def infixEq(x: Boolean, y: Boolean): Boolean = """
|
|
129
|
+
%slim_x = extractvalue %Pos %x, 0
|
|
130
|
+
%slim_y = extractvalue %Pos %y, 0
|
|
131
|
+
%slim_z = icmp eq i64 %slim_x, %slim_y
|
|
132
|
+
%fat_z = zext i1 %slim_z to i64
|
|
133
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
134
|
+
ret %Pos %adt_boolean
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
extern pure def infixNeq(x: Boolean, y: Boolean): Boolean = """
|
|
138
|
+
%slim_x = extractvalue %Pos %x, 0
|
|
139
|
+
%slim_y = extractvalue %Pos %y, 0
|
|
140
|
+
%slim_z = icmp ne i64 %slim_x, %slim_y
|
|
141
|
+
%fat_z = zext i1 %slim_z to i64
|
|
142
|
+
%adt_boolean = insertvalue %Pos zeroinitializer, i64 %fat_z, 0
|
|
143
|
+
ret %Pos %adt_boolean
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
extern pure def not(adt_p: Boolean): Boolean = """
|
|
147
|
+
%p = extractvalue %Pos %adt_p, 0
|
|
148
|
+
%q = xor i64 1, %p
|
|
149
|
+
%adt_q = insertvalue %Pos zeroinitializer, i64 %q, 0
|
|
150
|
+
ret %Pos %adt_q
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
extern pure def infixOr(adt_p: Boolean, adt_q: Boolean): Boolean = """
|
|
154
|
+
%p = extractvalue %Pos %adt_p, 0
|
|
155
|
+
%q = extractvalue %Pos %adt_q, 0
|
|
156
|
+
%r = or i64 %p, %q
|
|
157
|
+
%adt_r = insertvalue %Pos zeroinitializer, i64 %r, 0
|
|
158
|
+
ret %Pos %adt_r
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
extern pure def infixAnd(adt_p: Boolean, adt_q: Boolean): Boolean = """
|
|
162
|
+
%p = extractvalue %Pos %adt_p, 0
|
|
163
|
+
%q = extractvalue %Pos %adt_q, 0
|
|
164
|
+
%r = and i64 %p, %q
|
|
165
|
+
%adt_r = insertvalue %Pos zeroinitializer, i64 %r, 0
|
|
166
|
+
ret %Pos %adt_r
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
// show
|
|
170
|
+
extern pure def show(i: Int): String = """
|
|
171
|
+
%z = call %Pos @c_buffer_show_Int(%Int %i)
|
|
172
|
+
ret %Pos %z
|
|
173
|
+
"""
|
|
174
|
+
extern pure def show(x: Double): String = """
|
|
175
|
+
%z = call %Pos @c_buffer_show_Double(%Double %x)
|
|
176
|
+
ret %Pos %z
|
|
177
|
+
"""
|
|
178
|
+
def show(b: Boolean): String = {
|
|
179
|
+
if(b) { "true" } else { "false" }
|
|
180
|
+
}
|
|
181
|
+
def show(u: Unit): String = { "unit" }
|
|
182
|
+
|
|
183
|
+
// For boxing polymorphic values
|
|
184
|
+
record BoxedUnit(unboxUnit: Unit)
|
|
185
|
+
record BoxedInt(unboxInt: Int)
|
|
186
|
+
record BoxedBoolean(unboxBoolean: Boolean)
|
|
187
|
+
record BoxedDouble(unboxDouble: Double)
|
|
188
|
+
record BoxedString(unboxString: String)
|
|
189
|
+
|
|
190
|
+
// Pairs
|
|
191
|
+
// =====
|
|
192
|
+
record Tuple2[A, B](first: A, second: B)
|
|
193
|
+
record Tuple3[A, B, C](first: A, second: B, third: C)
|
|
194
|
+
record Tuple4[A, B, C, D](first: A, second: B, third: C, fourth: D)
|
|
195
|
+
record Tuple5[A, B, C, D, E](first: A, second: B, third: C, fourth: D, fifth: E)
|
|
196
|
+
record Tuple6[A, B, C, D, E, F](first: A, second: B, third: C, fourth: D, fifth: E, sixth: F)
|
|
197
|
+
|
|
198
|
+
// Exceptions
|
|
199
|
+
// ==========
|
|
200
|
+
interface Exception[E] {
|
|
201
|
+
def raise(exception: E, msg: String): Nothing
|
|
202
|
+
}
|
|
203
|
+
record RuntimeError()
|
|
204
|
+
|
|
205
|
+
def raise[A](msg: String): A / Exception[RuntimeError] = do raise(RuntimeError(), msg) match {}
|
|
206
|
+
def raise[A, E](exception: E, msg: String): A / Exception[E] = do raise(exception, msg) match {}
|
|
207
|
+
|
|
208
|
+
// reports exceptions of (static) type E to the console
|
|
209
|
+
def report[E] { prog: => Unit / Exception[E] }: Unit =
|
|
210
|
+
try { prog() } with Exception[E] { def raise(exception: E, msg: String) = println(msg) }
|
|
211
|
+
|
|
212
|
+
// ignores exceptions of (static) type E
|
|
213
|
+
// TODO this should be called "ignore" but that name currently clashes with internal pattern matching names on $effekt
|
|
214
|
+
def ignoring[E] { prog: => Unit / Exception[E] }: Unit =
|
|
215
|
+
try { prog() } with Exception[E] { def raise(exception: E, msg: String) = () }
|
|
216
|
+
|
|
217
|
+
// Control Flow
|
|
218
|
+
// ============
|
|
219
|
+
interface Control {
|
|
220
|
+
def break(): Unit
|
|
221
|
+
def continue(): Unit
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
def loop { f: () => Unit / Control }: Unit = try {
|
|
225
|
+
def go(): Unit = { f(); go() }
|
|
226
|
+
go()
|
|
227
|
+
} with Control {
|
|
228
|
+
def break() = ()
|
|
229
|
+
def continue() = loop { f }
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Calls provided action repeatedly. `start` is inclusive, `end` is not.
|
|
234
|
+
*/
|
|
235
|
+
def each(start: Int, end: Int) { action: (Int) => Unit / Control } = {
|
|
236
|
+
var i = start;
|
|
237
|
+
loop {
|
|
238
|
+
if (i < end) { val el = i; i = i + 1; action(el) }
|
|
239
|
+
else { do break() }
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
def repeat(n: Int) { action: () => Unit / Control } = each(0, n) { n => action() }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
; forward-declared from primitives.c
|
|
2
|
+
|
|
3
|
+
declare i64 @c_get_argc()
|
|
4
|
+
declare %Pos @c_get_arg(i64)
|
|
5
|
+
|
|
6
|
+
declare void @c_io_println_Boolean(%Pos)
|
|
7
|
+
declare void @c_io_println_Int(%Int)
|
|
8
|
+
declare void @c_io_println_Double(%Double)
|
|
9
|
+
declare void @c_io_println_String(%Pos)
|
|
10
|
+
|
|
11
|
+
declare %Pos @c_buffer_construct(i64, i8*)
|
|
12
|
+
declare void @c_buffer_refcount_increment(%Pos)
|
|
13
|
+
declare void @c_buffer_refcount_decrement(%Pos)
|
|
14
|
+
declare %Pos @c_buffer_concatenate(%Pos, %Pos)
|
|
15
|
+
|
|
16
|
+
declare void @hole()
|
|
17
|
+
|
|
18
|
+
declare %Pos @c_buffer_eq(%Pos, %Pos)
|
|
19
|
+
declare %Pos @c_buffer_substring(%Pos, i64, i64)
|
|
20
|
+
declare i64 @c_buffer_length(%Pos)
|
|
21
|
+
declare i64 @c_buffer_toInt(%Pos)
|
|
22
|
+
declare %Pos @c_buffer_show_Int(%Pos)
|
|
23
|
+
declare %Pos @c_buffer_show_Double(%Pos)
|
|
24
|
+
declare %Int @c_buffer_index(%Pos)
|