Why does EK9 require named arguments when passing multiple Boolean literals?

← Code Quality · Ref: Q799

When a call passes two or more Boolean literal values (true/false) as positional arguments, EK9 raises E11061. Boolean literals carry zero semantic signal at a call site.

WHY AMBIGUOUS

  connect(true, false)    What does each Boolean mean?
  connect(true, true)     Completely opaque without checking the signature

SINGLE BOOLEAN OK

  setVisible(true)        Clear from context - one Boolean is tolerable

FIX: USE NAMED ARGUMENTS

  connect(useSsl: true, autoReconnect: false)
  When naming any argument, EK9 requires ALL arguments to be named.

See Q777 for discarded operator returns. See Q310 for code quality overview.

Example

defines module qa.codequality.booleanargs

  defines function

    configureNetwork()
      ->
        hostName as String
        useSsl as Boolean
        autoReconnect as Boolean
      <- summary as String: String()

      sslLabel <- "no-ssl"
      if useSsl
        sslLabel: "ssl"

      reconnectLabel <- "no-reconnect"
      if autoReconnect
        reconnectLabel: "reconnect"

      summary: `${hostName} [${sslLabel}, ${reconnectLabel}]`

  defines program

    BooleanArgDemo()
      stdout <- Stdout()

      networkInfo <- configureNetwork(hostName: "db.example.com", useSsl: true, autoReconnect: false)
      stdout.println(networkInfo)

Common mistakes

E11061 — Passing two Boolean literals as positional arguments is ambiguous - the reader cannot tell what 'true, false' means without checking the function signature. Use named arguments for clarity. See ek9 -h E11061 for details.

Incorrect:

      configureNetwork("db.example.com", true, false)

Correct:

configureNetwork(hostName: "db.example.com", useSsl: true, autoReconnect: false)
Other ways to ask this
  • What triggers E11061 boolean arguments require names?
  • Why does 'connect(true, false)' fail to compile?
  • How do I pass multiple Boolean parameters in EK9?

Coming from another language?

Java: silently allows positional Boolean arguments. Python: allows but style guides recommend kwargs. Swift: requires argument labels by default. Rust: no named arguments (use builder pattern). Kotlin: supports named arguments but doesn't require them. Go: no named arguments. EK9: compile-time error when 2+ Boolean literals appear as positional arguments.

Keywords: readability, call, E11061, positional, ambiguous, boolean, argument, site, named