48 lines
1.0 KiB
Plaintext
48 lines
1.0 KiB
Plaintext
### Tuples
|
|
|
|
[
|
|
Datatype tuples
|
|
Funcon tuple-elements
|
|
Funcon tuple-zip
|
|
]
|
|
|
|
|
|
Meta-variables
|
|
T1, T2 <: values
|
|
T1+, T2+ <: values+
|
|
T*, T1*, T2* <: values*
|
|
|
|
|
|
Datatype
|
|
tuples(T*) ::= tuple(_:T*)
|
|
/*
|
|
`T*` can be any sequence of types, including `( )` and `values*`.
|
|
|
|
The values of type `tuples(T1, ..., Tn)` are of the form `tuple(V1, ..., Vn)`
|
|
with `V1:T1`, ..., `Vn:Tn`.
|
|
*/
|
|
|
|
|
|
Funcon
|
|
tuple-elements(_:tuples(T*)) : =>(T*)
|
|
Rule
|
|
tuple-elements(tuple(V*:T*)) ~> V*
|
|
|
|
|
|
Funcon
|
|
tuple-zip(_:tuples(values*), _:tuples(values*)) : =>(tuples(values,values))*
|
|
/*
|
|
`tuple-zip(TV1, TV2)` takes two tuples, and returns the sequence of pairs of
|
|
their elements, provided that they have the same length. If they have
|
|
different lengths, the last elements of the longer sequence are ignored.
|
|
*/
|
|
Rule
|
|
tuple-zip(tuple(V1:T1, V1*:T1*), tuple(V2:T2, V2*:T2*))
|
|
~> (tuple(V1, V2), tuple-zip(tuple(V1*), tuple(V2*)))
|
|
Rule
|
|
tuple-zip(tuple( ), tuple( )) ~> ( )
|
|
Rule
|
|
tuple-zip(tuple(V1+:T1+), tuple( )) ~> ( )
|
|
Rule
|
|
tuple-zip(tuple( ), tuple(V2+:T2+)) ~> ( )
|