2008-09-21 47 views
21

Varias preguntas sobre los lenguajes de programación funcional me han hecho pensar si XSLT es un lenguaje de programación funcional. Si no, ¿qué características faltan? ¿XSLT 2.0 se acortó o cerró la brecha?¿XSLT es un lenguaje de programación funcional?

+2

Eric, le interesaría saber que XSLT 3.0 ** es ** un verdadero lenguaje de programación funcional. Utiliza XPath 3.0 en el que las funciones son objetos de primera clase y se pueden pasar como parámetros a otras funciones o se pueden devolver como resultado de llamar a una función. –

Respuesta

26

XSLT es declarativo en lugar de con estado.

Aunque XSLT se basa en ideas de programación funcional, no es un lenguaje de programación completamente funcional, carece de la capacidad de tratar las funciones como un tipo de datos de primera clase. Tiene elementos como evaluación diferida para reducir la evaluación innecesaria y también la ausencia de bucles explícitos.

Sin embargo, como un lenguaje funcional, creo que se puede paralelizar muy bien con multihilo automático seguro en varios procesadores.

De Wikipedia on XSLT:

Como lenguaje, XSLT está influenciada por lenguajes funcionales, y por lenguajes basados ​​en texto de coincidencia de patrones como SNOBOL y awk. Su predecesor más directo era DSSSL, un lenguaje que realizaba la misma función para SGML que XSLT realiza para XML. XSLT puede también se puede considerar como un procesador de plantilla .

Aquí hay un gran sitio sobre el uso de XSLT as a functional language con la ayuda de FXSL. FXSL es una biblioteca que implementa soporte para funciones de orden superior.

Debido a FXSL no creo que XSLT tenga una necesidad de ser totalmente funcional. Quizás FXSL se incluirá como un estándar W3C en el futuro, pero no tengo evidencia de esto.

+1

XSLT tiene bucles explícitos: http://www.w3schools.com/xsl/el_for-each.asp – recursive

+0

@recursive: estos no son _loops_ en el sentido imperativo de la palabra. El orden de ejecución no está garantizado (esto facilita las implementaciones paralelas). Creo que una analogía cercana es que con 'xsl: for-each' creas una _projection_ en un conjunto. – Abel

+0

@Abel: el orden de los resultados parece estar garantizado, y no veo una distinción útil entre el orden real de ejecución y el orden de los resultados finales. Eso parece ser un detalle de implementación. – recursive

4

En su mayor parte, lo que hace que XSLT no sea un lenguaje de programación 100% funcional es su incapacidad para tratar las funciones como un tipo de datos de primera clase.

Puede haber algunos otros, pero esa es la respuesta obvia.

¡Buena suerte!

4

Saxon-SA ha introducido algunas funciones de extensión que hacen que XSLT funcione. Puede usar saxon:function() para crear un valor de función (en realidad, un valor {http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall) al que puede llamar con saxon:call().

Saxon-B tiene una funcionalidad similar con el emparejamiento de saxon:expression() y saxon:eval(). La diferencia es que saxon:expression() toma cualquier expresión XPath, y saxon:eval() la evalúa, mientras que saxon:function() toma el nombre de una función que llama saxon:call().

+0

esto también es posible en .NET de nuevo a través de la extensión, y no es tan elegante como – annakata

+1

No son necesarias extensiones para la programación funcional en XSLT y Jeni lo sabe bien: http://fxsl.sf.net. FXSL: la biblioteca de programación funcional para XSLT existe desde hace más de 8 años. Está escrito completamente en XSLT. Implementa casi por completo las funciones de Haskell Prelude. –

+0

En XSLT 3.0, que viene con XPath 3.0 o 3.1, las funciones ahora son ciudadanos de primera clase y pueden pasarse como elementos, o invocarse, etc. Ya no es necesario usar extensiones. – Abel

6

Eso es como se siente cuando lo estoy programando.

XSLT se basa completamente en la definición de funciones y su aplicación a los eventos seleccionados que se encuentran en la secuencia de entrada.

XSLT le permite establecer una variable. La programación funcional no permite que las funciones tengan efectos secundarios, y eso es un problema.

Aún así, escribiendo en XSLT, uno tiene la misma "sensación de trabajar en FP".Está trabajando con entrada, no la está modificando, para crear resultados.

Este es un modelo de programación muy, muy diferente del utilizado al trabajar con DOM API. DOM no separa la entrada y la salida en absoluto. Se le entrega una estructura de datos, y la manipula como mejor le parezca, sin vacilación, restricción o remordimiento.

Baste decir si te gusta FP y los principios que hay detrás, probablemente te sientas cómodo trabajando en ello. Al igual que la experiencia con programación impulsada por eventos, y el XML en sí mismo, también lo hará sentir cómodo con él.

Si su única experiencia es con programas descendentes, no basados ​​en eventos, entonces XSLT será un paisaje alienígena muy desconocido. Al menos al principio. Desarrollar una pequeña experiencia y luego volver a XSLT cuando las expresiones XPath y el manejo de eventos le resulten realmente cómodos dará sus frutos.

+1

Sí, XSL te permite establecer una variable, pero es inmutable. –

+0

¡Tienes razón! Estoy corregido en ese punto. Gracias por llamar la atención. Una vez que estableces un valor de variable en XSLT no puedes cambiarlo. De hecho, me encontré con un problema con eso una vez cuando lo olvidé/pasé por alto. – JohnnySoftware

+0

Sabes, creo que deberían haberlo hecho más explícito en el idioma en sí, porque estoy seguro de que tú y yo no somos los únicos que hemos caído en eso. '' me hace pensar en algo que varía (en tiempo de ejecución) - '' sería más preciso. De hecho, recuerdo que mi experiencia con XSLT fue incómoda, especialmente porque esperaba que se comportara de una manera en la que en realidad no era la intención, más o menos lo mismo que un programador de Java sentiría la primera vez que usa Javascript. –

0

Eso no es realmente un argumento, ya que sólo se puede declarar variables, no cambia sus valores después de la declaración. En ese sentido, es un estilo declarativo, no imperativo, como se afirma en el artículo del señor Novatchev.

lenguajes de programación funcionales como Scheme o Erlang que pueda declarar variables, así, y en Haskell también se puede hacer eso:

- Función de 'prueba' toma la variable x y lo añade en cada elemento de la lista xs

test :: [Int] -> [Int]<br> 
test xs = map (+ x) xs<br> 
where x = 2 
Cuestiones relacionadas