Create a dynamic function that captures a prefix variable and prepends it to input.

← Advanced Type System · Ref: Q1125

Capture a variable into a dynamic function:

  transform <- (prefix: prefixText) extends Transformer as function
    output: `${prefix} ${input}`

(prefix: prefixText) captures local 'prefixText' into a field named 'prefix'. The abstract function type defines parameter and return types.

See Q1126 for dynamic classes.

Example

defines module qa.advancedtypes.dynamicfunctioncapture

  defines function

    Transformer as abstract
      -> input as String
      <- output as String?

  defines program

    DynamicFunctionCaptureDemo()
      stdout <- Stdout()
      prefixText <- "Hey"

      //Create dynamic function capturing prefixText as 'prefix'
      transform <- (prefix: prefixText) extends Transformer as function
        output: `${prefix} ${input}`

      result <- transform("World")
      stdout.println(result)

Common mistakes

E01010 — EK9 dynamic functions extend an abstract function type. Use 'extends TypeName as function' with a capture list.

Incorrect:

      transform <- (input) -> prefix + input

Correct:

      transform <- (prefix: prefixText) extends Transformer as function
Other ways to ask this
  • I need a closure that captures a local variable and uses it in its body
  • In JavaScript I'd create a closure over a variable. Write the EK9 dynamic function
  • Given a prefix string, create a dynamic function that adds it to any input
  • Build a function that captures state with named capture syntax

Coming from another language?

JavaScript: const fn = (input) => prefix + input (closure). Java: lambda with effectively final variable. Python: lambda or closure. EK9: named capture in dynamic function.

Keywords: state, closure, dynamic, function, lambda, capture