Set a default user name only if no name has been provided.

← Control Flow · Ref: Q1220

The :=? guarded assignment operator assigns a value ONLY if the target variable is currently unset. If the variable already has a value, the assignment is skipped.

  name <- String()
  name :=? "Guest"
  //name is now "Guest" because it was unset
  name2 <- "Alice"
  name2 :=? "Guest"
  //name2 is still "Alice" — the :=? was skipped

This is an ASSIGNMENT operator — it sets a variable.

See Q1038 for :=? with config fallback chains.

Example

defines module qa.flow.guardassign.string

  defines function

    lookupUserName()
      <- rtn <- String()
      //Simulates: no user name found in database

    lookupDisplayName()
      <- rtn <- "RegisteredUser"

  defines program

    GuardAssignStringDemo()
      stdout <- Stdout()

      // === VARIABLE IS UNSET — :=? assigns the default ===

      userName <- String()
      defaultName <- "Guest"
      userName :=? defaultName
      stdout.println(`User name: ${userName}`)

      // === VARIABLE IS ALREADY SET — :=? is skipped ===

      knownName <- lookupUserName()
      knownName :=? "Guest"
      stdout.println(`Known name preserved: ${knownName}`)

      // === FALLBACK CHAIN — first set value wins ===

      displayName <- String()
      displayName :=? lookupUserName()
      displayName :=? lookupDisplayName()
      displayName :=? "Anonymous"
      stdout.println(`Display name: ${displayName}`)

      // === CONTRAST WITH := (regular assignment) ===
      // Regular := always overwrites
      // Guarded :=? only assigns when unset

      greeting <- lookupDisplayName()
      greeting :=? "Hi"
      stdout.println(`Greeting preserved: ${greeting}`)

Common mistakes

E01073 — EK9 has no null — writing '== null' references an unsupported literal; use the guarded assignment ':=?' to set a value only when the variable is currently unset. See ek9 -h E01073 for details.

Incorrect:

      knownName <- "Alice"
      if knownName == null
        knownName := "Guest"

Correct:

      knownName <- "Alice"
      knownName :=? "Guest"
Other ways to ask this
  • How do I conditionally assign a String only when the variable is unset?
  • A registration form has an optional name field — apply a default guest name if empty.
  • In Java I'd check if name == null before assigning. What does EK9 use?
  • Migrating from Python where I use 'name = name or default' — what is the EK9 pattern?

Coming from another language?

Java: if (name == null) name = "Guest". Python: name = name or "Guest" (but fails for empty string). Go: if name == "" { name = "Guest" }. Kotlin: name = name ?: "Guest". EK9: name :=? "Guest" — one operator, correct tri-state semantics.

Keywords: conditional, guarded, string, default, assignment, :=?, name, unset