@effekt-lang/effekt 0.45.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.
@@ -60,7 +60,7 @@ $effekt.readln = function readln$impl(callback) {
60
60
  }
61
61
  """
62
62
 
63
- extern async def readln(): String =
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 pure def show(value: Int): String =
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 pure def show(value: Double): String =
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 pure def show(value: Char): String =
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 pure def show(value: Byte): String =
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 pure def genericShow[R](value: R): String =
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 io def inspect[R](value: R): Unit =
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 pure def infixConcat(s1: String, s2: String): String =
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 pure def length(str: String): Int =
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 pure def unsafeSubstring(str: String, from: Int, to: Int): String =
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 io def random(): Double =
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 {r} = js "r.fresh(${t})"
174
- // extern io def freshGlobal[T](t: T): Ref[T] at {global} = js "$effekt.fresh(${t})"
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 pure def genericCompareImpl[R](x: R, y: R): Int =
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 pure def equals[R](x: R, y: R): Bool =
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 pure def infixEq(x: Unit, y: Unit): Bool =
233
+ extern def infixEq(x: Unit, y: Unit) at {}: Bool =
234
234
  default { true }
235
235
 
236
- extern pure def infixEq(x: Int, y: Int): Bool =
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 pure def infixNeq(x: Int, y: Int): Bool =
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 pure def infixEq(x: Char, y: Char): Bool =
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 pure def infixNeq(x: Char, y: Char): Bool =
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 pure def infixEq(x: String, y: String): Bool =
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 pure def infixEq(x: Bool, y: Bool): Bool =
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 pure def infixNeq(x: Bool, y: Bool): Bool =
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 pure def infixAdd(x: Int, y: Int): Int =
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 pure def infixMul(x: Int, y: Int): Int =
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 pure def infixDiv(x: Int, y: Int): Int =
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 pure def infixSub(x: Int, y: Int): Int =
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 pure def mod(x: Int, y: Int): Int =
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 pure def infixAdd(x: Double, y: Double): Double =
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 pure def infixMul(x: Double, y: Double): Double =
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 pure def infixSub(x: Double, y: Double): Double =
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 pure def infixDiv(x: Double, y: Double): Double =
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 pure def cos(x: Double): Double =
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 pure def sin(x: Double): Double =
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 pure def atan(x: Double): Double =
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 pure def tan(x: Double): Double =
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 pure def sqrt(x: Double): Double =
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 pure def log(x: Double): Double =
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 pure def log1p(x: Double): Double =
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 pure def exp(x: Double): Double =
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 pure def pow(base: Double, exponent: Double): Double =
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 pure def _pi(): Double =
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 pure def toInt(d: Double): Int =
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 pure def toDouble(d: Int): Double =
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 pure def round(d: Double): Int =
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 pure def floor(d: Double): Int =
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 pure def ceil(d: Double): Int =
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 pure def infixLt(x: Int, y: Int): Bool =
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 pure def infixLte(x: Int, y: Int): Bool =
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 pure def infixGt(x: Int, y: Int): Bool =
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 pure def infixGte(x: Int, y: Int): Bool =
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 pure def infixEq(x: Double, y: Double): Bool =
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 pure def infixNeq(x: Double, y: Double): Bool =
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 pure def infixLt(x: Double, y: Double): Bool =
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 pure def infixLte(x: Double, y: Double): Bool =
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 pure def infixGt(x: Double, y: Double): Bool =
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 pure def infixGte(x: Double, y: Double): Bool =
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 pure def infixLt(x: String, y: String): Bool =
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 pure def infixLte(x: String, y: String): Bool =
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 pure def infixGt(x: String, y: String): Bool =
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 pure def infixGte(x: String, y: String): Bool =
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 pure def not(b: Bool): Bool =
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 pure def bitwiseShl(x: Int, y: Int): Int =
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 pure def bitwiseShr(x: Int, y: Int): Int =
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 pure def bitwiseAnd(x: Int, y: Int): Int =
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 pure def bitwiseOr(x: Int, y: Int): Int =
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 pure def bitwiseXor(x: Int, y: Int): Int =
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 pure def toByte(n: Int): Byte =
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 pure def toInt(n: Byte): Int =
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 pure def undefined[A](): A =
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 pure def isUndefined[A](value: A): Bool =
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 io def panic(msg: String): Nothing =
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 io def newConsole(): JSConsole =
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 io def close(console: JSConsole): Unit =
37
+ extern def close(console: JSConsole) at io: Unit =
38
38
  jsNode "${console}.close()"
39
39
 
40
- extern async def readLine(console: JSConsole): String =
40
+ extern def readLine(console: JSConsole) at async: String =
41
41
  jsNode "$effekt.capture(k => ${console}.once('line', k))"
42
- extern io def writeLine(console: JSConsole, message: String): Unit =
42
+ extern def writeLine(console: JSConsole, message: String) at io: Unit =
43
43
  jsNode "${console}.output.write(${message} + '\\n')"
44
44
  }
45
45
 
@@ -456,7 +456,7 @@ namespace internal {
456
456
  }
457
457
  """
458
458
 
459
- extern pure def errorNumber(errno: Int): Int =
459
+ extern def errorNumber(errno: Int) at {}: Int =
460
460
  jsNode "errorNumber(${errno})"
461
461
  llvm """
462
462
  %z = call %Int @c_error_number(%Int ${errno})
@@ -171,21 +171,21 @@ namespace internal {
171
171
  declare void @c_fs_mkdir(%Pos, %Stack)
172
172
  """
173
173
 
174
- extern async def openForReading(path: String): Int =
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 async def openForWriting(path: String): Int =
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 async def openForAppending(path: String): Int =
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 async def read(file: Int, buffer: ByteArray, offset: Int, size: Int, position: Int): Int =
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 async def write(file: Int, buffer: ByteArray, offset: Int, size: Int, position: Int): Int =
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 async def close(file: Int): Int =
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 async def mkdir(path: String): Int =
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 io def server(): JSServer =
18
+ extern def server() at io: JSServer =
19
19
  jsNode "net.createServer()"
20
- extern io def listen(server: JSServer, port: Int, host: String, listener: JSSocket => Unit at {io, async, global}): Unit =
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 async def send(socket: JSSocket, data: ByteArray): Unit =
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 async def receive(socket: JSSocket): ByteArray =
26
+ extern def receive(socket: JSSocket) at async: ByteArray =
27
27
  jsNode "$effekt.capture(callback => ${socket}.once('data', callback))"
28
28
 
29
- extern async def end(socket: JSSocket): Unit =
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 async def wait(millis: Int): Unit =
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)