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





По большей части, что делает XSLT не полностью функциональным языком программирования, так это его неспособность рассматривать функции как первоклассный тип данных.
Могут быть и другие, но это очевидный ответ.
Удачи!
XSLT декларативен в отличие от состояния.
Хотя XSLT основан на идеях функционального программирования, это не полностью функциональный язык программирования, ему не хватает возможности рассматривать функции как тип данных первого класса. В нем есть такие элементы, как ленивое вычисление, чтобы уменьшить ненужное вычисление, а также отсутствие явных циклов.
Однако, как и функциональный язык, я думаю, что его можно хорошо распараллелить с помощью автоматической безопасной многопоточности на нескольких процессорах.
As a language, XSLT is influenced by functional languages, and by text-based pattern matching languages like SNOBOL and awk. Its most direct predecessor was DSSSL, a language that performed the same function for SGML that XSLT performs for XML. XSLT can also be considered as a template processor.
Вот отличный сайт по использованию XSLT как функциональный язык с помощью FXSL. FXSL - это библиотека, которая реализует поддержку функций высшего порядка.
Из-за FXSL я не думаю, что XSLT сам должен быть полностью функциональным. Возможно, в будущем FXSL будет включен в качестве стандарта W3C, но у меня нет свидетельств этого.
@recursive: это не петли в императивном смысле этого слова. Порядок выполнения не гарантируется (это упрощает параллельную реализацию). Я думаю, что близкая аналогия заключается в том, что с xsl:for-each вы создаете проекция на наборе.
@Abel: Порядок вывода кажется гарантированным, и я не вижу полезного различия между фактическим порядком выполнения и порядком конечных результатов. Кажется, это деталь реализации.
@recursive, именно поэтому эти циклы отличаются от циклов в императивных языках. Предположим, у вас есть xsl:message, который создает побочный эффект, не гарантируется, как часто и в каком порядке он вызывается (хотя были способы обеспечить это). Так что это не только деталь реализации. Однако это во многом свойство функционального программирования.
Отличный сайт, на который вы указали, - это 404: C
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().
fwiw это также возможно в .NET снова через расширение, и imho не так элегантно
Для функционального программирования в XSLT расширения не требуются, и Jeni это хорошо знает: fxsl.sf.net. FXSL - библиотека функционального программирования для XSLT существует уже более 8 лет. Он полностью написан на самом XSLT. Практически полностью реализует функции Haskell Prelude.
В XSLT 3.0, который поставляется с XPath 3.0 или 3.1, функции теперь являются первоклассными гражданами и могут передаваться как элементы, вызывать и т. д. Больше нет необходимости в расширениях.
Вот такие ощущения, когда я программирую.
XSLT полностью основан на определении функций и применении их к выбранным событиям, которые поступают во входной поток.
XSLT позволяет вам установить переменную. Функциональное программирование не позволяет функциям иметь побочные эффекты - и это очень важно.
Тем не менее, при написании в XSLT возникает то же ощущение, что и работа в стиле FP. Вы работаете с вводом - вы не меняете его - для создания вывода.
Эта модель программирования очень сильно отличается от той, что использовалась при работе с DOM API. DOM вообще не разделяет ввод и вывод. Вам вручают структуру данных - и вы искажаете ее, как считаете нужным - без колебаний, ограничений или раскаяния.
Достаточно сказать, что если вам нравится FP и принципы, лежащие в основе этого, вы, вероятно, будете чувствовать себя комфортно в нем. Точно так же, как опыт программирования, управляемого событиями - и самого XML - также поможет вам освоить его.
Если ваш единственный опыт работы с нисходящими программами, не управляемыми событиями, тогда XSLT будет очень незнакомым, действительно чуждым ландшафтом. По крайней мере, сначала. Накопив немного опыта, а затем вернувшись к XSLT, когда выражения XPath и обработка событий действительно удобны для вас, окупятся щедро.
Да, XSL позволяет вам устанавливать переменную, но она неизменяема.
Ты прав! Я поправляюсь по этому поводу. Спасибо, что обратили на это внимание. Установив значение переменной в XSLT, вы не сможете его изменить. Однажды я столкнулся с небольшой проблемой, когда забыл / не заметил этого.
Знаете, я думаю, им следовало сделать это более явным в самом языке, потому что я уверен, что вы и я не единственные, кто впал в это. <variable> заставляет меня думать о том, что меняется (во время выполнения) - <constant> был бы более точным. На самом деле, я помню, что мой опыт работы с XSLT был неудобным, особенно потому, что я ожидал, что он будет вести себя не так, как предполагалось, почти так же, как Java-программист почувствовал бы себя в первый раз, когда он / она использует Javascript.
@CamiloMartin, он называется переменной, потому что он может варьироваться в зависимости от контекста выражения select или содержащего sequence constructor. Константа будет одинаковой во всей программе. Путаница здесь в том, что переменная не может быть переназначен в рамках той же области. Но его значение определенно Переменная, отсюда и название. Однако верно и обратное: XSLT не имеет понятия констант (это изменилось в XSLT 3.0).
@Abel более 4 лет спустя, но я все еще нахожу XSLT ошеломляющим. Как будто кто-то сконструировал космический корабль, чтобы косить лужайку.
@camilo, обычно требуется полдня с хорошим инструктором или интерактивным курсом, чтобы изучить основы, но без этого, учитывая необычный синтаксис, метод проб и ошибок может привести к большому разочарованию. Не уверен в аналогии с «космическим кораблем», я думаю, что это наоборот, xslt 1.0 был настолько ограничен, xslt 2.0 значительно улучшился, xslt 3.0 (с xpath 3.1) сделал его зрелым языком. То, что раньше было сложным в xslt, теперь стало проще, а выражения и конструкции стали намного чище.
Кстати, мой аргумент о различных переменных в xslt: это не отличается в других функциональных языках от переменных или привязок let.
Я уверен, что вы, ребята, уже нашли эту ссылку :-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html.
Ну, функции в XSLT - это первоклассные граждане, и в конце концов есть некоторые обходные пути :-)
На самом деле это не аргумент, поскольку вы можете только объявлять переменные, но не изменять их значения после объявления. В этом смысле это декларативный, а не императивный стиль, как сказано в статье Новачева.
Функциональные языки программирования, такие как Scheme или Erlang, также позволяют объявлять переменные, и в Haskell вы также можете это сделать:
- функция test принимает переменную x и добавляет ее к каждому элементу списка xs
test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
Эрик, вам было бы интересно узнать, что XSLT 3.0 является - настоящий функциональный язык программирования. Он использует XPath 3.0, в котором функции являются объектами первого класса и могут передаваться как параметры другим функциям или возвращаться в результате вызова функции.