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