@@ -42,14 +42,7 @@ pub enum Value {
42
42
43
43
/// The type of types.
44
44
Universe ( UniverseLevel ) ,
45
- /// Constants.
46
- Constant ( Constant ) ,
47
- /// Ordered sequences.
48
- Sequence ( Vec < Arc < Value > > ) ,
49
- /// Record types.
50
- RecordType ( RecordTypeClosure ) ,
51
- /// Record terms.
52
- RecordTerm ( BTreeMap < String , Arc < Value > > ) ,
45
+
53
46
/// Function types.
54
47
///
55
48
/// Also known as: pi type, dependent product type.
@@ -59,6 +52,17 @@ pub enum Value {
59
52
/// Also known as: lambda abstraction, anonymous function.
60
53
FunctionTerm ( String , Closure ) ,
61
54
55
+ /// Record types.
56
+ RecordType ( RecordTypeClosure ) ,
57
+ /// Record terms.
58
+ RecordTerm ( BTreeMap < String , Arc < Value > > ) ,
59
+
60
+ /// Ordered sequences.
61
+ Sequence ( Vec < Arc < Value > > ) ,
62
+
63
+ /// Constants.
64
+ Constant ( Constant ) ,
65
+
62
66
/// Error sentinel.
63
67
Error ,
64
68
}
@@ -100,14 +104,14 @@ pub enum Head {
100
104
/// An eliminator, to be used in the spine of an elimination.
101
105
#[ derive( Clone , Debug ) ]
102
106
pub enum Elim {
103
- /// Record eliminators.
104
- ///
105
- /// Also known as: record projections, field lookup.
106
- Record ( String ) ,
107
107
/// Function eliminators.
108
108
///
109
109
/// Also known as: function application.
110
110
Function ( Arc < LazyValue > ) ,
111
+ /// Record eliminators.
112
+ ///
113
+ /// Also known as: record projections, field lookup.
114
+ Record ( String ) ,
111
115
}
112
116
113
117
/// Closure, capturing the current universe offset and the current locals in scope.
@@ -259,9 +263,6 @@ pub fn eval_term(
259
263
term : & Term ,
260
264
) -> Arc < Value > {
261
265
match term {
262
- Term :: Universe ( level) => Arc :: new ( Value :: universe (
263
- ( * level + universe_offset) . unwrap ( ) , // FIXME: Handle overflow
264
- ) ) ,
265
266
Term :: Global ( name) => {
266
267
let head = Head :: Global ( name. into ( ) , universe_offset) ;
267
268
match globals. get ( name) {
@@ -282,16 +283,17 @@ pub fn eval_term(
282
283
None => Arc :: new ( Value :: Stuck ( head, Vec :: new ( ) ) ) ,
283
284
}
284
285
}
285
- Term :: Constant ( constant) => Arc :: new ( Value :: Constant ( constant. clone ( ) ) ) ,
286
- Term :: Sequence ( term_entries) => {
287
- let value_entries = term_entries
288
- . iter ( )
289
- . map ( |entry_term| eval_term ( globals, universe_offset, values, entry_term) )
290
- . collect ( ) ;
291
286
292
- Arc :: new ( Value :: Sequence ( value_entries) )
293
- }
294
287
Term :: Ann ( term, _) => eval_term ( globals, universe_offset, values, term) ,
288
+
289
+ Term :: Universe ( level) => Arc :: new ( Value :: universe (
290
+ ( * level + universe_offset) . unwrap ( ) , // FIXME: Handle overflow
291
+ ) ) ,
292
+ Term :: Lift ( term, offset) => {
293
+ let universe_offset = ( universe_offset + * offset) . unwrap ( ) ; // FIXME: Handle overflow
294
+ eval_term ( globals, universe_offset, values, term)
295
+ }
296
+
295
297
Term :: RecordType ( type_entries) => Arc :: new ( Value :: RecordType ( RecordTypeClosure :: new (
296
298
universe_offset,
297
299
values. clone ( ) ,
@@ -312,6 +314,7 @@ pub fn eval_term(
312
314
let head = eval_term ( globals, universe_offset, values, head) ;
313
315
apply_record_elim ( & head, label)
314
316
}
317
+
315
318
Term :: FunctionType ( input_name_hint, input_type, output_type) => {
316
319
Arc :: new ( Value :: FunctionType (
317
320
input_name_hint. clone ( ) ,
@@ -328,10 +331,18 @@ pub fn eval_term(
328
331
let input = LazyValue :: eval_term ( universe_offset, values. clone ( ) , input. clone ( ) ) ;
329
332
apply_function_elim ( globals, & head, Arc :: new ( input) )
330
333
}
331
- Term :: Lift ( term, offset) => {
332
- let universe_offset = ( universe_offset + * offset) . unwrap ( ) ; // FIXME: Handle overflow
333
- eval_term ( globals, universe_offset, values, term)
334
+
335
+ Term :: Sequence ( term_entries) => {
336
+ let value_entries = term_entries
337
+ . iter ( )
338
+ . map ( |entry_term| eval_term ( globals, universe_offset, values, entry_term) )
339
+ . collect ( ) ;
340
+
341
+ Arc :: new ( Value :: Sequence ( value_entries) )
334
342
}
343
+
344
+ Term :: Constant ( constant) => Arc :: new ( Value :: Constant ( constant. clone ( ) ) ) ,
345
+
335
346
Term :: Error => Arc :: new ( Value :: Error ) ,
336
347
}
337
348
}
@@ -425,11 +436,11 @@ fn read_back_spine(
425
436
} ;
426
437
427
438
spine. iter ( ) . fold ( head, |head, elim| match elim {
428
- Elim :: Record ( label) => Term :: RecordElim ( Arc :: new ( head) , label. clone ( ) ) ,
429
439
Elim :: Function ( input) => {
430
440
let input = read_back_value ( globals, local_size, unfold, input. force ( globals) ) ;
431
441
Term :: FunctionElim ( Arc :: new ( head) , Arc :: new ( input) )
432
442
}
443
+ Elim :: Record ( label) => Term :: RecordElim ( Arc :: new ( head) , label. clone ( ) ) ,
433
444
} )
434
445
}
435
446
@@ -448,17 +459,25 @@ pub fn read_back_value(
448
459
} ,
449
460
450
461
Value :: Universe ( level) => Term :: Universe ( * level) ,
451
- Value :: Constant ( constant) => Term :: Constant ( constant. clone ( ) ) ,
452
- Value :: Sequence ( value_entries) => {
453
- let term_entries = value_entries
454
- . iter ( )
455
- . map ( |value_entry| {
456
- Arc :: new ( read_back_value ( globals, local_size, unfold, value_entry) )
457
- } )
458
- . collect ( ) ;
459
462
460
- Term :: Sequence ( term_entries)
463
+ Value :: FunctionType ( input_name_hint, input_type, output_closure) => {
464
+ let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
465
+ let input_type = Arc :: new ( read_back_value ( globals, local_size, unfold, input_type) ) ;
466
+ let output_type = output_closure. elim ( globals, local) ;
467
+ let output_type =
468
+ read_back_value ( globals, local_size. increment ( ) , unfold, & output_type) ;
469
+
470
+ Term :: FunctionType ( input_name_hint. clone ( ) , input_type, Arc :: new ( output_type) )
461
471
}
472
+ Value :: FunctionTerm ( input_name_hint, output_closure) => {
473
+ let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
474
+ let output_term = output_closure. elim ( globals, local) ;
475
+ let output_term =
476
+ read_back_value ( globals, local_size. increment ( ) , unfold, & output_term) ;
477
+
478
+ Term :: FunctionTerm ( input_name_hint. clone ( ) , Arc :: new ( output_term) )
479
+ }
480
+
462
481
Value :: RecordType ( closure) => {
463
482
let mut local_size = local_size;
464
483
let mut type_entries = Vec :: with_capacity ( closure. entries . len ( ) ) ;
@@ -486,24 +505,20 @@ pub fn read_back_value(
486
505
487
506
Term :: RecordTerm ( term_entries)
488
507
}
489
- Value :: FunctionType ( input_name_hint, input_type, output_closure) => {
490
- let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
491
- let input_type = Arc :: new ( read_back_value ( globals, local_size, unfold, input_type) ) ;
492
- let output_type = output_closure. elim ( globals, local) ;
493
- let output_type =
494
- read_back_value ( globals, local_size. increment ( ) , unfold, & output_type) ;
495
508
496
- Term :: FunctionType ( input_name_hint . clone ( ) , input_type , Arc :: new ( output_type ) )
497
- }
498
- Value :: FunctionTerm ( input_name_hint , output_closure ) => {
499
- let local = Arc :: new ( Value :: local ( local_size . next_level ( ) ) ) ;
500
- let output_term = output_closure . elim ( globals, local ) ;
501
- let output_term =
502
- read_back_value ( globals , local_size . increment ( ) , unfold , & output_term ) ;
509
+ Value :: Sequence ( value_entries ) => {
510
+ let term_entries = value_entries
511
+ . iter ( )
512
+ . map ( |value_entry| {
513
+ Arc :: new ( read_back_value ( globals, local_size , unfold , value_entry ) )
514
+ } )
515
+ . collect ( ) ;
503
516
504
- Term :: FunctionTerm ( input_name_hint . clone ( ) , Arc :: new ( output_term ) )
517
+ Term :: Sequence ( term_entries )
505
518
}
506
519
520
+ Value :: Constant ( constant) => Term :: Constant ( constant. clone ( ) ) ,
521
+
507
522
Value :: Error => Term :: Error ,
508
523
}
509
524
}
@@ -561,18 +576,33 @@ fn is_equal(globals: &Globals, local_size: LocalSize, value0: &Value, value1: &V
561
576
}
562
577
563
578
( Value :: Universe ( level0) , Value :: Universe ( level1) ) => level0 == level1,
564
- ( Value :: Constant ( constant0) , Value :: Constant ( constant1) ) => constant0 == constant1,
565
- ( Value :: Sequence ( value_entries0) , Value :: Sequence ( value_entries1) ) => {
566
- if value_entries0. len ( ) != value_entries1. len ( ) {
579
+
580
+ (
581
+ Value :: FunctionType ( _, input_type0, output_closure0) ,
582
+ Value :: FunctionType ( _, input_type1, output_closure1) ,
583
+ ) => {
584
+ if !is_equal ( globals, local_size, input_type1, input_type0) {
567
585
return false ;
568
586
}
569
587
570
- Iterator :: zip ( value_entries0. iter ( ) , value_entries1. iter ( ) ) . all (
571
- |( value_entry0, value_entry1) | {
572
- is_equal ( globals, local_size, value_entry0, value_entry1)
573
- } ,
588
+ let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
589
+ is_equal (
590
+ globals,
591
+ local_size. increment ( ) ,
592
+ & output_closure0. elim ( globals, local. clone ( ) ) ,
593
+ & output_closure1. elim ( globals, local) ,
574
594
)
575
595
}
596
+ ( Value :: FunctionTerm ( _, output_closure0) , Value :: FunctionTerm ( _, output_closure1) ) => {
597
+ let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
598
+ is_equal (
599
+ globals,
600
+ local_size. increment ( ) ,
601
+ & output_closure0. elim ( globals, local. clone ( ) ) ,
602
+ & output_closure1. elim ( globals, local) ,
603
+ )
604
+ }
605
+
576
606
( Value :: RecordType ( closure0) , Value :: RecordType ( closure1) ) => {
577
607
if closure0. entries . len ( ) != closure1. entries . len ( ) {
578
608
return false ;
@@ -617,32 +647,21 @@ fn is_equal(globals: &Globals, local_size: LocalSize, value0: &Value, value1: &V
617
647
} ,
618
648
)
619
649
}
620
- (
621
- Value :: FunctionType ( _, input_type0, output_closure0) ,
622
- Value :: FunctionType ( _, input_type1, output_closure1) ,
623
- ) => {
624
- if !is_equal ( globals, local_size, input_type1, input_type0) {
650
+
651
+ ( Value :: Sequence ( value_entries0) , Value :: Sequence ( value_entries1) ) => {
652
+ if value_entries0. len ( ) != value_entries1. len ( ) {
625
653
return false ;
626
654
}
627
655
628
- let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
629
- is_equal (
630
- globals,
631
- local_size. increment ( ) ,
632
- & output_closure0. elim ( globals, local. clone ( ) ) ,
633
- & output_closure1. elim ( globals, local) ,
634
- )
635
- }
636
- ( Value :: FunctionTerm ( _, output_closure0) , Value :: FunctionTerm ( _, output_closure1) ) => {
637
- let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
638
- is_equal (
639
- globals,
640
- local_size. increment ( ) ,
641
- & output_closure0. elim ( globals, local. clone ( ) ) ,
642
- & output_closure1. elim ( globals, local) ,
656
+ Iterator :: zip ( value_entries0. iter ( ) , value_entries1. iter ( ) ) . all (
657
+ |( value_entry0, value_entry1) | {
658
+ is_equal ( globals, local_size, value_entry0, value_entry1)
659
+ } ,
643
660
)
644
661
}
645
662
663
+ ( Value :: Constant ( constant0) , Value :: Constant ( constant1) ) => constant0 == constant1,
664
+
646
665
// Errors are always treated as subtypes, regardless of what they are compared with.
647
666
( Value :: Error , _) | ( _, Value :: Error ) => true ,
648
667
// Anything else is not equal!
@@ -679,6 +698,27 @@ pub fn is_subtype(
679
698
}
680
699
681
700
( Value :: Universe ( level0) , Value :: Universe ( level1) ) => level0 <= level1,
701
+
702
+ (
703
+ Value :: FunctionType ( _, input_type0, output_closure0) ,
704
+ Value :: FunctionType ( _, input_type1, output_closure1) ,
705
+ ) => {
706
+ if !is_subtype ( globals, local_size, input_type1, input_type0) {
707
+ return false ;
708
+ }
709
+
710
+ let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
711
+ let output_term0 = output_closure0. elim ( globals, local. clone ( ) ) ;
712
+ let output_term1 = output_closure1. elim ( globals, local) ;
713
+
714
+ is_subtype (
715
+ globals,
716
+ local_size. increment ( ) ,
717
+ & output_term0,
718
+ & output_term1,
719
+ )
720
+ }
721
+
682
722
( Value :: RecordType ( closure0) , Value :: RecordType ( closure1) ) => {
683
723
if closure0. entries . len ( ) != closure1. entries . len ( ) {
684
724
return false ;
@@ -712,25 +752,6 @@ pub fn is_subtype(
712
752
713
753
true
714
754
}
715
- (
716
- Value :: FunctionType ( _, input_type0, output_closure0) ,
717
- Value :: FunctionType ( _, input_type1, output_closure1) ,
718
- ) => {
719
- if !is_subtype ( globals, local_size, input_type1, input_type0) {
720
- return false ;
721
- }
722
-
723
- let local = Arc :: new ( Value :: local ( local_size. next_level ( ) ) ) ;
724
- let output_term0 = output_closure0. elim ( globals, local. clone ( ) ) ;
725
- let output_term1 = output_closure1. elim ( globals, local) ;
726
-
727
- is_subtype (
728
- globals,
729
- local_size. increment ( ) ,
730
- & output_term0,
731
- & output_term1,
732
- )
733
- }
734
755
735
756
// Errors are always treated as subtypes, regardless of what they are compared with.
736
757
( Value :: Error , _) | ( _, Value :: Error ) => true ,
0 commit comments