... чей рантайм установлен практически на каждом компьютере — это XSLT, язык для трансформации XML документов.
Если кто не в курсе, в списке возможностей — абсолютное отсутствие побочных эффектов, то есть язык чисто функциональный, и поддержка функций высшего порядка.
Все это в изобилии можно наблюдать в замечательной XSLT-библиотеке FXSL, разработанной Димитром Новачевым. Реализации большинства функциональных идиом, таких как композиция функций, операций со списками по мотивам хаскелевской стандартной библиотеки — map/filter/foldl/zipWith и т.п. Более того, в cvs-версии библиотеки можно найти даже реализацию небольшого LR-парсера на чистом XSLT 2.0
Конечно, выглядит не очень прозрачно, вот например использование foldl для вычисления произведения элементов списка:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foldl-func="foldl-func" xmlns:f="http://fxsl.sf.net/" exclude-result-prefixes="f foldl-func" > <xsl:import href="../f/func-foldl.xsl"/> <!-- This transformation must be applied to: ../data/numList.xml Expected result: 3628800 or 3.6288E6 --> <foldl-func:foldl-func/> <xsl:variable name="vFoldlFun" select="document('')/*/foldl-func:*[1]"/> <xsl:output encoding="UTF-8" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:value-of select="f:foldl($vFoldlFun, 1, 1 to 10 )"/> </xsl:template> <xsl:template match="*[namespace-uri() = 'foldl-func']" mode="f:FXSL"> <xsl:param name="arg1" select="0"/> <xsl:param name="arg2" select="0"/> <xsl:value-of select="$arg1 * $arg2"/> </xsl:template> </xsl:stylesheet> Created with colorer-take5 library. Type 'xslt2'
В качестве примеров более серьезных программ на XSLT — решалка головоломки Sudoku и CSV2XML конвертер,написанные товарищем по имени Andrew Welch, у которого есть еще очень интересный блог по XSLT.
Если захочется поиграться, берите saxon в качестве XSLT процессора — поддержка XSLT 2.0 в MSXML только планируется (а в Orcas ее точно еще не будет)
Ссылки:
- Блог Димитра Новачева
- Блог "Thoughts on XSLT"
- FXSL на SourceForge.
6 comments:
О! Спасибо, всё думал погуглить в поисках предмета для медитации.
Кстати, основной плюс, в отличие от хаскелов и окемлов -- слово XSLT не пугает коллег по работе :)
Щас вот в проекте порядка полутора мегабайт сиплюсплюсного кода генерится на XSLT.
Ужас какой. :-)
У меня как у человека пишущего на Лиспе XML с XSLT вызывают невыразимые словами эмоции между удивлением, страхом, возмущением и общемировой скорбью. ;-)
Там запятая между «Лиспе» и «XML». Извините за лишний каммент.
Ох уж эти XML-программисты..
Загляните в FXSL 2.0 и увидите что код функций намного краще...
Вот например тот самъй foldl():
<xsl:function name="f:foldl">
<xsl:param name="pFunc" as="element()"/>
<xsl:param name="pA0" as="item()*"/>
<xsl:param name="pList" as="item()*"/>
<xsl:sequence select=
"if (empty($pList))
then
$pA0
else
f:foldl($pFunc,
f:apply($pFunc, $pA0, $pList[1]),
$pList[position() > 1]
)"/>
</xsl:function>
Cheers,
Dimitre Novatchev
Post a Comment