- Код регистрозависим
- Пробелы и табуляции могут быть вставлены в любом количестве и не влияют на выполнение программы (в отличии от python)
- Для комментария используется
//. Комментарии действует до конца строки - Выражение не переносится на другую строку
- Числа
- Знаковые
- Двойная точность (соответствует double в языке C++)
- Специальные литералы для булевой логики:
true(1) иfalse(0) - Поддержка нотации (например,
1.23e-4)
- Строки
- Строковые литералы - всё, что окружено двойными кавычками
"" - Escape sequences должны корректно обрабатываться
- "Some "string" type" не должно интерпретироваться, правильный синтаксис "Some \"string\" type"
- Списки
- Динамические массивы
- Литералы в квадратных скобках:
[1, 2, 3] - Индексация с нуля
- Поддержка срезов (slices)
-
NullType
- Специальный тип означающий ничего
- Специальный литерал этого типа
nil
- Арифметические
+,-,*,/,%(остаток от деления)^(возведение в степень)- Унарные
+и-
- Сравнения
==,!=,<,>,<=,>=
- Логические
and,or,not
- Присваивания
=,+=,-=,*=,/=,%=,^=
- Другие
[](индексация)
-
Числа (применяются в общепринятом понимании)
- Арифметические
- Сравнения
- Логические
- Присваивания
-
Строки
- Сравнения (в лексикографическом порядке)
- Арифметические
+- конкатенация двух строк-- вычитает из строки суффикс (если первый аргумент оканчивается на второй)*- применимо к строке и числу, результат - повторяет строку необходимое число раз (не обязательно целое)
- Оператор
[]s[n]- возвращает n-й символ строки, отрицательные индексы отсчитываются с конца (как в питоне)s[:n]- слайс, подстрока от первого до n символа (исключительно)s[n:]- слайс, подстрока от n символа до концаs[m:n]- слайс, подстрока от m-го символа до n-го(исключительно)s[:]- слайс, копия строки
-
Списки
- Арифметические
+- конкатенация*- повторение (аналогично строке)
- Оператор
[]- Аналогично строке
- Арифметические
-
NullType
- Может бы сравним (
==) с переменной любого типа. Возвращаетfalseдля всех случаем кромеnil !=имеет обратный результат
- Может бы сравним (
- Условия
if условие then
// выражения
else if условие then
// выражения
else
// выражения
end if
- Циклы
-
while:while условие // выражения end while -
for:for i in последовательность // выражения end for
- Break & Continue
- Ключевые слова
breakиcontinueимеют привычный смысл при использование в циклах
Функции являются объектом первого класса, и имеют отдельный тип данных. В отличии от С++, функции в данном ЯП объявляются через переменную. Для определения функции используется ключевое слово function. Количество аргументов не ограничивается. В качестве аргументов могут приниматься любые стандартные типы данных, включая сами функции.
имя = function(параметры)
// выражения
return результат
end function
Вызов функций осуществляется так же, как и в большинстве языков:
имя_функции(параметры_через_запятую)
Так как функции в ЯП являются обычным объектом, их можно передавать как аргументы и возвращать. Синтаксис аналогичен другим типам данных (мы убрали @):
ilovefunctions("pass existing function...", func)
ilovefunctions("...or define one inplace", function(args)
// do smth
end function)
alias = anotherfunc
Функции также могут определять другие функции внутри себя, однако внутренние функции не захватывают переменные из родительской функции.
Переменные и функции могут быть глобальными (объявлены в глобальной области видимости) и локальные (аргументы функций, локальные переменные) Локальные переменные одной функции могут попасть в скоуп другой только через аргументы. Затемнее внешних переменных может происходить только между глобальными переменными и аргументами функции.
abs(x)- абсолютное значениеceil(x)- округление вверхfloor(x)- округление внизround(x)- округление до ближайшего целогоsqrt(x)- квадратный кореньrnd(n)- случайное целое от 0 до n-1parse_num(s)- преобразует строку в число если возможно, иначеnilto_string(n)- преобразует число в строку
len(s)- длина строкиlower(s)- в нижний регистрupper(s)- в верхний регистрsplit(s, delim)- разделение строкиjoin(list, delim)- объединение списка в строкуreplace(s, old, new)- замена подстроки
range(x, y, step)- возвращает список чисел[x; y)с шагомsteplen(list)- длина спискаpush(list, x)- добавить элемент в конецpop(list)- удалить и вернуть последний элементinsert(list, index, x)- вставить элементremove(list, index)- удалить элементsort(list)- сортировка. Поведение при листе из разных типов -- implementation defined (но не UB!)
print(x)- вывод в поток вывода без дополнительных символов и перевода строки.println(x)- вывод в поток вывода с последующим переводом строки.read()- читает и возвращает строку из потока вводаstacktrace()- возвращает текущий стэк вызова функций. Формат стэка - на ваше усмотрение.
- Динамическая типизация - типы проверяются во время выполнения.
- Автоматическое управление памятью - сборка мусора, переменные вышедшие из области видимости удаляются автоматически.
- Лексическая область видимости - переменные видны в блоке, где объявлены, затемнение внешний имен так же как в С++.
- Интерпретация - выполнение программы происходит построчно, ошибки синтаксиса проверяются в момент выполнения. При возникновении интерпретатор завершается с ошибкой.
- Safety - выполнение некорректных операций не должно игнорироваться/вызывать ошибки на уровне вашего интерпретатора. Все ошибки должны быть обработаны и пойманы интерпретатором.
- Простые типы (числа, nil) копируются по значению, сложные (строка, лист, функции) по ссылке. Другими словами, поведение при передаче аргументов и присвоении (
=) аналогично Python.
Этот стандарт описывает базовую функциональность языка.
В директории example есть ряд примеров программ
- fibonacci.is
- maximum.is
- fuzzBuzz.is