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)

Download basics_tristate.ek9

Output

Found Steve
No user with id 2
name set: false
name set: true
items set: true
items set: true