# Declarations

Variable names and other user-defined symbols are known as identifiers, which may be of any length, with upper and lower case being distinct. Identifiers must start with a letter and then be followed by letters, digits or underscores. All unicode characters may be used, as long as your editor saves the source files as utf-8 - note however that all non-ascii characters are treated as letters, including a few that might look rather similar to operators, and even some numbers.
The following reserved words have special meaning in Phix and may not be used as identifiers:

        and           or            not         xor
        break         continue      exit        fallthru
        case          default       format      fallthrough
        constant      enum          abstract    iff
        try           catch         dynamic     iif
        class         struct        extends
        do            while         until       switch
        for           by            to          end
        if            then          elsif       else
        true          false         null        goto
        function      procedure     type        return
        ifdef         elsifdef      elsedef     private
        forward       global        export      public
        include       with          without

Edita displays these words in teal (easily changed in Options/Colours).
Since version 0.8.0 the following are also treated as reserved words:

        abort         atom          number      bool
        close         compare       int         integer
        seq           sequence      string      object
        delete        equal         floor       flush
        log           peek          poke        power
        prepend       profile       trace       seek
        sin           sleep         version     where

Identifiers can be used in naming the following:

- procedures
- functions
- types
- variables
- constants

Note however that none of the following (and then some) are technically reserved words, although the editor colours them differently, to give you a hint that it could be rather foolish to use them as identifiers:

        apply         assert        boolean     call
        choose        crash         date        elapsed
        factors       filter        find        free
        head          join          largest     listen
        lower         map           match       max
        min           mod           pad         print
        product       proper        progress    repeat
        reverse       shorten       shuffle     sign
        smallest      sort          split       substitute
        sum           system        tail        trim
        union         unique        upper       value

Also, do yourself a favour and avoid these JavaScript reserved words, should you plan on ever using pwa/p2js to run stuff in a browser:

        arguments     await         const       debugger
        delete        eval          final       finally
        implements    import        in          instanceof
        interface     let           native      new
        package       protected     super       synchronized
        this          throws        transient   typeof
        var           void          volatile    yield

The transpiler issues a fatal error should you try to use any of those. A few more have also slipped in that trigger strictly unnecessary errors, some of which I might be able to stop the transpiler from issuing, and some of which will have to be added to the above table. (I basically used the same mechanism for syntax colouring and reserved words, oops.)