More consistent assignment syntax in Wipple

I've been trying to simplify and consolidate many different Wipple features. Last time was function syntax, this time is assignment syntax!

Wipple


I’ve been trying to simplify and consolidate many different Wipple features. Last time was function syntax, this time is assignment syntax!

What is there to consolidate? Well, variable assignment (a : b) is actually fine and I plan to make no changes there. Instead, I am standardizing the syntax for various other declarations so that they all use the : operator!

Variable assignment

First, just a recap on variable assignment, which introduces a new name into the current scope:

x : 42

Person : data {
    name :: Text
    age :: Number
}

-- etc.

Conversions

Formerly called “relations” and before that “conformances”, I decided to rename this declaration yet again to describe what is actually going on. In Wipple, values can be converted between each other implicitly, simulating interfaces in other languages. For example, we can convert a Person value into a Text value used by show:

(p :: Person) is Text : format "_ is _ years old" (p name) (p age)

Thanks to Wipple’s new static type system, we can also express conversions on the type level, similar to Haskell’s typeclasses:

Person is Equal : p1 -> p2 -> p1 name = p2 name
Person is Order : p1 -> p2 -> p1 age < p2 age

Type functions

Thanks to this streamlined syntax, conversions can now be parameterized using type functions. (I wrote about this a while ago!) This lets us define abstract relationships between two traits:

Equal : for T -> trait (T -> T -> Boolean)

Ordering : enum Less-Than Greater-Than Equal
Order : for T -> trait (T -> T -> Ordering)

-- All orderable values are automatically equatable
for T (order : T is Order) -> T is Equal :
  a -> b -> when? (order a b) (Ordering Equal)