Операторы
Сравнение
Сравнение значений разных типов равнозначно сравнению порядковых номеров этих типов. Исключением из этого правила является сравнение значений между типами $int и $float. Чтобы узнать порядковый номер типа необходимо преобразовать этот тип в $int, используя native-функцию #as.
Порядковые номера у каждого типа могут различаться в разных версиях языка ksi. Однако стандарт гарантирует, что порядковый номер у типа $null всегда равен 0.
При вызове операторов сравнения по цепочке, кроме оператора <=>, работают ленивые вычисления.
В приведённом выше примере результат выражений 1 и 2 будет одинаковым. Только выражение 1 преобразуется интерпретатором в меньшее количество инструкций, а следовательно работает быстрее.
Арифметические операторы
Логические
* Используются ленивые вычисления.
Результат выражения a `and b зависит от a. Если a после преобразования в тип $bool равно false #0, то результатом будет a (до преобразования), и выражение b не будет вычисляться. Иначе результатом будет b.
Выражение a `or b работает похожим образом. Если a после преобразования в тип $bool равно true #1, то результат будет a (до преобразования), и выражение b не будет вычисляться. Иначе результатом будет b.
Логика выражения a `xor b немного сложнее. Сперва вычисляются выражения a и b, а их результаты преобразуются в тип $bool – назовём их bool_a и bool_b. Если bool_b равно false #0, то результат всего выражения равен a. Если bool_b равно true #1 и bool_a равно false #0, то результат всего выражения равен b. Иначе результат всего выражения равен false #0.
Побитовые
Текстовые
Присваивание
Групповое, массивное и ассоциативное присваивание пока не реализовано в интерпретаторе.
В ksi также есть оператор присвоения вправо:
Групповое, массивное и ассоциативное присваивание вправо пока не реализовано в интерпретаторе.
Составное присвоение
* Используются ленивые вычисления.
Составное присвоение сможет также быть одновременно и групповым, массивным или ассоциативным, когда такая конструкция получит поддержку в интерпретаторе.
Составное присвоение с вызовом функции
Пока не реализовано в интерпретаторе.
Префиксная форма
Открывающая скобочка, префиксный оператор, список выражений, перечисленных через необязательную запятую, закрывающая скобочка. Перед закрывающей скобкой можно поставить запятую – она ни на что не повлияет.
Количество выражений после префиксного оператора должно быть не меньше двух, иначе будет ошибка загрузки скрипта. Присваивание не может быть использовано в качестве префиксного оператора.
Обращение к элементам составных типов
Для обращения к элементу составного типа (массив, мапа, объект класса) в языке ksi существуют два оператора – это точка . и квадратные скобочки var[key]. Между переменной и квадратными скобочками не должно быть пробелов, иначе произойдёт разделение на два выражения.
После оператора точка может следовать целое число или слово. Однако в контексте присвоения значения после точки может идти дополнительно и такие значения, как: #0, #1, #. Контекст присвоения – это операнд слева от оператора = (а также их составных вариантов), или справа от оператора => (а также их составных вариантов).
Внутри оператора var[] может быть несколько выражений, перечисленных через необязательную запятую.
Оператор взятия типа
Для того, чтобы получить тип значения, которое хранится в переменной – поставьте символ $ непосредственно после этой переменной.
Таким образом можно также определять тип константы или элемента коллекции.
Работа с функциями
Оператор восклицательный знак ! служит для вызова функции через указатель.
Указатель на функцию и оператор восклицательный знак ! пока не реализованы в интерпретаторе.
Оператор сцепления с null
Выражение a ?? b возвращает a, если оно не null. Иначе вернёт b.
Оператор ?? использует ленивые вычисления. Это значит если результат всего выражения известен после вычисления только левой части, то правая часть не будет выполнена.
Оператор сцепления с null можно использовать в сочетании с присваиванием: _переменная_ ??= _выражение_ или _выражение_ ??=> _переменная_. Такая конструкция использует ленивые вычисления, это значит что если _переменная_ не равна null, то всё _выражение_ не будет вычисляться и присвоение не произойдёт.