У меня есть веб-приложение. В рамках этого мне нужно, чтобы пользователи приложения могли писать (или копировать и вставлять) очень простые скрипты для работы с их данными.
Сценарии действительно могут быть очень простыми, а производительность - лишь самая незначительная проблема. . И пример сложности скрипта, который я имею в виду, может быть примерно таким:
ratio = 1.2345678
minimum = 10
def convert(money)
return money * ratio
end
if price < minimum
cost = convert(minimum)
else
cost = convert(price)
end
где цена и стоимость являются глобальными переменными (что-то, что я могу передать в среду и получить доступ после вычисления).
Я, однако, должен кое-что гарантировать.
Ни один запущенный скрипт не может получить доступ к среде Python. Они не могут импортировать данные, вызывать методы, которые я не раскрываю явно для них, читать или писать файлы, создавать потоки и т. Д. Мне нужна полная блокировка.
Мне нужно установить жесткое ограничение на количество ' циклов, для которых выполняется сценарий. Циклы - это здесь общий термин. могут быть инструкции виртуальной машины, если язык компилируется в байтах. Apply-вызывает цикл Eval / Apply. Или просто итерации через какой-то центральный цикл обработки, который запускает сценарий. Детали не так важны, как моя способность остановить что-то через короткое время и отправить электронное письмо владельцу со словами: «Кажется, ваши сценарии делают больше, чем просто сложение нескольких чисел - разберитесь с ними»
. Он должен работать на ванильном непатентованном CPython.
До сих пор я писал свой собственный DSL для этой задачи. Я могу это сделать. Но мне было интересно, смогу ли я опереться на плечи гигантов. Есть ли для Python мини-язык, который мог бы это сделать?
Существует множество хакерских вариантов Lisp (даже тот, который я написал на Github), но я бы предпочел что-нибудь с более неспециализированным синтаксисом (больше C или Паскаль, скажем), и поскольку я рассматриваю это как альтернативу написанию кода самому, мне бы хотелось чего-нибудь более зрелого.
Есть идеи?