Литералы и идентификаторы
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Числовые литералы
FunC допускает десятичные и шестнадцатеричные целочисленные литералы (разрешены начальные нули).
Например, 0, 123, -17, 00987, 0xef, 0xEF, 0x0, -0xfFAb, 0x0001, -0, -0x0 являются допустимыми числовыми литералами.
Строковые литералы
Строки в FunC заключаются в двойные кавычки " как "эта строка". Специальные символы, такие как \n, и многострочные строки не поддерживаются.
По желанию, строковые литералы могут указывать тип после себя, например, "string "u.
Поддерживаются следующие типы строк:
- без типа — используется для определений функций asm и для определения константы среза по строке ASCII
s— определяет необработанную константу среза по ее содержимому (в шестнадцатеричной кодировке и, при необходимости, дополненную битами)a— создает константу среза, содержащую структуруMsgAddressIntиз указанного адресаu— создает константу int, которая соответствует шестнадцатеричным значениям предоставленной строки ASCIIh— создает константу int, которая является первыми 32 битами хэша SHA256 строкиH— создает константу int, которая является все 256 бит хэша SHA256 строкиc— создает константу int, которая является значением crc32 строки
Например, следующие значения приводят к соответствующим константам:
"string"становитсяx{737472696e67}срез const"abcdef"sстановитсяx{abcdef}срез const"Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF"aстановитсяx{9FE66666666666666666666666666666666666666666666666666666666666667_}срез const (addr_std$10 anycast:none$0 workchain_id:int8=0xFF address:bits256=0x33...33)"NstK"uстановится0x4e73744bint const"transfer(slice, int)"hстановится0x7a62e8a8int const"transfer(slice, int)"Hстановится0x7a62e8a8ebac41bd6de16c65e7be363bc2d2cbc6a0873778dead4795c13db979int const"transfer(slice, int)"cстановится2235694568int const
Идентификаторы
FunC допускает действительно широкий класс идентификаторов (имена функций и переменных). А именно, любая (однострочная) строка, которая не содержит специальные символы ;, ,, (, ), (пробел или табуляция), ~ и ., не начинается как комментарий или строковый литерал (с "), не является числовым литералом, не является подчеркиванием _ и не является ключевым словом, является допустимым идентификатором (за исключением того, что если она начинается с `, она должна заканчиваться тем же ` и не может содержать никаких других `, кроме этих двух).
Кроме того, имена функций в определениях функций могут начинаться с . или ~.
Например, это допустимы е идентификаторы:
query,query',query''elem0,elem1,elem2CHECK_internal_valuemessage_found?get_pubkeys&signaturesdict::udict_set_builder_+_(стандартный оператор сложения типа(int, int) -> intв префиксной нотации, хотя он уже определен)fatal!
' в конце имени переменной обычно используется, когда вводится некоторая измененная версия старого значения. Например, почти все модифицирующие встроенные примитивы для манипуляции хэш-картой (кроме тех, что с префиксом ~) берут хэш-карту и возвращают новую версию хэш-карты вместе с некоторыми другими данными, если это необходимо. Удобно называть эти значения тем же именем, с суффиксом '.
Суффикс ? обычно используется для булевых переменных (TVM не имеет встроенного типа bool; булевы переменные представлены целыми числами: 0 — ложь, а -1 — истина) или для функций, которые возвращают некоторый флаг, обычно указывающий на успешность операции (например, udict_get? из stdlib.fc).
Это недопустимые идентификаторы:
take(first)Entry- \`"not_a_string
msg.sendersend_message,then_terminate_
Еще несколько необычных примеров допустимых идентификаторов:
123validname2+2=2*2-alsovalidname0xefefefhahaha{hehehe}pa{--}inaaa``.
Это также недопустимые идентификаторы:
pa;;inaaa(потому что `;запрещено){-aaa-}aa(bb123(это число)
Кроме того, в FunC есть специальный тип идентификаторов, который заключается в обратные кавычки `.
В кавычках допустимы любые символы, кроме \n и самих кавычек.
Например, `Я тоже переменная` является допустимым идентификатором, как и `здесь разрешены любые символы ; ~ ()...`
Константы
FunC позволяет определять константы времени компиляции, которые подставляются и предварительно вычисляются во время компиляции.
Константы определяются как const Optional-Type Id = value-or-expression;
optional-type можно использовать для принудительного указания определенного типа константы и для лучшей читаемости.
На данный момент поддерживаются типы int и slice.
value-or-expression может быть литералом или предварительно вычисляемым выражением литералов и констант.
Например, константы можно определить следующим образом:
const int101 = 101;определяет константуint101, которая эквивалентна числовому литералу101const str1 = "const1", str2 = "aabbcc"s;определяет две константы, которые равны соответствующим им строкамconst int int240 = ((int1 + int2) * 10) << 3;определяет константуint240, которая равна результату вычисленияconst slice str2r = str2;определяет константуstr2r, которая равна значению константыstr2
Поскольку числовые константы подставляются во время компиляции, все оптимизации и предварительные вычисления, выполняемые во время компиляции, успешно выполняются (в отличие от старого метода определения констант с помощью встроенного asm PUSHINTs).