# Declare Function Example

An example which demonstrates the use of the `func` keyword.

Code in the body of the function has access to the same scope as a bound expression. This consists of an implicity `self` which resolves to the object on which the function was declared, as well as the identifiers declared in the enclosing `enamldef` block. It also has access to the dynamic scope which is rooted on `self`.

Tip

To see this example in action, download it from `declare_function` and run:

    $ enaml-run declare_function.enaml

## Screenshot

## Example Enaml Code

    #------------------------------------------------------------------------------
    # Copyright (c) 2015-2024, Nucleic Development Team.
    #
    # Distributed under the terms of the Modified BSD License.
    #
    # The full license is in the file LICENSE, distributed with this software.
    #------------------------------------------------------------------------------
    """ An example which demonstrates the use of the `func` keyword.

    Code in the body of the function has access to the same scope as a bound
    expression. This consists of an implicity `self` which resolves to the
    object on which the function was declared, as well as the identifiers
    declared in the enclosing `enamldef` block. It also has access to the
    dynamic scope which is rooted on `self`.

    << autodoc-me >>
    """
    from __future__ import print_function
    from collections.abc import Mapping
    from enaml.widgets.api import Window, PushButton, SpinBox, Container
    from enaml.core.funchelper import call_func

    enamldef Main(Window): m:

        func do_thing(param):

            i = 0
            a = 1
            print({a: self for i in range(3)})
            print({m for m in range(1)})
            print([[i for i in range(1)] for i in range(2)])
            print([m for i in range(3) if i == m])
            print('Index', i)

        Container:
            SpinBox: sbox:
                maximum = 100
                minimum = 0
            PushButton:
                text = 'Click Me'
                clicked ::
                    do_thing(1)
                    print('Bis')
                    print({a: self for i in range(3)})
                    print({m for m in range(1)})
                    print([[i for i in range(1)] for i in range(2)])
                    print([m for i in range(3) if i == m])
                    print('Index', i)