Комментарии 9
По-моему цель была другая — упороться и сделать игру на чем-то, что большинство считает для этого непригодным ;)
И это удалось!
Я автору поставил два плюса сразу. А «упоротый» — это в первую очередь «увлеченный чем либо» (возможно излишне), а уже во вторую негативные значения. По крайней мере — для меня.
Xslt крут! А так как он сам тоже XML (гомоиконность, хе), то можно написать предварительные преобразования, с помощью которых добавить некоторого синтаксического сахара в язык. Прям как Лисп, только XML.
Хотя есть у него и фундаментальные ограничения. Приходится грузить весь xml документ в память, и одновременно много больших документов не потрансформируешь, оперативы не хватит. А единственная реализация XSLT 3.0 с поддержкой потоковой обработки стоит сотни нефти.
Понятно, что у потоковых трансформаций есть ограничения, да и чисто потоковые штуки не особо полезны. Но в XSLT 3.0 есть возможность держать в памяти только поддерево, в рамках которого выполнять уже все возможные XSLT трансформации. Сортировку top-level элементов за константную память конечно не сделаешь, но для наших задач хватило бы. Однако из-за дороговизны пришлось запилить свой ограниченный DSL.
Такой код не валиден:
<xsl:for-each select="$board/cell"/>
Код валиден, только ничего не возвращается.
К дочерним узлам получить доступ можно:
<xsl:for-each select="$board/>
более читаемо:
<xsl:for-each select="$board/self::cell"/>
по индексу:
<xsl:for-each select="$board[1]"/>
<xsl:for-each select="$board[2]/self::cell"/>
для переменных можно и тип указать:
<xsl:variable name="board" as="node()*">
Интерактивная игра на XSLT