Skip to content

Шаблоны

Антон Войцишевский edited this page May 30, 2019 · 7 revisions

Ссылки

Синтаксис языка

Примеры сразу

Осторожно, форматирование может сломаться при попытке воспроизвести примеры :(

Задачка на один цикл

Шаблон

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++"]

Clone this wiki locally