Привет, неизвестный путник!

Добро пожаловать в документацию по языку C#.NStar! Здесь вы найдете информацию о его операторах и ключевых словах, отличающихся от оригинального C# от Microsoft.

/"
См. "сырые" строки.

/{
См. вложенные комментарии.

^n
Позволяет указать индекс с конца: list[^5] - это то же самое, что и list[list.Length - 4]. Работает только в качестве индекса в известной коллекции, сравнение i == ^5 не сработает.

}/
См. вложенные комментарии.

a..b
Позволяет указать диапазон элементов коллекции - list[a..b] возвращает элементы списка с индексами от a до b. Работает также в комбинации с индексами с конца, а также в цикле for: for (i in a..b) { ... } (хотя там, если указать только диапазон, индексы с конца будут относиться ко всему диапазону положительных чисел типа int (до примерно 2 млрд), а не к коллекции).

ln x
Оператор, вычисляющий натуральный логарифм (операнд и результат типа real, приближенно). См. также Log(a, x).

n!
Возвращает факториал числа (операнд типа byte, результат типа real, приближенно).

not x
Применяется в составе оператора is.

sin x, cos x, tan x, asin x, acos x, atan x
Операторы, вычисляющие тригонометрические "функции" (на самом деле и в математике это, если выражаться терминологически строго, не функции, а унарные операторы, так как для настоящих функций обязательна запись параметров в скобках) (операнд и результат типа real, приближенно).

x >>> y
Беззнаковый сдвиг вправо - для любых чисел, включая отрицательные, заполняет левые биты нулями, а не единицами.

x ?= y : z, x ?>= y : z, x ?<= y : z, x ?> y : z, x ?< y : z, x ?!= y : z
Эквивалентны x == y ? x : z (этот тернарный оператор пишется с одним знаком "="), x >= y ? x : z, x <= y ? x : z и т. д. Значение x кэшируется.

x ^^ y
Бинарный логический xor (true ^^ true ^^ true возвращает true).

x and y
Применяется в составе оператора is.

x is pattern
"Швейцарский нож" или сопоставление шаблонов. Это самый мощный оператор C#.NStar. Позволяет проверить выражение на соответствие любой из множества констант, определенному типу и много чему еще. Поддерживаемые шаблоны:
  1. Константа: x is 4.27. Полезен как часть составного шаблона.
  2. Тип: x is () int.
  3. Тип с объявлением переменной: x is () int list. Если вам нужно дальше работать с x как с переменной этого типа, используйте именно новую переменную.
  4. var с объявлением переменной: x is var y. Позволяет сохранить промежуточный результат вычислений для дальнейшего многократного использования: bigNum1 pow bigNum2 is var x && x + 1r / x < y.
  5. Шаблон сравнения: x is >= y, x is <= y, x is > y, x is < y. Полезен как часть составного шаблона.
  6. Пустой шаблон: x is _. Всегда возвращает true (если только не ошибка в трансляторе). Полезен в выражении switch.
  7. Составной шаблон: x is pattern1 and pattern2, x is pattern1 or pattern2, x is not otherPattern. Позволяет объединить множество шаблонов логическими операциями, например, одной операцией проверить, что выпал один из нескольких "счастливых" номеров, если они заранее известны, или что здоровье игрока меньше 10% (разумеется, вместо "10%" нужно подставить точное число), но больше нуля, или что объект - не число с плавающей точкой и не строка и т. д.

x or y
Применяется в составе оператора is.

x pow y
Вычисляет x в степени y (операнды и результат типа real, приближенно).

x pow= y
Эквивалентно x = x pow y.

x: y (без тернарных операторов)
Пара ключ-значение при объявлении словаря.

Квадратные скобки
Кроме своих функций из C#.NET, также используются для указания внутреннего типа полиморфных типов (в C#.NET это делают угловые скобки, которые в C#.NStar были удалены для предотвращения путаницы с операторами сравнения).

"Сырые" строки
Начинаются с символов /" и заканчиваются символами "\ и могут содержать сколько угодно кавычек, обратные слэши и даже вложенные "сырые" строки без экранирования, при условии соблюдения парности открывающих и закрывающих пар символов: /"This's a "string" which can contain multiple """"" quotes, @"""verbatim"" strings", back \\\ slashes and /"nested /"raw strings"\"\ (as long as they have paired /" and "\)."\

Вложенные комментарии
Начинаются с символов /{ и заканчиваются символами }/ и могут содержать что угодно, включая любые типы строк, "обычные" комментарии и т. д. без экранирования, при условии соблюдения парности открывающих и закрывающих пар символов.

catch
См. в описании try.

Class
С прописной буквы.

const
Дает имя какому-либо неизменяемому значению, позволяя избегать "магических чисел" (строк и т. д.): const Tau = Pi * 2;. Можно также с указанием типа: const real Tau = Pi * 2;<.

Constructor
Объявляет конструктор, например, internal Constructor(int length) { ... }. С прописной буквы.

Delegate
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

delete
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

