Префиксы переменных
Префикс
.используется для переменных-членов типов:
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) // `&` здесь обязательно