суббота, 28 декабря 2019 г.

Функции и константы встроенные в язык, синтаксический сахар, приоритеты в правилах и выражениях

    Функции встроенные в язык:
select(a, b, c)
    a, b, c - выражения. a возвращает тип Bool, если a равен true то вычисляется выражение b и его результат является результатом вызова select, если a равен false то вычисляется выражение c и его результат является результатом вызова select. Особенность select в том, что вычисляется только одно из выражений, если попытаться самому реализовать такую функцию, то при передаче a, b, c все выражения будут вычислены ещё до вызова функции.



builtInTypeNumber(a)
    a - имя переменной. Возвращает уникальный номер типа указанной переменной.

Тип{имя члена 1: выражение 1, имя члена 2: выражение 2, ... }
    Это не совсем функция, но лучше отнести такую конструкцию в этот раздел. Создает данные указанного типа, присваивая значениям членов типа, значения результатов выражений. Если какой либо член типа не был указан, то он заполняется нулями. Не работает для слайсов

Тип слайса{выражение 1, выражение 2, ...}
    Создаёт слайс указанного типа из результатов выражений.

a && b
    То же что и select(a, b, a). a и b возвращают тип Bool.

a || b
    То же что и select(a, a, b). a и b возвращают тип Bool.
    Константы встроенные в язык:
builtIn_currentFile - возвращает сроку с именем текущего файла.
builtIn_currentLine - возвращает сроку с именем текущей строки в файле.
builtIn_currentRow - возвращает сроку с именем текущего столбца в файле.
builtIn_random - возвращает число со случайным значением, это число генерируется во время компиляции. Тип числа UInt64.
Целое число - возвращает число, значение которого может быть от -9223372036854775808 до 18446744073709551615. Тип возвращаемого числа - UInt64. Поскольку тип UInt64 хранит только положительные числа, если числа отрицательные значения числа вычисляется по следующей формуле. 18446744073709551616 + указанное число. Почему так? Ответ будет в другой статье.
Вещественное число - возвращает число, тип которого Double.
"Строка" - возвращает строку, тип которой [UInt8]
'Символ' - возвращает код символа (ASCII). Код - число имеющее тип UInt8

    Для вычисления  двух чисел, в языке используется функция add, для умножения - функция mul, разумеется вычислять выражение 2 + 7 * 12, используя выражение add(2, mul(7, 2)) крайне не удобно, поэтому в cine можно писать 2 + 7 * 12, а компилятор заменит это выражение на add(2, mul(7, 2)). Выражения для замены какого либо более сложного выражения, называется синтаксическим сахаром. Как можно заметить, что в выражении 2 + 7 * 12 есть приоритеты, ведь в начале исполняется умножение. Вот таблица в которой имеется информация о приоритетах(чем меньше приоритет тем раньше выполнится оператор, поиск слева на право) и о синтаксическом сахаре:
|Оператор| |Приоритет| |Заменяется на| |Дополнительные сведения|
!a 1 a.neg()
a * b 2 mul(a, b) a и b передаются как неизменяемые
a / b 2 div(a, b) a и b передаются как неизменяемые
a % b 2 mod(a, b) a и b передаются как неизменяемые
a + b 3 add(a, b) a и b передаются как неизменяемые
a - b 3 sub(a, b) a и b передаются как неизменяемые
a << b 4 shl(a, b) a и b передаются как неизменяемые
a >> b 4 shr(a, b) a и b передаются как неизменяемые
a > b 5 greater(a, b) a и b передаются как неизменяемые
a >= b 5 greaterOrEqual(a, b) a и b передаются как неизменяемые
a < b 5 less(a, b) a и b передаются как неизменяемые
a <= b 5 lessOrEqual(a, b) a и b передаются как неизменяемые
a == b 6 equal(a, b) a и b передаются как неизменяемые
a != b 6 notEqual(a, b) a и b передаются как неизменяемые
a & b 7 and(a, b) a и b передаются как неизменяемые
a && b 7
a ^ b 8 xor(a, b) a и b передаются как неизменяемые
a | b 9 or(a, b) a и b передаются как неизменяемые
a || b 9
a += b 10 addEq(a, b) a передаётся как изменяемое, b как неизменяемое
a -= b 10 subEq(a, b) a передаётся как изменяемое, b как неизменяемое
a *= b 10 mulEq(a, b) a передаётся как изменяемое, b как неизменяемое
a /= b 10 divEq(a, b) a передаётся как изменяемое, b как неизменяемое
a %= b 10 modEq(a, b) a передаётся как изменяемое, b как неизменяемое
a &= b 10 andEq(a, b) a передаётся как изменяемое, b как неизменяемое
a ^= b 10 xorEq(a, b) a передаётся как изменяемое, b как неизменяемое
a |= b 10 orEq(a, b) a передаётся как изменяемое, b как неизменяемое
a <<= b 10 shlEq(a, b) a передаётся как изменяемое, b как неизменяемое
a >>= b 10 shrEq(a, b) a передаётся как изменяемое, b как неизменяемое
    Все остальные действия (вызов функции, доступ к членам типа, ...) имею приоритет 0.
    Как приоритет есть в выражениях, так же приоритет есть и в правилах (глобальных и в функциях). Вот таблица с приоритетами в правилах:
|Оператор| |Приоритет|
| 3
& 2
! 1
== 0
!= 0
> 0

Комментариев нет:

Отправить комментарий

Пожалуйста без мата и оскорблений. Если хотите сообщить об ошибках, для этого есть форма обратной связи.