Unset, set and the guard
The complete source of basics_tristate.ek9, compiled by the EK9 compiler. Shown on basics.html.
#!ek9 defines module site.basics.tristate defines record User name <- String() User() -> name as String this.name: name default User() default operator ? defines function lookup() -> database as Dict of (Integer, User) id as Integer <- rtn as String: String() if user <- database.getOrDefault(id, User()) // user is SET: the lookup succeeded, the key was found rtn: `Found ${user.name}` else // user is UNSET (the default was used): the key was not in the database // the guard ensures user is never used unset rtn: `No user with id ${id}` defines program TriState() stdout <- Stdout() database <- {1: User("Steve")} stdout.println(lookup(database, 1)) stdout.println(lookup(database, 2)) name <- String() stdout.println(`name set: ${name?}`) // false - unset name: "Steve" stdout.println(`name set: ${name?}`) // true - set items <- List() of String stdout.println(`items set: ${items?}`) // true - set (empty is valid for collections) items += "first" stdout.println(`items set: ${items?}`) // true - still set (now has 1 item)
Output
Found Steve No user with id 2 name set: false name set: true items set: true items set: true