Disjunction Types
MUFL defines a type expression <type1> || <type2> to mean a value of either <type1> or <type2>.
Nullable Types
MUFL defines a type expression <type>+ to represent the special disjunction <type> || NIL.
This is why boolean in MUFL is
true+–trueis a one-element type and nullable-true is the same as ‘true or null’, that is, boolean.
Value Sets
MUFL defines a value set (sometimes thought of as an enumerated type) as a type expression of the form <a,b,c, ... >, where a, b, and c are strings. Values inside value sets can only be strings. Value sets can be assigned to strings, but assinging a string to a variable declared as a value set is an error.
metadef t_values: <$good, $bad, $soso>.
MyValue is t_values = $good. // OK
HisValue is t_values = $awful. // Compile error because $awful is not part of the value set 't_values'
Constituent Types
Given a type X, which is reduceable (for example, a function), it is sometimes convenient to declare a type that represents the type of the argument of function of type X, or the type of the return value of the function of type X. We call them constituent types because they are used as building blocks to construct more complex types.
A type can be declared to be a constituent type of a complex type using the / syntax with the name of the constituent element, for example /reducer or /product.
/reducer refers to the argument type of a complex type (e.g. a function)
/product refers to the result type of a complex type
For example:
metadef X: (int->str->str). // function of two parameters '(int, str)' returning a 'str'
metadef X_arg1: X/reducer. // resolves to 'int'
metadef X_arg2: X/product/reducer. // resoves to 'str' - second argument
metadef X_ret: X/product/product. // resolves to 'str' - return type
Type-of-Variable Expression
Given a variable defined in the current scope, it is often convenient to declare a variable of the same type. This declaration uses the ? syntax:
A is int(,) = (1,2,3).
B is ?A = (5,6,7).
metadef B_element_type: ?B/reducer. // will derive `int`