- DocumentID: scoping
  Title: >-
    Variable and Config Scoping
  CategoryID: user-guide
  Summary: >-
    How scoping works within Murex
  Description: |-
    A 'scope' in Murex is a collection of code blocks to which variables and
    config are persistent within. In Murex, a variable declared inside an `if` or
    `foreach` block will be persistent outside of their blocks as long as you're
    still inside the same function.

    For example lets start with the following function that sets a variable called
    **foo**

    ```
    function example {
        if { true } then { set foo=bar }
        out $foo
    }
    ```

    In here the value is getting set inside an `if` block but its value is is
    retrieved outside of that block. `out` and `set` have different parents but
    the same scoping.

    Then lets set **foo** outside of that function and see what happens:

    ```
    » set foo=oof
    » $foo
    oof

    » example
    bar

    » $foo
    oof
    ```

    Despite setting a variable named **foo**, the value inside **example** does not
    overwrite the value outside **example** because they occupy different scoping.

    ## What Instantiates A New Scope?

    A new scope is instantiated by anything which resembles a function. This would
    be code inside events, dynamic autocompletes, open agents, any code blocks
    defined in `config`, as well as public and private functions too.

    Code inside an `if`, `switch`, `foreach` and `source` do not create a new
    scope. Subshells also do not create a new scoping either.
  Synonyms:
  Related:
  - commands/set
  - commands/let
  - commands/config
  - reserved-vars
  - commands/function
  - commands/private
  - commands/openagent
  - commands/autocomplete
  - commands/event
  - commands/if
  - commands/switch
  - commands/foreach
  - commands/source

