Domanda

Diverse domande sui linguaggi di programmazione funzionale mi hanno fatto pensare se XSLT è un linguaggio di programmazione funzionale. In caso contrario, quali funzionalità mancano? XSLT 2.0 ha ridotto o ridotto il divario?

È stato utile?

Soluzione

XSLT è dichiarativo rispetto a stateful.

Sebbene XSLT sia basato su idee di programmazione funzionale, non è un linguaggio di programmazione completamente funzionale, manca della capacità di trattare le funzioni come un tipo di dati di prima classe. Ha elementi come la valutazione pigra per ridurre la valutazione non necessaria e anche l'assenza di cicli espliciti.

Tuttavia, come un linguaggio funzionale, penso che possa essere ben parallelizzato con il multi threading automatico sicuro su più processori.

Da Wikipedia su XSLT :

  

Come lingua, XSLT è influenzato da   linguaggi funzionali e di   linguaggi di corrispondenza dei pattern basati su testo   come SNOBOL e awk. È il più diretto   il predecessore era DSSSL, un linguaggio che   ha eseguito la stessa funzione per SGML   che XSLT esegue per XML. XSLT può   anche essere considerato come un modello   processore.

Ecco un ottimo sito sull'uso di XSLT come linguaggio funzionale con l'aiuto di FXSL. FXSL è una libreria che implementa il supporto per funzioni di ordine superiore.

A causa di FXSL non penso che XSLT abbia bisogno di essere completamente funzionale. Forse FXSL sarà incluso come standard W3C in futuro, ma non ne ho prove.

Altri suggerimenti

Sono sicuro che ormai avete trovato questo link :-) http: //fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html .

Bene, le funzioni in XSLT sono cittadini di prima classe con qualche soluzione in fondo :-)

È un po 'come ci si sente quando lo sto programmando.

XSLT è interamente basato sulla definizione di funzioni e sull'applicazione ad eventi selezionati che scendono nel flusso di input.

XSLT ti consente di impostare una variabile. La programmazione funzionale non consente alle funzioni di avere effetti collaterali - e questo è un grosso problema.

Tuttavia, scrivendo in XSLT, si ha la stessa "sensazione di lavorare in modo FP. Stai lavorando con l'input, non lo stai modificando, per creare output.

Questo è un modello di programmazione molto, molto diverso da quello utilizzato quando si lavora con l'API DOM. DOM non separa affatto input e output. Ti viene consegnata una struttura di dati - e la manipoli come ritieni opportuno - senza esitazione, restrizione o rimorso.

Basti dire che se ti piacciono i FP e i principi alla base, probabilmente ti sentirai a tuo agio a lavorarci. Proprio come l'esperienza con la programmazione guidata dagli eventi - e lo stesso XML - ti farà sentire a tuo agio anche con esso.

Se la tua unica esperienza è con programmi top-down, non guidati da eventi, allora XSLT sarà davvero poco familiare, in realtà un paesaggio alieno. Almeno all'inizio. Crescere un po 'di esperienza e poi tornare a XSLT quando le espressioni XPath e la gestione degli eventi ti fanno davvero comodo ti ripagheranno profumatamente.

Per la maggior parte, ciò che rende XSLT non un linguaggio di programmazione funzionale al 100% è la sua incapacità di trattare le funzioni come un tipo di dati di prima classe.

Potrebbero essercene altri, ma questa è la risposta ovvia.

Buona fortuna!

Saxon-SA ha introdotto alcune funzioni di estensione che rendono funzionale XSLT. Puoi usare saxon: function () per creare un valore di funzione (in realtà un {http: //net.sf.saxon/java-type} net.sf.saxon.expr .UserFunctionCall ) che poi chiami con saxon: call () .

Saxon-B ha funzionalità simili con l'associazione di saxon: expression () e saxon: eval () . La differenza è che saxon: expression () accetta qualsiasi espressione XPath e saxon: eval () lo valuta, mentre saxon: function () prende il nome di una funzione che saxon: call () chiama.

Questo non è in realtà un argomento, poiché puoi solo dichiarare le variabili, non modificarne i valori dopo la dichiarazione. In tal senso, si tratta di uno stile dichiarativo e non imperativo, come affermato nell'articolo di Novatchev.

I linguaggi di programmazione funzionale come Scheme o Erlang ti consentono di dichiarare anche le variabili, e in Haskell puoi anche farlo:

- La funzione 'test' prende la variabile x e la aggiunge su ogni elemento dell'elenco xs

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top