Wednesday, August 29, 2007

Самый популярный функциональный язык

... чей рантайм установлен практически на каждом компьютере — это 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 ее точно еще не будет)

Ссылки:

6 comments:

Сёмка Новиков said...

О! Спасибо, всё думал погуглить в поисках предмета для медитации.

lrrr said...

Кстати, основной плюс, в отличие от хаскелов и окемлов -- слово XSLT не пугает коллег по работе :)

Щас вот в проекте порядка полутора мегабайт сиплюсплюсного кода генерится на XSLT.

Anonymous said...

Ужас какой. :-)
У меня как у человека пишущего на Лиспе XML с XSLT вызывают невыразимые словами эмоции между удивлением, страхом, возмущением и общемировой скорбью. ;-)

Anonymous said...

Там запятая между «Лиспе» и «XML». Извините за лишний каммент.

Anonymous said...

Ох уж эти XML-программисты..

Anonymous said...

Загляните в 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