11

Encontré una biblioteca interesante en Haskell llamada Scrap Your Boilerplate basada en paper by Simon Peyton Jones que parece una forma efectiva de escribir código que puede actualizar estructuras de datos grandes, profundamente anidadas en una programación funcional idioma. Permite el código como:Clojure equivalente a Haskell's "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)) 

que efectivamente aumenta el salario en una proporción fija k para todos en una estructura de datos de empresa potencialmente grande y compleja.

¿Existe una biblioteca o enfoque equivalente para lograr el mismo tipo de estilo de programación en Clojure?

Por ejemplo, ¿cómo podría escribir el equivalente Clojure del ejemplo utilizado anteriormente:

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

Los documentos SYB fueron una continuación del trabajo del coautor Ralf Lämmel sobre la integración de Stratego en Haskell con (diferente) el coautor Joost Visser. Para actualizar las estructuras anidadas en Clojure necesitaría el lado de "control transversal" de SYB más que su lado de genéricos de tipo de datos, por lo que podría ampliar su pregunta para preguntar si alguien ha incrustado Stratego en Clojure. No sé Clojure y un poco de búsqueda web parece sugerir que nadie ha hecho esto todavía. Ciertamente, hay incrustaciones de los trazados de Stratego en Scheme que deberían ser más fáciles de virar que SYB. He escrito uno yo mismo. –

+2

No sé SYB, pero tal vez [clojure.walk] (http://richhickey.github.com/clojure/clojure.walk-api.html) es lo que está buscando? –

Respuesta

4

Lo más cercano a esto en Clojure es probablemente el "en" funciones (Assoc-in, actualización-en, dissoc -en).

Estas funciones le permiten realizar cambios detallados anidados en clojure. No hay un equivalente a estas funciones en Haskell porque dependen en gran medida del tipado dinámico.

1

No existían cuando se hizo esta pregunta por primera vez, pero creo que transducers permiten un estilo similar de programación. Básicamente transducible procesos implementar un determinado conjunto de funciones, que transductores pueden utilizar para atravesar cualquier proceso transducible.

Cuestiones relacionadas