Знакомьтесь, hscript (он же haXe Script)

Николя Канасье продолжает удивлять и вдохновлять, создавая новые проекты основанные на haXe и новые пути развития платформы и даря их сообществу. На этот раз очередным его подарком стал представленный в начале этой недели hscript - скриптовый движок или интерпретатор скриптов для haXe.

hscript (он же haXe Script) это динамически типизированный язык, который при этом содержит большинство выражений и базовых фич самого haXe:

  • константы (int,float,string)
  • идентификаторы
  • локальные переменные и правила областей видимости
  • блоки { ... }
  • выражения в скобках ( )
  • доступ к полям объекта
  • вызовы методов
  • бинарные и унарные операции
  • конструкции if / while / for / break / continue
  • выражения ++ и --

Это текущий список в описании на главной странице hscript на Google Code, но позавчера в списке рассылки Николя сообщил о том, что уже закончил добавление к функционалу hscript оставшихся фич, запланированных им ранее:

Были добавлены массивы (объявление и доступ к чтению/записи), функции (и именованные и анонимные) и выражение "return". Локальные переменные теперь отделены в hscript от глобальных и могут использоваться в функциях, объявленных в той же области видимости (то же поведение, что и в haXe).

hscript состоит всего из трёх файлов:

  • hscript.Expr : содержит декларации Enum-перечислений
  • hscript.Parser : маленький парсер, который превращает строку в абстрактное синтаксическое дерево (AST)
  • hscript.Interp : маленький интерпретатор выполняющий AST и возвращающий последнее полученное значение.

Об основном назначении hscript автор написал коротко и просто: "В некоторых проектах бывает иногда полезной возможность интерпретировать некий код динамически, без какой-либо перекомпиляции."

Можно сказать, что это "язык в языке" или способ динамической интерпретации скриптов (которые также динамически можно создавать, модифицировать) "на лету", т.е. во время выполнения.

Установка hscript:

Для установки hscript как обычно достаточно команды haxelib install hscript, а для компиляции вашей программы с его использованием флага -lib hscript.

Примечание: hscript требует haXe 2.0a (текущая CVS версия языка)

Небольшой пример использования haXe Script:

var script = "
    var sum = 0;
    for( a in angles )
        sum = sum + Math.cos(a);
    sum;
"
;
var parser = new hscript.Parser();
var program = parser.parseString(script);
var interp = new hscript.Interp();
interp.variables.set("Math",Math); // даёт скрипту доступ к классу Math
interp.variables.set("angles",[0,1,2,3]); // создаёт в скрипте список углов
trace( interp.execute(program) );  
скрипт в примере считает сумму косинусов углов, полученных из кода основной программы.

hScript не оптимизирован и не предназначен для того, чтобы быть очень быстрым. Но он полностью независим от платформы (crossplatform), т.к. является чистым haXe кодом (не использует специфические API для конкретных платформ)

По сравнению с haXe, ограничениями hscript на данный момент являются :

  • нет типизации и объявлений классов
  • нет выражения new
  • нет декларации объектов
  • нет += и других сложных присваиваний
  • нет switch
  • нет try/catch/throw
  • только одно объявление переменной разрешено в var