Destructor
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

Enum
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

Event
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

Extent
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

for
Объявляет цикл for, который ведет себя не как классический цикл for, а как классический цикл foreach.

Function
Объявляет функцию (или метод, если находится внутри типа), например, private null Function F(unsigned int n) { ... }. С прописной буквы. Синтаксис в стиле private null F(unsigned int n) { ... } был удален, так как является логически неоднозначным - непонятно, это функция, экстент, класс с основным конструктором или что-либо другое.

Interface
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

loop
Объявляет цикл loop, который продолжается потенциально бесконечно, пока не будет явно прерван ключевыми словами break или return.

multiconst
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

Namespace
С прописной буквы.

null
Объединяет функционал ключевых слов C#.NET null и void, например, null Function F(string extra = null) { ... }. Не является типом, потому что не может быть переопределено.

Operator
Ключевое слово зарезервировано (назвать так идентификатор нельзя), но на момент написания этих строк не имеет функционала.

private
Закрытый член типа, доступен только в пределах типа, в котором объявлен, недоступен даже в подклассах.

Record
Контекстное ключевое слово, объявляющее "запись" - чистую структуру данных - она имеет только свойства, совпадающие по именам и типам с параметрами, указанными в скобках после имени (скобки являются "маркером" контекста, в котором Record является ключевым словом - если вы их потеряете, транслятор даже не "подумает", что вы имели в виду запись, и выдаст множество случайных ошибок, но ни слова про записи), конструктор из этих параметров и стандартные методы Equals() и GetHashCode(), и не может иметь пользовательских методов, вследствие чего объявление записи завершается точкой с запятой, а не открывающей фигурной скобкой (у записи нет ядра!).

repeat
Объявляет цикл repeat, который повторяется определенное количество раз: repeat (n) { ... }. Само это число вычисляется однократно.

Struct
Объявляет структуру. Структура отличается от класса тем, что является типом значения, а не ссылочным. Подробнее здесь. У структуры нет производных, а сама структура может быть производной только от интерфейсов.

switch
Объявляет выражение switch:
var a = matchingExpression switch
{
    pattern1 => expression1,
    pattern2 => expression2,
    pattern3 => expression3,
    ...
    _ => elseExpression,
};
Запятая после последнего выражения при многострочном выражении switch обязательна. По поводу синтаксиса шаблонов (pattern) см. is. Оператор switch упразднен из-за неопределенного стиля выравнивания: операторы case размещать с отступом? - или без отступа? - или case с одним отступом, а действия внутри него еще с одним? А в нашем языке не приветствуется, чтобы каждый писал как хотел.

try
Контекстное ключевое слово, позволяющее перехватывать исключения:
try
{
    ...
}
catch (Exception1 ex) if (condition1)
{
    ...
}
catch (Exception2 ex) if (condition2)
{
    ...
}
catch (Exception3 ex) // Без условия
{
    ...
}
catch // Перехватывает все оставшиеся исключения
{
    ...
}
Исключение - это возникшая во время выполнения программы аномальная ситуация, например, вызов функции с некорректным параметром или обращение к свойству объекта, который равен null. Если исключение не перехватить, работа программы завершится с техническим крахом. В случае, если исключение возникло в блоке try или в функции, которая вызывается в этом блоке (но не в другом потоке!), поток выполнения "прыгает" в блок catch, удовлетворяющий типу исключения и условию. Доступны следующие формы блока catch: catch (Exception ex) if (condition), catch (Exception) if (condition), catch (ex) if (condition), catch (Exception ex), catch (Exception), catch (ex) и просто catch (последние два перехватывают все исключения), а также вообще без catch, только try - в этом случае перехватываются все исключения, поток выполнения выходит из блока try и идет к следующему за закрывающей фигурной скобкой действию. Фигурные скобки после заголовков блоков try и catch обязательны. Если что, catch также является ключевым словом лишь в контексте try.

ExecuteString(string, args)
Вызывается как функция, но технически является оператором, так как не выражается через другие конструкции C#.NStar. Транспайлирует, компилирует и выполняет строку, записанную в первый параметр, как программу на C#.NStar. Второй параметр позволяет передать внутрь этой программы какие-либо переменные из внешней программы, доступные во внутренней программе через элементы списка args.

Q()
Вызывается как функция, но технически является оператором, так как не выражается через другие конструкции C#.NStar. Возвращает собственный код программы, в которой вызывается (для нижеследующего вывода или других операций). Если вызывается в строке, выполняемой через ExecuteString() (именно в строке, а не передается через args), возвращает эту строку.

Не являются операторами или ключевыми словами

Следующие конструкции имеют определенные признаки, делающие их похожими на операторы или ключевые слова, но они таковыми не являются и перечислены отдельно:

-Infty
Глобальная константа.

E
Глобальная константа.

Infty
Глобальная константа.

list(n) T
Примитивный тип.

Log(a, x)
Функция.

Pi
Глобальная константа.

Uncty
Глобальная константа.



Назад к индексу документации