What is idiomatic EK9 code?

← Design Patterns and Idioms · Ref: Q261

Idiomatic EK9 uses the language's built-in features to write concise, safe, and expressive code. Four key idiom categories:

CONCISENESS: Backtick interpolation (Q113). Coalescing: ??, ?:, <?, >? (Q243). Guarded assignment :=? (Q74-Q78). Natural language operators: contains, matches (Q171). Control flow as expressions (Q68, Q80-Q83).

OPERATORS: Fixed set of ~50 operators (Q238). Default operators auto-generate ==, #?, $ (Q102). Pure vs mutation: + creates new, += mutates (Q241). Copy/merge/replace: :=:, :~:, :^: (Q87, Q90).

SAFETY: Purity via as pure (Q54). Universal guards (Q74-Q78). Tri-state: absent/unset/set, no null (Q29). No break/continue/return (Q148). Constrained types (Q257).

COMPOSITION: Closed types by default (Q102). Trait delegation with by (Q210). Dynamic functions/classes (Q115). Stream pipelines (Q235-Q237). Dispatcher pattern (Q211).

See Q29, Q48, Q54, Q55, Q68, Q69, Q74, Q80, Q87, Q90, Q102, Q113, Q115, Q148, Q171, Q210, Q211, Q215, Q235-Q238, Q241, Q243, Q254, Q257-Q259, Q268 for details on each pattern.

Example

defines module qa.patterns.idiomatic

  defines function

    isNonEmpty() as pure
      -> item as String
      <- rtn as Boolean: item?

  defines program

    IdiomaticEk9Demo()
      stdout <- Stdout()

      // === GUARD EXPRESSION ===
      // Block only executes if the value is set

      greeting <- String("Hello EK9")
      if msg <- greeting
        stdout.println(msg)

      // === STRING INTERPOLATION ===

      lang <- "EK9"
      stdout.println(`Welcome to ${lang}`)

      // === COALESCING FOR DEFAULTS ===

      label <- String()
      displayLabel <- label ?: "default"
      stdout.println(`Label: ${displayLabel}`)

      // === GUARDED ASSIGNMENT ===
      // First-wins pattern

      config <- String()
      config :=? "first-wins"
      config :=? "ignored"
      stdout.println(`Config: ${config}`)

      // === STREAM PIPELINE ===

      words <- ["hello", "", "ek9", "", "code"]
      nonEmpty <- cat words | filter by isNonEmpty | collect as List of String
      stdout.println(`Non-empty words: ${length nonEmpty}`)

      // === NATURAL LANGUAGE OPERATOR ===

      text <- "Hello World"
      if text contains "World"
        stdout.println("Found World in text")

      stdout.println("Idiomatic EK9 in action")

Common mistakes

E50001 — Renaming the variable means later references to 'greeting' become unresolved, triggering E50001 — not resolved. Variable names must be consistent. See ek9 -h E50001 for details.

Incorrect:

greetingXYZ <- String("Hello EK9")

Correct:

greeting <- String("Hello EK9")

E50001 — Renaming the variable means later references to 'lang' become unresolved, triggering E50001 — not resolved. Variable names must be consistent. See ek9 -h E50001 for details.

Incorrect:

langXYZ <- "EK9"

Correct:

lang <- "EK9"
Other ways to ask this
  • How do I write good EK9 code?
  • What are EK9 best practices and conventions?
  • What is the EK9 way of doing things?

Coming from another language?

Java: verbose, null-heavy, mutable/open by default. Python: dynamic typing, no compile-time safety. Rust: ownership complexity, similar Result pattern. EK9: combines safety (tri-state, guards, purity), expressiveness (operators, streams), and architecture (closed types, delegation) into a coherent idiom set.

Keywords: idiomatic, philosophy, practice, best, way, good, convention, right, overview, pattern, style, idiom, design, proper, write