The types in most programming languages are only technical types. If a variable has a type, you may know that it is of type integer or double, but you don't know if it's a length or an area. The types required are semantic types. stypes: length area time speed scalar allowed expressions: length = length length + length : length time = time time + time : time scalar * length : length scalar * time : time sqrt(area) : length speed = speed length / time : speed foo : time bar : length baz : length bar = 23 baz = 42.3 foo = 17.4 speed'variable = (bar + baz) / foo baz = length'5 bar = length'foo Python's dynamic type checking remains. These type names are all user defined. A type name with a tick before an expression means that this expression has the semantic type of the type name. The function names in the allowed expressions statement don't need to be names of existing functions.