@effekt-lang/effekt 0.46.0 → 0.47.0
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/bin/effekt +0 -0
- package/libraries/chez/common/immutable/cslist.effekt +6 -6
- package/libraries/chez/common/mutable/dict.effekt +7 -7
- package/libraries/common/args.effekt +10 -10
- package/libraries/common/array.effekt +4 -4
- package/libraries/common/bench.effekt +2 -2
- package/libraries/common/buffer.effekt +3 -3
- package/libraries/common/bytearray.effekt +14 -7
- package/libraries/common/char.effekt +8 -8
- package/libraries/common/effekt.effekt +71 -71
- package/libraries/common/exception.effekt +1 -1
- package/libraries/common/io/console.effekt +4 -4
- package/libraries/common/io/error.effekt +1 -1
- package/libraries/common/io/filesystem.effekt +7 -7
- package/libraries/common/io/network.effekt +5 -5
- package/libraries/common/io/time.effekt +1 -1
- package/libraries/common/io.effekt +6 -6
- package/libraries/common/process.effekt +1 -1
- package/libraries/common/queue.effekt +2 -2
- package/libraries/common/ref.effekt +4 -4
- package/libraries/common/regex.effekt +4 -4
- package/libraries/common/string.effekt +5 -5
- package/libraries/js/mutable/map.effekt +5 -5
- package/libraries/js/web/dom.effekt +11 -11
- package/licenses/eclipse public license, version 2.0 - epl-2.0.html +2 -2
- package/licenses/mit license - mit-license.html +17 -17
- package/licenses/the bsd license - bsd-license.html +17 -17
- package/licenses/the mit license - mit.html +17 -17
- package/package.json +1 -1
|
@@ -60,7 +60,7 @@ $effekt.readln = function readln$impl(callback) {
|
|
|
60
60
|
}
|
|
61
61
|
"""
|
|
62
62
|
|
|
63
|
-
extern
|
|
63
|
+
extern def readln() at async: String =
|
|
64
64
|
jsNode "$effekt.capture(callback => $effekt.readln(callback))"
|
|
65
65
|
llvm """
|
|
66
66
|
%result = call %Pos @c_io_readln()
|
|
@@ -74,7 +74,7 @@ def println(value: Double): Unit = println(value.show)
|
|
|
74
74
|
def println(value: Bool): Unit = println(value.show)
|
|
75
75
|
def println(value: Byte): Unit = println(value.show)
|
|
76
76
|
|
|
77
|
-
extern
|
|
77
|
+
extern def show(value: Int) at {}: String =
|
|
78
78
|
js "'' + ${value}"
|
|
79
79
|
chez "(show-number ${value})"
|
|
80
80
|
llvm """
|
|
@@ -85,7 +85,7 @@ extern pure def show(value: Int): String =
|
|
|
85
85
|
|
|
86
86
|
def show(value: Unit): String = "()"
|
|
87
87
|
|
|
88
|
-
extern
|
|
88
|
+
extern def show(value: Double) at {}: String =
|
|
89
89
|
js "'' + ${value}"
|
|
90
90
|
chez "(show-number ${value})"
|
|
91
91
|
llvm """
|
|
@@ -100,7 +100,7 @@ def show(value: String): String =
|
|
|
100
100
|
def show(value: Bool): String =
|
|
101
101
|
if (value) "true" else "false"
|
|
102
102
|
|
|
103
|
-
extern
|
|
103
|
+
extern def show(value: Char) at {}: String =
|
|
104
104
|
js "String.fromCodePoint(${value})"
|
|
105
105
|
chez "(string (integer->char ${value}))"
|
|
106
106
|
llvm """
|
|
@@ -109,7 +109,7 @@ extern pure def show(value: Char): String =
|
|
|
109
109
|
"""
|
|
110
110
|
vm "effekt::show(Char)"
|
|
111
111
|
|
|
112
|
-
extern
|
|
112
|
+
extern def show(value: Byte) at {}: String =
|
|
113
113
|
js "'' + ${value}"
|
|
114
114
|
chez "(string ${value})"
|
|
115
115
|
llvm """
|
|
@@ -118,11 +118,11 @@ extern pure def show(value: Byte): String =
|
|
|
118
118
|
"""
|
|
119
119
|
vm "effekt::show(Byte)"
|
|
120
120
|
|
|
121
|
-
extern
|
|
121
|
+
extern def genericShow[R](value: R) at {}: String =
|
|
122
122
|
js "$effekt.show(${value})"
|
|
123
123
|
chez "(show_impl ${value})"
|
|
124
124
|
|
|
125
|
-
extern
|
|
125
|
+
extern def inspect[R](value: R) at io: Unit =
|
|
126
126
|
js { println(genericShow(value)) }
|
|
127
127
|
chez { println(genericShow(value)) }
|
|
128
128
|
vm "effekt::inspect(Any)"
|
|
@@ -130,7 +130,7 @@ extern io def inspect[R](value: R): Unit =
|
|
|
130
130
|
|
|
131
131
|
// Strings
|
|
132
132
|
// =======
|
|
133
|
-
extern
|
|
133
|
+
extern def infixConcat(s1: String, s2: String) at {}: String =
|
|
134
134
|
js "${s1} + ${s2}"
|
|
135
135
|
chez "(string-append ${s1} ${s2})"
|
|
136
136
|
llvm """
|
|
@@ -139,7 +139,7 @@ extern pure def infixConcat(s1: String, s2: String): String =
|
|
|
139
139
|
"""
|
|
140
140
|
vm "effekt::infixConcat(String, String)"
|
|
141
141
|
|
|
142
|
-
extern
|
|
142
|
+
extern def length(str: String) at {}: Int =
|
|
143
143
|
js "${str}.length"
|
|
144
144
|
chez "(string-length ${str})"
|
|
145
145
|
llvm """
|
|
@@ -148,7 +148,7 @@ extern pure def length(str: String): Int =
|
|
|
148
148
|
"""
|
|
149
149
|
vm "effekt::length(String)"
|
|
150
150
|
|
|
151
|
-
extern
|
|
151
|
+
extern def unsafeSubstring(str: String, from: Int, to: Int) at {}: String =
|
|
152
152
|
js "${str}.substring(${from}, ${to})"
|
|
153
153
|
chez "(substring ${str} ${from} ${to})" // potentially raises: "Exception in substring: ..."
|
|
154
154
|
llvm """
|
|
@@ -161,7 +161,7 @@ extern pure def unsafeSubstring(str: String, from: Int, to: Int): String =
|
|
|
161
161
|
// Side effecting ops
|
|
162
162
|
// ==================
|
|
163
163
|
|
|
164
|
-
extern
|
|
164
|
+
extern def random() at io: Double =
|
|
165
165
|
js "Math.random()"
|
|
166
166
|
chez "(random 1.0)"
|
|
167
167
|
vm "effekt::random()"
|
|
@@ -170,8 +170,8 @@ extern io def random(): Double =
|
|
|
170
170
|
// ====================
|
|
171
171
|
// the following type is defined in builtins.scala
|
|
172
172
|
// interface Ref[T] { def get(): T; def put(t: T): Unit }
|
|
173
|
-
// extern io def freshIn[T](t: T) {r: Region}: Ref[T] at
|
|
174
|
-
// extern io def freshGlobal[T](t: T): Ref[T] at
|
|
173
|
+
// extern io def freshIn[T](t: T) {r: Region}: Ref[T] at r = js "r.fresh(${t})"
|
|
174
|
+
// extern io def freshGlobal[T](t: T): Ref[T] at global = js "$effekt.fresh(${t})"
|
|
175
175
|
|
|
176
176
|
|
|
177
177
|
// Equality
|
|
@@ -193,7 +193,7 @@ def compareInt(n: Int, m: Int) =
|
|
|
193
193
|
else if (n < m) Less()
|
|
194
194
|
else Greater()
|
|
195
195
|
|
|
196
|
-
extern
|
|
196
|
+
extern def genericCompareImpl[R](x: R, y: R) at {}: Int =
|
|
197
197
|
js "$effekt.compare(${x}, ${y})"
|
|
198
198
|
|
|
199
199
|
/// Compares two values of the same type, returning an `Ordering`.
|
|
@@ -222,7 +222,7 @@ def println(o: Ordering): Unit = println(o.show)
|
|
|
222
222
|
// ==============
|
|
223
223
|
|
|
224
224
|
/// Structural equality: Not available in the LLVM backend
|
|
225
|
-
extern
|
|
225
|
+
extern def equals[R](x: R, y: R) at {}: Bool =
|
|
226
226
|
js "$effekt.equals(${x}, ${y})"
|
|
227
227
|
chez "(equal_impl ${x} ${y})"
|
|
228
228
|
|
|
@@ -230,10 +230,10 @@ def differsFrom[R](x: R, y: R): Bool =
|
|
|
230
230
|
not(equals(x, y))
|
|
231
231
|
|
|
232
232
|
// TODO fix this in the pattern matching compiler
|
|
233
|
-
extern
|
|
233
|
+
extern def infixEq(x: Unit, y: Unit) at {}: Bool =
|
|
234
234
|
default { true }
|
|
235
235
|
|
|
236
|
-
extern
|
|
236
|
+
extern def infixEq(x: Int, y: Int) at {}: Bool =
|
|
237
237
|
js "${x} === ${y}"
|
|
238
238
|
chez "(equal? ${x} ${y})"
|
|
239
239
|
llvm """
|
|
@@ -244,7 +244,7 @@ extern pure def infixEq(x: Int, y: Int): Bool =
|
|
|
244
244
|
"""
|
|
245
245
|
vm "effekt::infixEq(Int, Int)"
|
|
246
246
|
|
|
247
|
-
extern
|
|
247
|
+
extern def infixNeq(x: Int, y: Int) at {}: Bool =
|
|
248
248
|
js "${x} !== ${y}"
|
|
249
249
|
chez "(not (equal? ${x} ${y}))"
|
|
250
250
|
llvm """
|
|
@@ -255,7 +255,7 @@ extern pure def infixNeq(x: Int, y: Int): Bool =
|
|
|
255
255
|
"""
|
|
256
256
|
vm "effekt::infixNeq(Int, Int)"
|
|
257
257
|
|
|
258
|
-
extern
|
|
258
|
+
extern def infixEq(x: Char, y: Char) at {}: Bool =
|
|
259
259
|
js "${x} === ${y}"
|
|
260
260
|
chez "(equal? ${x} ${y})"
|
|
261
261
|
llvm """
|
|
@@ -266,7 +266,7 @@ extern pure def infixEq(x: Char, y: Char): Bool =
|
|
|
266
266
|
"""
|
|
267
267
|
vm "effekt::infixEq(Char, Char)"
|
|
268
268
|
|
|
269
|
-
extern
|
|
269
|
+
extern def infixNeq(x: Char, y: Char) at {}: Bool =
|
|
270
270
|
js "${x} !== ${y}"
|
|
271
271
|
chez "(not (equal? ${x} ${y}))"
|
|
272
272
|
llvm """
|
|
@@ -276,7 +276,7 @@ extern pure def infixNeq(x: Char, y: Char): Bool =
|
|
|
276
276
|
ret %Pos %adt_boolean
|
|
277
277
|
"""
|
|
278
278
|
|
|
279
|
-
extern
|
|
279
|
+
extern def infixEq(x: String, y: String) at {}: Bool =
|
|
280
280
|
js "${x} === ${y}"
|
|
281
281
|
chez "(equal? ${x} ${y})"
|
|
282
282
|
llvm """
|
|
@@ -287,7 +287,7 @@ extern pure def infixEq(x: String, y: String): Bool =
|
|
|
287
287
|
|
|
288
288
|
def infixNeq(x: String, y: String): Bool = not(x == y)
|
|
289
289
|
|
|
290
|
-
extern
|
|
290
|
+
extern def infixEq(x: Bool, y: Bool) at {}: Bool =
|
|
291
291
|
js "${x} === ${y}"
|
|
292
292
|
chez "(equal? ${x} ${y})"
|
|
293
293
|
llvm """
|
|
@@ -300,7 +300,7 @@ extern pure def infixEq(x: Bool, y: Bool): Bool =
|
|
|
300
300
|
"""
|
|
301
301
|
vm "effekt::infixEq(Bool, Bool)"
|
|
302
302
|
|
|
303
|
-
extern
|
|
303
|
+
extern def infixNeq(x: Bool, y: Bool) at {}: Bool =
|
|
304
304
|
js "${x} !== ${y}"
|
|
305
305
|
chez "(not (equal? ${x} ${y}))"
|
|
306
306
|
llvm """
|
|
@@ -315,85 +315,85 @@ extern pure def infixNeq(x: Bool, y: Bool): Bool =
|
|
|
315
315
|
|
|
316
316
|
// Math ops
|
|
317
317
|
// ========
|
|
318
|
-
extern
|
|
318
|
+
extern def infixAdd(x: Int, y: Int) at {}: Int =
|
|
319
319
|
js "(${x} + ${y})"
|
|
320
320
|
chez "(+ ${x} ${y})"
|
|
321
321
|
llvm "%z = add %Int ${x}, ${y} ret %Int %z"
|
|
322
322
|
vm "effekt::infixAdd(Int, Int)"
|
|
323
323
|
|
|
324
|
-
extern
|
|
324
|
+
extern def infixMul(x: Int, y: Int) at {}: Int =
|
|
325
325
|
js "(${x} * ${y})"
|
|
326
326
|
chez "(* ${x} ${y})"
|
|
327
327
|
llvm "%z = mul %Int ${x}, ${y} ret %Int %z"
|
|
328
328
|
vm "effekt::infixMul(Int, Int)"
|
|
329
329
|
|
|
330
|
-
extern
|
|
330
|
+
extern def infixDiv(x: Int, y: Int) at {}: Int =
|
|
331
331
|
js "Math.floor(${x} / ${y})"
|
|
332
332
|
chez "(floor (/ ${x} ${y}))"
|
|
333
333
|
llvm "%z = sdiv %Int ${x}, ${y} ret %Int %z"
|
|
334
334
|
vm "effekt::infixDiv(Int, Int)"
|
|
335
335
|
|
|
336
|
-
extern
|
|
336
|
+
extern def infixSub(x: Int, y: Int) at {}: Int =
|
|
337
337
|
js "(${x} - ${y})"
|
|
338
338
|
chez "(- ${x} ${y})"
|
|
339
339
|
llvm "%z = sub %Int ${x}, ${y} ret %Int %z"
|
|
340
340
|
vm "effekt::infixSub(Int, Int)"
|
|
341
341
|
|
|
342
|
-
extern
|
|
342
|
+
extern def mod(x: Int, y: Int) at {}: Int =
|
|
343
343
|
js "(${x} % ${y})"
|
|
344
344
|
chez "(modulo ${x} ${y})"
|
|
345
345
|
llvm "%z = srem %Int ${x}, ${y} ret %Int %z"
|
|
346
346
|
vm "effekt::mod(Int, Int)"
|
|
347
347
|
|
|
348
|
-
extern
|
|
348
|
+
extern def infixAdd(x: Double, y: Double) at {}: Double =
|
|
349
349
|
js "(${x} + ${y})"
|
|
350
350
|
chez "(+ ${x} ${y})"
|
|
351
351
|
llvm "%z = fadd %Double ${x}, ${y} ret %Double %z"
|
|
352
352
|
vm "effekt::infixAdd(Double, Double)"
|
|
353
353
|
|
|
354
|
-
extern
|
|
354
|
+
extern def infixMul(x: Double, y: Double) at {}: Double =
|
|
355
355
|
js "(${x} * ${y})"
|
|
356
356
|
chez "(* ${x} ${y})"
|
|
357
357
|
llvm "%z = fmul %Double ${x}, ${y} ret %Double %z"
|
|
358
358
|
vm "effekt::infixMul(Double, Double)"
|
|
359
359
|
|
|
360
|
-
extern
|
|
360
|
+
extern def infixSub(x: Double, y: Double) at {}: Double =
|
|
361
361
|
js "(${x} - ${y})"
|
|
362
362
|
chez "(- ${x} ${y})"
|
|
363
363
|
llvm "%z = fsub %Double ${x}, ${y} ret %Double %z"
|
|
364
364
|
vm "effekt::infixSub(Double, Double)"
|
|
365
365
|
|
|
366
|
-
extern
|
|
366
|
+
extern def infixDiv(x: Double, y: Double) at {}: Double =
|
|
367
367
|
js "(${x} / ${y})"
|
|
368
368
|
chez "(fl/ ${x} ${y})"
|
|
369
369
|
llvm "%z = fdiv %Double ${x}, ${y} ret %Double %z"
|
|
370
370
|
vm "effekt::infixDiv(Double, Double)"
|
|
371
371
|
|
|
372
|
-
extern
|
|
372
|
+
extern def cos(x: Double) at {}: Double =
|
|
373
373
|
js "Math.cos(${x})"
|
|
374
374
|
chez "(cos ${x})"
|
|
375
375
|
vm "effekt::cos(Double)"
|
|
376
376
|
llvm "%z = call %Double @llvm.cos.f64(double ${x}) ret %Double %z"
|
|
377
377
|
|
|
378
|
-
extern
|
|
378
|
+
extern def sin(x: Double) at {}: Double =
|
|
379
379
|
js "Math.sin(${x})"
|
|
380
380
|
chez "(sin ${x})"
|
|
381
381
|
vm "effekt::sin(Double)"
|
|
382
382
|
llvm "%z = call %Double @llvm.sin.f64(double ${x}) ret %Double %z"
|
|
383
383
|
|
|
384
|
-
extern
|
|
384
|
+
extern def atan(x: Double) at {}: Double =
|
|
385
385
|
js "Math.atan(${x})"
|
|
386
386
|
chez "(atan ${x})"
|
|
387
387
|
vm "effekt::atan(Double)"
|
|
388
388
|
llvm "%z = call %Double @atan(double ${x}) ret %Double %z"
|
|
389
389
|
|
|
390
|
-
extern
|
|
390
|
+
extern def tan(x: Double) at {}: Double =
|
|
391
391
|
js "Math.tan(${x})"
|
|
392
392
|
chez "(tan ${x})"
|
|
393
393
|
vm "effekt::tan(Double)"
|
|
394
394
|
llvm "%z = call %Double @tan(double ${x}) ret %Double %z"
|
|
395
395
|
|
|
396
|
-
extern
|
|
396
|
+
extern def sqrt(x: Double) at {}: Double =
|
|
397
397
|
js "Math.sqrt(${x})"
|
|
398
398
|
chez "(sqrt ${x})"
|
|
399
399
|
llvm "%z = call %Double @llvm.sqrt.f64(double ${x}) ret %Double %z"
|
|
@@ -410,18 +410,18 @@ def max(n: Double, m: Double): Double =
|
|
|
410
410
|
def abs(n: Double): Double =
|
|
411
411
|
max(n, neg(n))
|
|
412
412
|
|
|
413
|
-
extern
|
|
413
|
+
extern def log(x: Double) at {}: Double =
|
|
414
414
|
js "Math.log(${x})"
|
|
415
415
|
chez "(log ${x})"
|
|
416
416
|
vm "effekt::log(Double)"
|
|
417
417
|
llvm "%z = call %Double @llvm.log.f64(double ${x}) ret %Double %z"
|
|
418
418
|
|
|
419
|
-
extern
|
|
419
|
+
extern def log1p(x: Double) at {}: Double =
|
|
420
420
|
js "Math.log1p(${x})"
|
|
421
421
|
chez "(log (+ ${x} 1))"
|
|
422
422
|
llvm "%z = call %Double @log1p(double ${x}) ret %Double %z"
|
|
423
423
|
|
|
424
|
-
extern
|
|
424
|
+
extern def exp(x: Double) at {}: Double =
|
|
425
425
|
js "Math.exp(${x})"
|
|
426
426
|
chez "(exp ${x})"
|
|
427
427
|
vm "effekt::exp(Double)"
|
|
@@ -440,14 +440,14 @@ def pow(base: Double, exponent: Int): Double = {
|
|
|
440
440
|
}
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
extern
|
|
443
|
+
extern def pow(base: Double, exponent: Double) at {}: Double =
|
|
444
444
|
js "Math.pow(${base}, ${exponent})"
|
|
445
445
|
chez "(expt ${base} ${exponent})"
|
|
446
446
|
vm "effekt::pow(Double, Double)"
|
|
447
447
|
llvm "%z = call %Double @llvm.pow.f64(double ${base}, double ${exponent}) ret %Double %z"
|
|
448
448
|
|
|
449
449
|
// since we do not have "extern val", yet
|
|
450
|
-
extern
|
|
450
|
+
extern def _pi() at {}: Double =
|
|
451
451
|
js "Math.PI"
|
|
452
452
|
chez "(* 4 (atan 1))"
|
|
453
453
|
vm "effekt::pi()"
|
|
@@ -455,20 +455,20 @@ extern pure def _pi(): Double =
|
|
|
455
455
|
|
|
456
456
|
val PI: Double = _pi()
|
|
457
457
|
|
|
458
|
-
extern
|
|
458
|
+
extern def toInt(d: Double) at {}: Int =
|
|
459
459
|
js "Math.trunc(${d})"
|
|
460
460
|
chez "(flonum->fixnum ${d})"
|
|
461
461
|
llvm "%z = fptosi double ${d} to %Int ret %Int %z"
|
|
462
462
|
vm "effekt::toInt(Double)"
|
|
463
463
|
|
|
464
|
-
extern
|
|
464
|
+
extern def toDouble(d: Int) at {}: Double =
|
|
465
465
|
js "${d}"
|
|
466
466
|
chez "(fixnum->flonum ${d})"
|
|
467
467
|
llvm "%z = sitofp i64 ${d} to double ret double %z"
|
|
468
468
|
vm "effekt::toDouble(Int)"
|
|
469
469
|
|
|
470
470
|
|
|
471
|
-
extern
|
|
471
|
+
extern def round(d: Double) at {}: Int =
|
|
472
472
|
js "Math.round(${d})"
|
|
473
473
|
chez "(flonum->fixnum (round ${d}))"
|
|
474
474
|
llvm """
|
|
@@ -482,7 +482,7 @@ def round(d: Double, digits: Int): Double = {
|
|
|
482
482
|
round(d * factor).toDouble / factor
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
extern
|
|
485
|
+
extern def floor(d: Double) at {}: Int =
|
|
486
486
|
js "Math.floor(${d})"
|
|
487
487
|
chez "(flonum->fixnum (floor ${d}))"
|
|
488
488
|
llvm """
|
|
@@ -490,7 +490,7 @@ extern pure def floor(d: Double): Int =
|
|
|
490
490
|
%z = fptosi double %i to %Int ret %Int %z
|
|
491
491
|
"""
|
|
492
492
|
|
|
493
|
-
extern
|
|
493
|
+
extern def ceil(d: Double) at {}: Int =
|
|
494
494
|
js "Math.ceil(${d})"
|
|
495
495
|
chez "(flonum->fixnum (ceiling ${d}))"
|
|
496
496
|
llvm """
|
|
@@ -511,7 +511,7 @@ def abs(n: Int): Int =
|
|
|
511
511
|
max(n, neg(n))
|
|
512
512
|
|
|
513
513
|
|
|
514
|
-
extern
|
|
514
|
+
extern def infixLt(x: Int, y: Int) at {}: Bool =
|
|
515
515
|
js "(${x} < ${y})"
|
|
516
516
|
chez "(< ${x} ${y})"
|
|
517
517
|
llvm """
|
|
@@ -522,7 +522,7 @@ extern pure def infixLt(x: Int, y: Int): Bool =
|
|
|
522
522
|
"""
|
|
523
523
|
vm "effekt::infixLt(Int, Int)"
|
|
524
524
|
|
|
525
|
-
extern
|
|
525
|
+
extern def infixLte(x: Int, y: Int) at {}: Bool =
|
|
526
526
|
js "(${x} <= ${y})"
|
|
527
527
|
chez "(<= ${x} ${y})"
|
|
528
528
|
llvm """
|
|
@@ -533,7 +533,7 @@ extern pure def infixLte(x: Int, y: Int): Bool =
|
|
|
533
533
|
"""
|
|
534
534
|
vm "effekt::infixLte(Int, Int)"
|
|
535
535
|
|
|
536
|
-
extern
|
|
536
|
+
extern def infixGt(x: Int, y: Int) at {}: Bool =
|
|
537
537
|
js "(${x} > ${y})"
|
|
538
538
|
chez "(> ${x} ${y})"
|
|
539
539
|
llvm """
|
|
@@ -544,7 +544,7 @@ extern pure def infixGt(x: Int, y: Int): Bool =
|
|
|
544
544
|
"""
|
|
545
545
|
vm "effekt::infixGt(Int, Int)"
|
|
546
546
|
|
|
547
|
-
extern
|
|
547
|
+
extern def infixGte(x: Int, y: Int) at {}: Bool =
|
|
548
548
|
js "(${x} >= ${y})"
|
|
549
549
|
chez "(>= ${x} ${y})"
|
|
550
550
|
llvm """
|
|
@@ -555,17 +555,17 @@ extern pure def infixGte(x: Int, y: Int): Bool =
|
|
|
555
555
|
"""
|
|
556
556
|
vm "effekt::infixGte(Int, Int)"
|
|
557
557
|
|
|
558
|
-
extern
|
|
558
|
+
extern def infixEq(x: Double, y: Double) at {}: Bool =
|
|
559
559
|
js "${x} === ${y}"
|
|
560
560
|
chez "(= ${x} ${y})"
|
|
561
561
|
vm "effekt::infixEq(Double, Double)"
|
|
562
562
|
|
|
563
|
-
extern
|
|
563
|
+
extern def infixNeq(x: Double, y: Double) at {}: Bool =
|
|
564
564
|
js "${x} !== ${y}"
|
|
565
565
|
chez "(not (= ${x} ${y}))"
|
|
566
566
|
vm "effekt::infixNeq(Double, Double)"
|
|
567
567
|
|
|
568
|
-
extern
|
|
568
|
+
extern def infixLt(x: Double, y: Double) at {}: Bool =
|
|
569
569
|
js "(${x} < ${y})"
|
|
570
570
|
chez "(< ${x} ${y})"
|
|
571
571
|
llvm """
|
|
@@ -576,12 +576,12 @@ extern pure def infixLt(x: Double, y: Double): Bool =
|
|
|
576
576
|
"""
|
|
577
577
|
vm "effekt::infixLt(Double, Double)"
|
|
578
578
|
|
|
579
|
-
extern
|
|
579
|
+
extern def infixLte(x: Double, y: Double) at {}: Bool =
|
|
580
580
|
js "(${x} <= ${y})"
|
|
581
581
|
chez "(<= ${x} ${y})"
|
|
582
582
|
vm "effekt::infixLte(Double, Double)"
|
|
583
583
|
|
|
584
|
-
extern
|
|
584
|
+
extern def infixGt(x: Double, y: Double) at {}: Bool =
|
|
585
585
|
js "(${x} > ${y})"
|
|
586
586
|
chez "(> ${x} ${y})"
|
|
587
587
|
llvm """
|
|
@@ -592,32 +592,32 @@ extern pure def infixGt(x: Double, y: Double): Bool =
|
|
|
592
592
|
"""
|
|
593
593
|
vm "effekt::infixGt(Double, Double)"
|
|
594
594
|
|
|
595
|
-
extern
|
|
595
|
+
extern def infixGte(x: Double, y: Double) at {}: Bool =
|
|
596
596
|
js "(${x} >= ${y})"
|
|
597
597
|
chez "(>= ${x} ${y})"
|
|
598
598
|
vm "effekt::infixGte(Double, Double)"
|
|
599
599
|
|
|
600
600
|
// TODO do we really need those? if yes, move to string.effekt
|
|
601
|
-
extern
|
|
601
|
+
extern def infixLt(x: String, y: String) at {}: Bool =
|
|
602
602
|
js "(${x} < ${y})"
|
|
603
603
|
chez "(string<? ${x} ${y})"
|
|
604
604
|
|
|
605
|
-
extern
|
|
605
|
+
extern def infixLte(x: String, y: String) at {}: Bool =
|
|
606
606
|
js "(${x} <= ${y})"
|
|
607
607
|
chez "(string<=? ${x} ${y})"
|
|
608
608
|
|
|
609
|
-
extern
|
|
609
|
+
extern def infixGt(x: String, y: String) at {}: Bool =
|
|
610
610
|
js "(${x} > ${y})"
|
|
611
611
|
chez "(string>? ${x} ${y})"
|
|
612
612
|
|
|
613
|
-
extern
|
|
613
|
+
extern def infixGte(x: String, y: String) at {}: Bool =
|
|
614
614
|
js "(${x} >= ${y})"
|
|
615
615
|
chez "(string>=? ${x} ${y})"
|
|
616
616
|
|
|
617
617
|
|
|
618
618
|
// Boolean operations
|
|
619
619
|
// ==================
|
|
620
|
-
extern
|
|
620
|
+
extern def not(b: Bool) at {}: Bool =
|
|
621
621
|
js "!${b}"
|
|
622
622
|
chez "(not ${b})"
|
|
623
623
|
llvm """
|
|
@@ -639,32 +639,32 @@ def infixAnd { first: => Bool } { second: => Bool }: Bool =
|
|
|
639
639
|
// ==================
|
|
640
640
|
|
|
641
641
|
/// Arithmetic left shift
|
|
642
|
-
extern
|
|
642
|
+
extern def bitwiseShl(x: Int, y: Int) at {}: Int =
|
|
643
643
|
js "(${x} << ${y})"
|
|
644
644
|
chez "(ash ${x} ${y})"
|
|
645
645
|
llvm "%z = shl %Int ${x}, ${y} ret %Int %z"
|
|
646
646
|
vm "effekt::bitwiseShl(Int, Int)"
|
|
647
647
|
|
|
648
648
|
/// Arithmetic right shift
|
|
649
|
-
extern
|
|
649
|
+
extern def bitwiseShr(x: Int, y: Int) at {}: Int =
|
|
650
650
|
js "(${x} >> ${y})"
|
|
651
651
|
chez "(ash ${x} (- ${y}))"
|
|
652
652
|
llvm "%z = ashr %Int ${x}, ${y} ret %Int %z"
|
|
653
653
|
vm "effekt::bitwiseShr(Int, Int)"
|
|
654
654
|
|
|
655
|
-
extern
|
|
655
|
+
extern def bitwiseAnd(x: Int, y: Int) at {}: Int =
|
|
656
656
|
js "(${x} & ${y})"
|
|
657
657
|
chez "(logand ${x} ${y})"
|
|
658
658
|
llvm "%z = and %Int ${x}, ${y} ret %Int %z"
|
|
659
659
|
vm "effekt::bitwiseAnd(Int, Int)"
|
|
660
660
|
|
|
661
|
-
extern
|
|
661
|
+
extern def bitwiseOr(x: Int, y: Int) at {}: Int =
|
|
662
662
|
js "(${x} | ${y})"
|
|
663
663
|
chez "(logior ${x} ${y})"
|
|
664
664
|
llvm "%z = or %Int ${x}, ${y} ret %Int %z"
|
|
665
665
|
vm "effekt::bitwiseOr(Int, Int)"
|
|
666
666
|
|
|
667
|
-
extern
|
|
667
|
+
extern def bitwiseXor(x: Int, y: Int) at {}: Int =
|
|
668
668
|
js "(${x} ^ ${y})"
|
|
669
669
|
chez "(logxor ${x} ${y})"
|
|
670
670
|
llvm "%z = xor %Int ${x}, ${y} ret %Int %z"
|
|
@@ -673,12 +673,12 @@ extern pure def bitwiseXor(x: Int, y: Int): Int =
|
|
|
673
673
|
|
|
674
674
|
// Byte operations
|
|
675
675
|
// ===============
|
|
676
|
-
extern
|
|
676
|
+
extern def toByte(n: Int) at {}: Byte =
|
|
677
677
|
js "${n}"
|
|
678
678
|
llvm "%z = trunc %Int ${n} to %Byte ret %Byte %z"
|
|
679
679
|
chez "${n}"
|
|
680
680
|
|
|
681
|
-
extern
|
|
681
|
+
extern def toInt(n: Byte) at {}: Int =
|
|
682
682
|
js "${n}"
|
|
683
683
|
llvm "%z = zext %Byte ${n} to %Int ret %Int %z"
|
|
684
684
|
vm "effekt::toInt(Byte)"
|
|
@@ -695,13 +695,13 @@ extern pure def toInt(n: Byte): Int =
|
|
|
695
695
|
// llvm: null?
|
|
696
696
|
|
|
697
697
|
/// The value used by the FFI to represent undefined values
|
|
698
|
-
extern
|
|
698
|
+
extern def undefined[A]() at {}: A =
|
|
699
699
|
js "undefined"
|
|
700
700
|
chez "#f"
|
|
701
701
|
vm "effekt::undefined()"
|
|
702
702
|
|
|
703
703
|
/// Is an FFI value undefined?
|
|
704
|
-
extern
|
|
704
|
+
extern def isUndefined[A](value: A) at {}: Bool =
|
|
705
705
|
js "(${value} === undefined || ${value} === null)"
|
|
706
706
|
chez "(eq? ${value} #f)"
|
|
707
707
|
vm "effekt::isUndefined[A](A)"
|
|
@@ -50,7 +50,7 @@ def wrongFormat(msg: String): Nothing / Exception[WrongFormat] =
|
|
|
50
50
|
/**
|
|
51
51
|
* A fatal runtime error that cannot be caught
|
|
52
52
|
*/
|
|
53
|
-
extern
|
|
53
|
+
extern def panic(msg: String) at io: Nothing =
|
|
54
54
|
js "(function() { throw ${msg} })()"
|
|
55
55
|
chez "(raise ${msg})"
|
|
56
56
|
llvm """
|
|
@@ -28,18 +28,18 @@ namespace js {
|
|
|
28
28
|
|
|
29
29
|
extern type JSConsole
|
|
30
30
|
|
|
31
|
-
extern
|
|
31
|
+
extern def newConsole() at io: JSConsole =
|
|
32
32
|
jsNode """readline.createInterface({
|
|
33
33
|
input: process.stdin,
|
|
34
34
|
output: process.stdout,
|
|
35
35
|
})"""
|
|
36
36
|
|
|
37
|
-
extern
|
|
37
|
+
extern def close(console: JSConsole) at io: Unit =
|
|
38
38
|
jsNode "${console}.close()"
|
|
39
39
|
|
|
40
|
-
extern
|
|
40
|
+
extern def readLine(console: JSConsole) at async: String =
|
|
41
41
|
jsNode "$effekt.capture(k => ${console}.once('line', k))"
|
|
42
|
-
extern
|
|
42
|
+
extern def writeLine(console: JSConsole, message: String) at io: Unit =
|
|
43
43
|
jsNode "${console}.output.write(${message} + '\\n')"
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -171,21 +171,21 @@ namespace internal {
|
|
|
171
171
|
declare void @c_fs_mkdir(%Pos, %Stack)
|
|
172
172
|
"""
|
|
173
173
|
|
|
174
|
-
extern
|
|
174
|
+
extern def openForReading(path: String) at async: Int =
|
|
175
175
|
jsNode "$effekt.capture(callback => open(${path}, 'r', callback))"
|
|
176
176
|
llvm """
|
|
177
177
|
call void @c_fs_open_reading(%Pos ${path}, %Stack %stack)
|
|
178
178
|
ret void
|
|
179
179
|
"""
|
|
180
180
|
|
|
181
|
-
extern
|
|
181
|
+
extern def openForWriting(path: String) at async: Int =
|
|
182
182
|
jsNode "$effekt.capture(callback => open(${path}, 'w', callback))"
|
|
183
183
|
llvm """
|
|
184
184
|
call void @c_fs_open_writing(%Pos ${path}, %Stack %stack)
|
|
185
185
|
ret void
|
|
186
186
|
"""
|
|
187
187
|
|
|
188
|
-
extern
|
|
188
|
+
extern def openForAppending(path: String) at async: Int =
|
|
189
189
|
jsNode "$effekt.capture(callback => open(${path}, 'a', callback))"
|
|
190
190
|
llvm """
|
|
191
191
|
call void @c_fs_open_appending(%Pos ${path}, %Stack %stack)
|
|
@@ -193,7 +193,7 @@ namespace internal {
|
|
|
193
193
|
"""
|
|
194
194
|
|
|
195
195
|
/// The buffer must be kept alive by using it after the call
|
|
196
|
-
extern
|
|
196
|
+
extern def read(file: Int, buffer: ByteArray, offset: Int, size: Int, position: Int) at async: Int =
|
|
197
197
|
jsNode "$effekt.capture(callback => read(${file}, ${buffer}, ${offset}, ${size}, ${position}, callback))"
|
|
198
198
|
llvm """
|
|
199
199
|
call void @c_fs_read(%Int ${file}, %Pos ${buffer}, %Int ${offset}, %Int ${size}, %Int ${position}, %Stack %stack)
|
|
@@ -201,21 +201,21 @@ namespace internal {
|
|
|
201
201
|
"""
|
|
202
202
|
|
|
203
203
|
/// The buffer must be kept alive by using it after the call
|
|
204
|
-
extern
|
|
204
|
+
extern def write(file: Int, buffer: ByteArray, offset: Int, size: Int, position: Int) at async: Int =
|
|
205
205
|
jsNode "$effekt.capture(callback => write(${file}, ${buffer}, ${offset}, ${size}, ${position}, callback))"
|
|
206
206
|
llvm """
|
|
207
207
|
call void @c_fs_write(%Int ${file}, %Pos ${buffer}, %Int ${offset}, %Int ${size}, %Int ${position}, %Stack %stack)
|
|
208
208
|
ret void
|
|
209
209
|
"""
|
|
210
210
|
|
|
211
|
-
extern
|
|
211
|
+
extern def close(file: Int) at async: Int =
|
|
212
212
|
jsNode "$effekt.capture(callback => close(${file}, callback))"
|
|
213
213
|
llvm """
|
|
214
214
|
call void @c_fs_close(%Int ${file}, %Stack %stack)
|
|
215
215
|
ret void
|
|
216
216
|
"""
|
|
217
217
|
|
|
218
|
-
extern
|
|
218
|
+
extern def mkdir(path: String) at async: Int =
|
|
219
219
|
jsNode "$effekt.capture(callback => mkdir(${path}, callback))"
|
|
220
220
|
llvm """
|
|
221
221
|
call void @c_fs_mkdir(%Pos ${path}, %Stack %stack)
|
|
@@ -15,18 +15,18 @@ namespace js {
|
|
|
15
15
|
|
|
16
16
|
extern type JSServer // = net.Server
|
|
17
17
|
extern type JSSocket // = net.Socket
|
|
18
|
-
extern
|
|
18
|
+
extern def server() at io: JSServer =
|
|
19
19
|
jsNode "net.createServer()"
|
|
20
|
-
extern
|
|
20
|
+
extern def listen(server: JSServer, port: Int, host: String, listener: JSSocket => Unit at {io, async, global}) at io: Unit =
|
|
21
21
|
jsNode "listen(${server}, ${port}, ${host}, (socket) => $effekt.runToplevel((ks, k) => (${listener})(socket, ks, k)))"
|
|
22
22
|
|
|
23
|
-
extern
|
|
23
|
+
extern def send(socket: JSSocket, data: ByteArray) at async: Unit =
|
|
24
24
|
jsNode "$effekt.capture(callback => ${socket}.write(${data}, callback))"
|
|
25
25
|
|
|
26
|
-
extern
|
|
26
|
+
extern def receive(socket: JSSocket) at async: ByteArray =
|
|
27
27
|
jsNode "$effekt.capture(callback => ${socket}.once('data', callback))"
|
|
28
28
|
|
|
29
|
-
extern
|
|
29
|
+
extern def end(socket: JSSocket) at async: Unit =
|
|
30
30
|
jsNode "$effekt.capture(k => ${socket}.end(k))"
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -4,7 +4,7 @@ extern llvm """
|
|
|
4
4
|
declare void @c_timer_start(%Int, %Stack)
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
extern
|
|
7
|
+
extern def wait(millis: Int) at async: Unit =
|
|
8
8
|
js "$effekt.capture(k => setTimeout(() => k($effekt.unit), ${millis}))"
|
|
9
9
|
llvm """
|
|
10
10
|
call void @c_timer_start(%Int ${millis}, %Stack %stack)
|