Справочник DemonScript: Основы синтаксиса
Типы данных
- float - вещественно число с плавающей точкой: 1, 1.25, -8.01;
- logic - логическое значение; может быть: True (истина), False (ложь) и Undef (неопределено - или истина или ложь). Кроме этого, может задаваться парой вещественных чисел в круглых скобках: (a0, a1), где a0 означает степень уверенности в ложности значения и a1 - степень уверенности в его истинности;
- string - строка; при объявлении строковых констант они беруться в двойные кавычки: "Это строка".
- array - массив, является списком всех базовых типов (в том числе и массивов), заключённых в квадратные скобки.
- graph - граф, состоящий из узлов, соединённых направленными рёбрами.
- edge - тип ребра графа; константы начинаются с символа @: var a = @isa;
- node - узел графа; константы начинаются с символа $: var a = $box;
Функции работы с типами данных
- X.type() - возвращает строковое название переменной X
- X.size() - возвращает размерности переменной X (2 для типа logic и длину массива для array)
- X.string() - возвращает строковое представление переменной любого типа
- X.logic() - преобразует переменную в логический тип
- X.float() - преобразует переменную в вещественный тип. Если конвертация невозможна, возвращает None.
Операции
Арифметические операции:
X+Y | - сложение вещественных чисел, строк, графов |
X-Y | - вычитание вещественных чисел, графов |
X*Y | - умножение; результат: float |
X/Y, X\Y | - вещественное и целочисленное деление; результат: float |
X%Y | - остаток от деления; результат: float |
X++, X-- | - постинкремент и постдекремент; результат: float |
X+=, X-=, X*=, X/=, X\=, X%= | - операция и присваивание; результат: float |
X == Y, X != Y | - равенство, неравенство двух вещественных чисел, графов |
X < Y, X <= Y | - меньше, меньше или равно; результат: logic |
X > Y, X >= Y | - больше, больше или равно; результат: logic |
Логические операции:
X <-> Y | - эквивалентность (следование в две стороны); результат: logic |
X -> Y | - импликация (логическое следование); результат: logic |
X & Y, X | Y | - конъюнкция (логическое И), дизъюнкция (логическое ИЛИ); результат: logic |
X == Y, X != Y | - равенство, неравенство двух логических значений; результат: logic |
!X | - логическое отрицание; результат: logic |
Мультиарное условие:
E?A:B | - тернарное условие: если E истинно, то A, иначе B |
E?A:B:C | - кватернарное условие: если E истинно, то A, если E ложь, то B, иначе С |
E?A:B:C:D | - квантиринарное условие: если E истинно, то A, если E ложь, то B, если E не определено, то С, иначе D |
Если скобок нет, арифметические и логические операции выполняются слева-направо.
Есть также следующие две логические функции:
- or(X,Y,Z,...) - возвращает True если хотя бы один аргумент равен True. Аналогично дизъюнкции X | Y | Z |.., однако проверки прерываются при встрече первой же истины.
- and(X,Y,Z,...) - возвращает True если все аргументы равна True. Первый же отличный от True аргумент прерывает работу функции и она возвращает False.
Приоритеты
Приоритеты операций в порядке возрастания:
= | - прямое присваивание |
?::: | - мультиарное условие |
<-> | - эквивалентность (следование в две стороны) |
-> | - импликация (логическое следование) |
| | - дизъюнкция (логическое ИЛИ) |
& | - конъюнкция (логическое И) |
==,!= | - операции равенства и неравенства |
<,<=,>,>= | - операции сравнения |
+,- | - сложение и вычитание |
*,/,\,% | - умножение, вещественное деление, целочисленное деление, остаток от деления |
! | - отрицание |
X E Y | - связывание объекта ребром |
X++ | - постинкремент |
X-- | - постдекремент |
X+= | - сложение и присваивание |
X-= | - вычитание и присваивание |
X*= | - умножение и присваивание |
X/= | - вещественное деление и присваивание |
X\= | - целочисленное деление и присваивание |
X%= | - остаток и присваивание |
X[] | - обращение к элементу объекта по индексу |
X.name() | - обращение к методу объекта |
X.name | - обращение к полю объекта |
name() | - вызов функции |
Module.name() | - вызов функции из модуля |
[] | - константа содержащая массив |
0.0 | - константа содержащая число |
"hello" или 'hello' | - константа содержащая строку |
@a | - константа содержащая тип связи |
$a | - константа содержащая имя узла |
() | - выражение в скобках |
name | - переменная |
Так, в арифметике 1+2*3-4 это (1+(2*3))-4, а в логике X==Y & Z -> A | B & C это ((X==Y) & Z) -> ((A | B) & C)).
Переменные и константы
- var VARS - объявление переменных перечисленных через запятую в списке ARGS.
Имя переменной содержит латинские буквы, цифры, символ подчёркивания _ и решётки #.
Переменным при объявлении сразу может быть присвоено значение.
var X, Y = 5, Z = True
- static VARS - объявление статических переменных перечисленных через запятую в списке ARGS.
Имя переменной содержит латинские буквы, цифры, символ подчёркивания _ и решётки #.
Переменным при объявлении сразу может быть присвоено значение. Статическая переменная хранит свое значение между вызовами функций
в которых она объявлена. Инициализация выполняется только один раз при первом вызове функции содержащей переменную.
static X, Y = 5, Z = True
- global VARS - объявление глобальных переменных перечисленных через запятую в списке,
которые будут доступны в текущей области видимости. Если оператор указан за пределами функции, то соответствующие переменные будут
доступны во всех функциях:
var X = 0 var Y = 0 global Y // разрешаем доступ к переменной Y из из всех функций def func1(){ global X // разрешаем доступ к переменной X из функции func1 X = 10 // меняем значение глобальной переменной } def func2(){ Y = 20 // меняем значение глобальной переменной }
- edges LIST - объявление всех типов рёбер. Их будут знать все графы. Типы рёбер: "isa","attr","has","obj","sub","unit" являются предопределенными.
Имена типов рёбер:edges in, above, likes
- nodes LIST - объявление узлов во всех графах текущего класса:
nodes Ann, dog, cat#1
Условные операторы
- if COND { PROG_IF } - выполнение набора команд PROG_IF, если условие COND истинно (равно True).
false { PROG_FALSE } - выполнение набора команд PROG_IF, если условие COND ложно (равно False).
undef { PROG_UNDEF } - выполнение набора команд PROG_IF, если условие COND не определено (равно Undef).
else { PROG_ELSE } - выполнение набора команд PROG_IF, если вышеперечисленные условия не выполнились.
Если ветвление содержит одну команду, то фигурные скобки можно не ставить. Но в таком случае после условия обязательно должно стоять двоеточие.
false и undef можно менять местами, но else должен быть всегда последнимvar X = [0.2,0.8] if X: out "X is true" false out "X is false" undef out "X is undef" else out "X is something else"
Циклы
- while COND { PROG } - повторение набора команд PROG
до тех пор, пока условие COND истинно (равно True). Если PROG
состоит из одной команды, то фигурные скобки можно не ставить, а после COND можно поставить двоеточие.
var I = 0 while I < 5 { out I I=I+1 }
- for X,Y in EXPR { PROG } - в зависимости от содержимого
EXPR и его наличия существуют следующие варианты итерации:
- EXPR содержит переменную X, либо является логической константой. В таком случае выполняется перебор узлов текущего графа, удовлетворяющих условию EXPR,
и передача переменной X со значением узла в набор команд PROG.
Если PROG
состоит из одной команды, то фигурные скобки можно не ставить, а после EXPR можно поставить двоеточие.
for X in X.@likes.$Ann { out X }
В данной схеме Y указывать не нужно. - EXPR вычисляет значение одного из следующих типов:
- Массив - перебор элементов массива.Если Y отсутствует, то X - элемент массива.
Иначе: X - индекс, а Y - элемент массива.
var Arr = [2,1,0] for X in Arr { out X } // выведет: 2 1 0 for X,Y in Arr { out X,,":",,Y } // выведет: 0:2 1:1 2:0
- Хэш таблица - перебор элементов хэш таблицы. X - ключ элемента хеш таблицы, а
Y - значение элемента (Y может отсутствовать).
var Map = {"age":18,"weight":50} for X in Map { out X } // выведет: age weight for X,Y in Map { out X,,":",,Y } // выведет: age:18 weight:50
- Граф - перебор узлов графа. X - узел графа, а
Y - значение узла графа (Y может отсутствовать).
nodes a,b,c a.value(1) b.value('2') c.value([3]) for X in GRAPH { out X } // выведет: a b c for X,Y in GRAPH { out X,,":",,Y } // выведет: 1 2 [3]
- Массив - перебор элементов массива.Если Y отсутствует, то X - элемент массива.
Иначе: X - индекс, а Y - элемент массива.
- in EXPR отсутствует. При этом выполняется итерация узлов текущего графа. Эквивалентно for X,Y in GRAPH
for X { out X } // выведет: a b c for X,Y { out X,,":",,Y } // выведет: 1 2 [3]
- EXPR содержит переменную X, либо является логической константой. В таком случае выполняется перебор узлов текущего графа, удовлетворяющих условию EXPR,
и передача переменной X со значением узла в набор команд PROG.
Если PROG
состоит из одной команды, то фигурные скобки можно не ставить, а после EXPR можно поставить двоеточие.
- for X,E,Y,V in GRAPH - перебор всех ребер графа. X - узел графа из которого выходит ребро.
Y - узел графа в который идет ребро. E - отношиние связывающее узлы X и Y. V - значение истинности ребра.
Параметры V и GRAPH не являются обязательными. При отсутствии последнего, будут перебраны отношения текущего графа.
a in b b !on c for X,E,Y,V : out X,E,Y,V >> a in b True b on c False
- break прерывание выполнения операторов while или for с передачей управления на код идущий после их блоков PROG
- continue прерывание текущей итерации цикла и переход к следующей while или for
- def NAME(VARS) { PROG } - объявление функции-демона с именем NAME и списком переменных - его аргументов VARS через запятую. Сам код, использующий эти переменные, описывается в фигурных скобках (набор команд PROG).
- return RES - прерывание выполнения демона и возврат значения RES. Значение RES может быть любого типа. Если RES отсутствует, возвращается неопрелённое логическое значение Undef. Это же значение возвращается, если выполнились все команды PROG и в них не сработал return.
- out LST - вывести на экран значения переменных, выражений или констант в списке LST (разделены запятыми).
Анонимные функции
Безимянные функции, которые можно передавать как значение переменной и выполнить в нужном месте кода
Пример:var f = (a,b)=>a+b // сохраняем функцию, выполняющую сложение аргументов a и b в переменную f out f(1,2) // выводим результат выполнения функции >> 3
Зарезервированные имена
Ниже указанные имена являются служебными и следовательно запрещено их использование в скрипте в качестве имен переменных и демонов!
-
var,
global,
edges,
nodes,
if,
false,
undef,
else,
while,
for,
break,
continue,
def,
return,
out,
value,
exists,
fopen,
fclose,
fout,
forall,
System,
Math,
Mind,
GRAPH,
True,
False,
Undef,
isa,
attr,
has,
obj,
sub,
unit,
None