2011-09-11 19 views
11

Ho trovato una libreria interessante in Haskell chiamata Scrap Your Boilerplate basata su un paper by Simon Peyton Jones che sembra un modo efficace per scrivere codice in grado di aggiornare strutture di dati grandi e profondamente annidate in una programmazione funzionale linguaggio. Abilita codice come:Equivalente Clojure di "Scrap Your Boilerplate" (SYB)

incS :: Float -> Salary -> Salary 
incS k (S s) = S (s * (1+k)) 

increase :: Float -> Company -> Company 
increase k = everywhere (mkT (incS k)) 

Che effettivamente aumenta lo stipendio di una proporzione fissa k per tutti in una struttura di dati aziendali potenzialmente ampia e complessa.

Esiste una libreria o un approccio equivalente per ottenere lo stesso tipo di stile di programmazione in Clojure?

Per esempio, come ho potuto scrivere l'equivalente Clojure dell'esempio utilizzato in precedenza:

(defn increase [company k] 
    (everywhere-in company (transform-map-values :salary #(* % (+ 1 k)))) 
+2

I documenti del SYB erano una continuazione del lavoro di Ralf Lämmel del co-autore sull'incorporazione di Stratego in Haskell con il coautore (diverso) Joost Visser. Per aggiornare le strutture nidificate in Clojure avresti bisogno del lato "controllo trasversale" di SYB più del suo lato generico di dati, quindi potresti ampliare la tua domanda per chiedere se qualcuno ha incorporato Stratego in Clojure. Non conosco Clojure e un po 'di ricerca sul Web sembra suggerire che nessuno l'abbia ancora fatto. Ci sono certamente degli embeddings degli Stratego traversal in Scheme che dovrebbero essere più facili da portare di SYB, ne ho scritto uno io stesso. –

+2

Non so SYB, ma forse [clojure.walk] (http://richhickey.github.com/clojure/clojure.walk-api.html) è quello che stai cercando? –

risposta

4

Il più vicino a questo in Clojure è probabilmente il "in" funzioni (assoc-in, update-in, dissoc -in).

Queste funzioni consentono di eseguire modifiche annidate in profondità e in clojure. Non c'è equivalente a queste funzioni in Haskell perché si basano molto sulla digitazione dinamica.

1

Non erano in giro quando questa domanda è stata posta per la prima volta, ma credo che lo transducers abiliti uno stile di programmazione simile. Fondamentalmente i processi trasducibili implementano un certo insieme di funzioni, che i trasduttori possono utilizzare per attraversare qualsiasi processo trasduttore.

Problemi correlati