11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
auto localVarPattern = GetValueType< LocalVar >( ANYTERM( _ ) );
// LocalVar type checking against another LocalVar: unify their types.
e.typeCheckingRuleSet()->addTypeCheckingRule(
ParamPat( localVarPattern ),
ValueToEIR( ValuePattern(
ANYTERM( _ ),
localVarPattern,
ANYTERM( _ ) ) ),
[]( const Term& lhs, const Term& rhs, const TypeCheckingContext& tcc ) -> TCGen
{
auto lvarType = *FromValue< LocalVarType >( *EIRToValue( EIRToValuePattern( lhs )->type() ) );
auto rhsVal = *EIRToValuePattern( rhs );
auto rvarType = *FromValue< LocalVarType >( *EIRToValue( rhsVal.type() ) );
for( auto&& [s, tcc] : Unify( lvarType.type(), rvarType.type(), tcc ) )
{
co_yield { ValueToEIR( Value( ValueToEIR( ToValue( LocalVarType( s ) ) ),
rhsVal.val() ).setLocationId( rhsVal.locationId() ) ), tcc };
}
} );
}
}
|
|
<
<
<
>
|
>
|
|
>
|
|
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
auto localVarPattern = GetValueType< LocalVar >( ANYTERM( _ ) );
// LocalVar type checking against another LocalVar: unify their types.
e.typeCheckingRuleSet()->addTypeCheckingRule(
ParamPat( localVarPattern ),
ValueToEIR( ValuePattern( ANYTERM( _ ), localVarPattern, ANYTERM( _ ) ) ),
[]( const Term& lhs, const Term& rhs, const TypeCheckingContext& tcc ) -> TCGen
{
auto lvarType =
*FromValue< LocalVarType >( *EIRToValue( EIRToValuePattern( lhs )->type() ) );
auto rhsVal = *EIRToValuePattern( rhs );
auto rvarType = *FromValue< LocalVarType >( *EIRToValue( rhsVal.type() ) );
for( auto&& [s, tcc] : Unify( lvarType.type(), rvarType.type(), tcc ) )
{
co_yield { ValueToEIR(
Value( ValueToEIR( ToValue( LocalVarType( s ) ) ), rhsVal.val() )
.setLocationId( rhsVal.locationId() ) ),
tcc };
}
} );
}
} // namespace goose::builtins
|