Edit

kc3-lang/kc3/doc/1_KC3/1.06_Variable.en.md

Branch :

  • doc/1_KC3/1.06_Variable.en.md
  • # 1.6 Variables
    
    Variables in KC3 can be defined using the litteral value for a variable
    which is always `?`. You can cast this litteral value and it will not
    really be casted but it will give you a typed variable litteral value.
    E.g. `(List) ?`.
    The typed variable litteral value will only accept to be set once to
    one value of the variable's type (in this example the type of a linked
    list).
    
    It's actually a syntax so you cannot rename `?` by mistake and
    so is an easy task to do static analysis of variable creation.
    
    The default type for a variable which you can also specify explicitly
    is `Tag` which is an enum-tagged union type of any other KC3 types
    currently defined in the environment. So `?` is exactly equivalent to
    `(Tag) ?` and they will both accept to be set once to one value of any
    type.
    
    A variable is settable once and cannot be changed afterwards (there is
    an exception if you write C code and link to it but it is not easy nor
    silent).
    
    This way you do not need to lock or trust any behaviour, once your
    variable is set to a value the value of the variable will never change,
    it really is read-only.
    
    You can also use the assignment operator which is `<-` which in turn calls
    `tag_init_copy`. It works like the C assignment operator (`=`).
    
    Examples :
    ```elixir
    # Declare a unsigned byte 8 bits variable "x".
    x = (U8) ?
    # Set the variable "x" to zero.
    x <- 0
    # Allocate again for the same binding name "x"
    x = (U8) ?
    # Also set the new variable "x" to zero with just one Unicode symbol
    # that is AltGr+Y on my keyboard.
    x ← 0
    ```
    
    
    ## So how do I change anything if it is read-only ?
    
    You can always reset an existing binding at will to another variable
    litteral and another variable will be created for the same name and it
    will be in a different memory location, settable once and then
    read-only again so you can use it without locking.
    
    ---
    
    Top : [KC3 documentation](/doc/)
    
    Previous : [1.5 List](1.5_List)
    
    Next : [2 HTTPd](/doc/2_HTTPd)