Является ли XSLT функциональным языком программирования? - PullRequest
22 голосов
/ 21 сентября 2008

Несколько вопросов о функциональных языках программирования заставили меня задуматься о том, является ли XSLT функциональным языком программирования. Если нет, то какие функции отсутствуют? XSLT 2.0 сократил или сократил разрыв?

Ответы [ 6 ]

28 голосов
/ 21 сентября 2008

XSLT является декларативным, а не с состоянием.

Хотя XSLT основан на идеях функционального программирования, он не является полнофункциональным языком программирования, ему не хватает возможности рассматривать функции как тип данных первого класса. Он имеет такие элементы, как ленивая оценка, чтобы уменьшить ненужную оценку, а также отсутствие явных циклов.

Как и функциональный язык, я думаю, что он может быть хорошо распараллелен с автоматической безопасной многопоточностью на нескольких процессорах.

С Википедия по XSLT :

Как язык, XSLT находится под влиянием функциональные языки и текстовые языки соответствия шаблонов как СНОБОЛ и ВЕК. Его самый прямой предшественником был DSSSL, язык, который выполнил ту же функцию для SGML что XSLT выполняет для XML. XSLT может также рассматривается как шаблон процессор.

Вот замечательный сайт по использованию XSLT в качестве функционального языка с помощью FXSL. FXSL - это библиотека, которая реализует поддержку функций высшего порядка.

Из-за FXSL я не думаю, что XSLT сам по себе должен быть полностью функциональным. Возможно, FXSL будет включен в качестве стандарта W3C в будущем, но у меня нет никаких доказательств этого.

7 голосов
/ 29 января 2009

Я уверен, что вы, ребята, уже нашли эту ссылку :-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html.

Ну функции в XSLT являются гражданами первого сорта с некоторыми обходными путями в конце концов: -)

6 голосов
/ 19 октября 2008

Это то, что я чувствую, когда программирую.

XSLT полностью основан на определении функций и применении их к выбранным событиям, поступающим во входной поток.

XSLT позволяет вам установить переменную. Функциональное программирование не позволяет функциям иметь побочные эффекты - и это важно.

Тем не менее, при написании в XSLT ощущается то же самое, что и при работе в режиме FP. Вы работаете с вводом - вы не меняете его - для создания вывода.

Это очень, очень отличная модель программирования от используемой при работе с DOM API. DOM вообще не разделяет ввод и вывод. Вам передается структура данных - и вы можете манипулировать ею так, как считаете нужным - без колебаний, ограничений или угрызений совести.

Достаточно сказать, что если вам нравится FP и принципы, лежащие в его основе, вы, вероятно, будете чувствовать себя комфортно, работая в нем. Точно так же, как опыт работы с программированием, управляемым событиями, и с самим XML, вам это тоже будет удобно.

Если ваш единственный опыт работы с нисходящими, не управляемыми событиями программами - тогда XSLT будет очень незнакомым, действительно чуждым ландшафтом. По крайней мере, на первый взгляд. Приобретая немного опыта, а затем возвращаясь к XSLT, когда XPath-выражения и обработка событий действительно удобны для вас, вы сможете окупиться.

5 голосов
/ 21 сентября 2008

По большей части, что делает XSLT не на 100% функциональным языком программирования, так это его неспособность рассматривать функции как первоклассный тип данных.

Могут быть и другие, но это очевидный ответ.

Удачи!

4 голосов
/ 21 сентября 2008

Saxon-SA представила некоторые функции расширения, которые делают функциональность XSLT. Вы можете использовать saxon:function() для создания значения функции (фактически значения {http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall), которое затем вызывается с помощью saxon:call().

Saxon-B имеет аналогичную функциональность с сопряжением saxon:expression() и saxon:eval(). Разница в том, что saxon:expression() принимает любое выражение XPath и saxon:eval() оценивает его, тогда как saxon:function() принимает имя функции, которую saxon:call() вызывает.

0 голосов
/ 11 марта 2009

Это на самом деле не аргумент, поскольку вы можете только объявлять переменные, а не изменять их значения после объявления. В этом смысле это декларативный, а не императивный стиль, как указано в статье г-на Новатчева.

Функциональные языки программирования, такие как Scheme или Erlang, позволяют также объявлять переменные, и в Haskell вы также можете сделать это:

- функция 'test' берет переменную x и добавляет ее в каждый элемент списка xs

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
...