Префиксы переменных



Префикс
.
используется для переменных-членов типов:
T Error
   String message

   F (message)
      .message = message

Префикс
:
используется для глобальных (или статических [см. ниже]) переменных {}:
V global_var = 0

F global_func()
   :global_var++

Префиксы
@
и
@=
используются для внешних\captured переменных:
F global_func()
   V i = 0

   F local_func()
      @i++ // `i` захвачена по ссылке

F get_f(a)
   F f(b)
      R @=a + b // `a` захвачена по значению (копированием)
   R f
Дополнительные примеры:
F f()
   V i = 0
   F g()
      F h()
         print(@@i)
https://github.com/11l-lang/_11l_to_cpp/blob/...:
      F exit_with_error(message, =pos)
         ...
            I @.instr[t] == "\n"
https://rosettacode.org/wiki/Bitmap#11l:
... @@.background ...

Статические переменные


F fake_random()
   -V seq = [3, 1, 2, 4, 7, 5, 6]
   V :n = 0 //статическая локальная переменная
   :n = (:n + 1) % seq.len
   R seq[:n]

F f()
   V :n = 0 //статическая локальная переменная
   F g()
      @:n++

Статические переменные-члены


T Type
   :static_type_var1 = 0
   String :static_type_var2
   . -:private_const_static_var = 10

   T SubType
      member = 0

   F :static_type_fn()
      R .:static_type_var2

   F f()
      .:static_type_var1 = 1
      .:static_type_fn() // почему не просто `.static_type_fn()` - эта функция объявляется как `:static_type_fn()`
      V st = .SubType() // аналогично `self.SubType` в Python [почему не `.:SubType()` - этот тип объявляется как `T SubType`, а не `T :SubType`]

print(Type.:static_type_var1)
print(Type.static_type_fn()) // аналогично глобальным функциям/типам [vs глобальным переменным] которые не требуют префикс `:`
V t = Type.SubType()

Дополнительное пояснение:
:
в
.:static_type_fn()
нужно, чтобы было видно, что эта функция — статическая. В случае
Type.static_type_fn()
двоеточие не нужно, т.к. итак можно понять, что функция статическая. Аналогично в
.SubType()
двоеточие не нужно, т.к. ‘типы всегда "статические"’/‘не бывает нестатических типов’.

Признак изменяемости аргументов функции


F tokenize(source, [(Int, Int)] &comments)
   ...

tokenize(‘print()’, &comments) // `&` здесь обязательно