@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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/bin/effekt +0 -0
  4. package/bin/effekt.sh +2 -0
  5. package/libraries/chez/THIRD-PARTY.txt +11 -0
  6. package/libraries/chez/callcc/datatype.ss +188 -0
  7. package/libraries/chez/callcc/effekt.effekt +221 -0
  8. package/libraries/chez/callcc/effekt.ss +31 -0
  9. package/libraries/chez/callcc/seq.ss +44 -0
  10. package/libraries/chez/callcc/seq0.ss +69 -0
  11. package/libraries/chez/callcc/tail.ss +76 -0
  12. package/libraries/chez/callcc/tail0.ss +89 -0
  13. package/libraries/chez/common/effekt_matching.ss +100 -0
  14. package/libraries/chez/common/effekt_primitives.ss +97 -0
  15. package/libraries/chez/common/immutable/cslist.effekt +31 -0
  16. package/libraries/chez/common/immutable/dequeue.effekt +78 -0
  17. package/libraries/chez/common/immutable/list.effekt +643 -0
  18. package/libraries/chez/common/immutable/option.effekt +39 -0
  19. package/libraries/chez/common/immutable/result.effekt +29 -0
  20. package/libraries/chez/common/io/args.effekt +20 -0
  21. package/libraries/chez/common/mutable/array.effekt +27 -0
  22. package/libraries/chez/common/mutable/dict.effekt +30 -0
  23. package/libraries/chez/common/mutable/heap.effekt +12 -0
  24. package/libraries/chez/common/test.effekt +59 -0
  25. package/libraries/chez/common/text/pregexp.scm +772 -0
  26. package/libraries/chez/common/text/regex.effekt +33 -0
  27. package/libraries/chez/common/text/string.effekt +46 -0
  28. package/libraries/chez/lift/effekt.effekt +217 -0
  29. package/libraries/chez/lift/effekt.ss +118 -0
  30. package/libraries/chez/monadic/effekt.effekt +218 -0
  31. package/libraries/chez/monadic/effekt.ss +84 -0
  32. package/libraries/chez/monadic/seq0.ss +76 -0
  33. package/libraries/js/effekt.effekt +284 -0
  34. package/libraries/js/effekt_builtins.js +26 -0
  35. package/libraries/js/effekt_matching.js +79 -0
  36. package/libraries/js/effekt_runtime.js +385 -0
  37. package/libraries/js/immutable/dequeue.effekt +78 -0
  38. package/libraries/js/immutable/list.effekt +643 -0
  39. package/libraries/js/immutable/option.effekt +49 -0
  40. package/libraries/js/immutable/result.effekt +29 -0
  41. package/libraries/js/io/args.effekt +9 -0
  42. package/libraries/js/io/async.effekt +28 -0
  43. package/libraries/js/io/async.js +2 -0
  44. package/libraries/js/io/file.effekt +50 -0
  45. package/libraries/js/io/file_include.js +13 -0
  46. package/libraries/js/mutable/array.effekt +98 -0
  47. package/libraries/js/mutable/heap.effekt +32 -0
  48. package/libraries/js/mutable/map.effekt +32 -0
  49. package/libraries/js/test.effekt +59 -0
  50. package/libraries/js/text/regex.effekt +34 -0
  51. package/libraries/js/text/string.effekt +64 -0
  52. package/libraries/js/unsafe/cont.effekt +11 -0
  53. package/libraries/js/web/dom.effekt +45 -0
  54. package/libraries/llvm/buffer.c +181 -0
  55. package/libraries/llvm/effekt.effekt +243 -0
  56. package/libraries/llvm/forward-declare-c.ll +24 -0
  57. package/libraries/llvm/hole.c +11 -0
  58. package/libraries/llvm/immutable/list.effekt +678 -0
  59. package/libraries/llvm/immutable/option.effekt +53 -0
  60. package/libraries/llvm/immutable/result.effekt +29 -0
  61. package/libraries/llvm/io/args.effekt +24 -0
  62. package/libraries/llvm/io.c +24 -0
  63. package/libraries/llvm/main.c +39 -0
  64. package/libraries/llvm/rts.ll +619 -0
  65. package/libraries/llvm/sanity.c +16 -0
  66. package/libraries/llvm/text/string.effekt +179 -0
  67. package/libraries/llvm/types.c +20 -0
  68. package/libraries/ml/effekt.effekt +267 -0
  69. package/libraries/ml/effekt.sml +63 -0
  70. package/libraries/ml/immutable/dequeue.effekt +81 -0
  71. package/libraries/ml/immutable/list.effekt +674 -0
  72. package/libraries/ml/immutable/option.effekt +53 -0
  73. package/libraries/ml/immutable/result.effekt +29 -0
  74. package/libraries/ml/immutable/seq.effekt +903 -0
  75. package/libraries/ml/internal/option.effekt +18 -0
  76. package/libraries/ml/io/args.effekt +41 -0
  77. package/libraries/ml/mutable/array.effekt +43 -0
  78. package/libraries/ml/random.effekt +85 -0
  79. package/libraries/ml/test.effekt +60 -0
  80. package/libraries/ml/text/regex.effekt +107 -0
  81. package/libraries/ml/text/string.effekt +81 -0
  82. package/licenses/THIRD-PARTY.txt +21 -0
  83. package/licenses/apache-2.0 - license-2.0.txt +202 -0
  84. package/licenses/eclipse public license, version 2.0 - epl-2.0.html +61 -0
  85. package/licenses/kiama-license.txt +373 -0
  86. package/licenses/kiama-readme.txt +186 -0
  87. package/licenses/mit license - mit-license.html +769 -0
  88. package/licenses/the apache software license, version 2.0 - license-2.0.txt +202 -0
  89. package/licenses/the bsd license - bsd-license.html +762 -0
  90. package/licenses/the mit license - mit.html +769 -0
  91. 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)
@@ -0,0 +1,11 @@
1
+ #ifndef EFFEKT_HOLE_C
2
+ #define EFFEKT_HOLE_C
3
+
4
+ #include <stdio.h>
5
+
6
+ void hole() {
7
+ fprintf(stderr, "PANIC: Reached a hole in the program\n");
8
+ exit(1);
9
+ }
10
+
11
+ #endif