Output modifiers

Output modifiers are block elements that transform the calling scope's current output.

The @edit operator

The @edit operator consumes the calling scope's output, applies some operation to it, and replaces the original output with the transformed value. It must appear at the start of a block element.

The parent scope's current output is accessible via the variable designated after the keyword, if specified. The expression inside the block element produces the value that will then replace the caller's previous output.

The result of the operation is applied immediately to the parent's output as soon the the element finishes running.

# Variable <x> contains the parent's current output
"example" { @edit x: `<x> `<x> } # <x> = "example"
# -> example example

# No variable specified, so the current output is discarded
"example" { @edit: "overwritten" }
# -> overwritten

Examples

Using @edit to compute a factorial

[%factorial: n] {
    # Modifies integer from parent output.
    # Multiplies over repeater's step values to calculate n!
    1 [rep: <n>] {@edit x: <x> * [step]}
}

[factorial: 10]
# -> 3628800

Using @edit to generate the Fibonacci series

[%fibonacci: n] {
    # Adds the last two values in the input list to produce Fibonacci series
    # Fallbacks provide the initial seed values.
    (:) [rep: <n>] {@edit f: <f> (<f/-2 ? 0> + <f/-1 ? 1>)}
}

[fibonacci: 10]
# -> (: 1; 1; 2; 3; 5; 8; 13; 21; 34; 55)