-
Notifications
You must be signed in to change notification settings - Fork 1
Шаблоны
Осторожно, форматирование может сломаться при попытке воспроизвести примеры :(
Шаблон
var template =
@"{{ var = any_of ["i", "j"] | здесь в подстановке определяем глобальные переменные;
c = any_of ["c", "const", "veryImportantVariable"] | так как в подстановке только операции присваивания
inc = random 2 5 | то подстановка возвращает ничего и результатом рендеринга
op = c + " += " + var + ";" | будет пустая строка
}} for (var {{var}} = 0; {{var}} < n; {{var}} += {{inc}}) | здесь используем ранее определенные переменные в шаблоне
{ |
{{op}} |
}" |
Результат:
for (var i = 0; i < n; i += 4)
{
veryImportantVariable += i;
}
Шаблон
var template =
@"
for (var i = 0; i < {{const1}} * n; i++) | используем готовую подстановку
{ |
for (var j = {{random -10 -1}}; j < i; j++) | используем функцию random из дополнительных функций
{ |
{{simple_operation1}}; | тоже готовая подстановка
i++; |
} |
}" |
Результат
for (var i = 0; i < 25 * n; i++)
{
for (var j = -7; j < i; j++)
{
c += 3;
i++;
}
}
Пусть пользователь -- человек, заполняющий уровень генераторами.
Подстановка - некоторая строка вида "{{ smth }}
.
Шаблон - некоторая строка, которая может содержать в себе подстановки - "usual text {{ substitution }} usual text"
Рендеринг шаблона - процесс замены подстановок сгенерированными значениями.
Пользователь хочет создать задачку, в ответе, вопросе, описании и других элементах которой будут некоторым образом заменяться подстановки после рендеринга.
Внутри подстановки могут находиться различные выражения на языке Scriban, описанном здесь.
Можно определять глобальные переменные в рамках одного шаблона
Template
"{{ var1 = 5 }} Some number is {{ var1 }} and this is incremented number {{ var1 + 1 }}"
Rendered
" Some number is 5 and this is incremented number 6"
Функции применяются к аргументам через пробел, без скобок и запятых ¯\(ツ)/¯
В данном языке есть некоторое количество встроенных функций, но кроме них добавляются специальные, связанные с рандомизацией, функции:
T any_of<T>(T[] items)
поскольку в языке динамическая типизация и типов в общем-то и нет, то T = any_of [int, double, string]
int random(int from, int to)
- Вы можете добавить свою функцию здесь
Кроме того, для удобства, некоторые распространенные подстановки сделаны заранее, n in [1,5]
:
-
loop_var[n] = any_of [ "i", "j", "k", "x", "y", "step" ]
-
const[n] = random(-50, 50)
, но без нуля -
to[m] = any_of [ "n", "m", "length", "amount", "size" ]
-
simple_operation[n] = any_of ["c++", "k1--", "service.Update()", "queue.Pop()", "k3++"]