Pregunta

Estoy desarrollando algún tipo de software de simulación en Clojure que necesitará una gran cantidad de procesos de datos vectoriales (básicamente de origen como compensaciones en matrices de Java flota, típicamente en longitud 10-10000 gama). Un gran número de estos vectores tendrán que ir a través de diversas etapas de procesamiento - por ejemplo, normalizar los vectores, concatenar juntos dos corrientes de vectores, calcular un promedio móvil, etc.

En lugar de hacer todo en un estilo imperativo, esperaba hacer era crear una solución Clojure más de estilo funcional que hacer lo siguiente:

  • permite ninguna función vectorial que se convirtió en un enchufable módulo , por ejemplo (Def módulo-a (maquillaje módulo algunas funciones))
  • permiten que estos módulos sean compuesta en tuberías , por ejemplo (-Módulo combinado def (combinar-en-series módulo de un módulo-b)) sería alimentar la salida del módulo-a en la entrada de módulo-b
  • permitir funciones auxiliares a estado de acceso almacenados dentro de un módulo dado, por ejemplo, (Get-media móvil alguna de movimiento de la media-módulo), que tendrían que trabajar incluso si algunos de movimiento de la media-módulo está incrustado en lo profundo de un gasoducto combinado
  • ocultar cualquier código repetitivo detrás de las escenas, por ejemplo, asignar suficientemente grandes matrices temporales para el cálculo del vector.

¿Suena esto como un enfoque sensato?

Si es así, ninguna pista de implementación o bibliotecas que podrían ayudar?

¿Fue útil?

Solución

En un lenguaje funcional, todo es flujo de datos. Puede utilizar funciones como su concepto de módulo.

Para hacer frente a cada uno de sus casos de uso:

  • pluggagble módulo es una función Clojure que toma un solo argumento de que es el estado de su vector de datos. p.ej. (def module-a some-function) para permitir la fácil ampliación por módulos, se sugiere emplear un mapa Clojure como su estado, donde un campo es su gama de flotadores.
  • Componer módulos es la composición de funciones. p.ej. (def combined-module (compose module-a module-b)
  • Funciones auxiliares son funciones de descriptor de acceso, extrayendo el estado de sus datos. p.ej. Si los datos es un mapa Clojure con un campo :moving-average, a continuación, la palabra clave :moving-average es su función de acceso. Estado no se almacena en módulos.
  • código repetitivo se oculta en la ejecución de sus funciones, que puede ser declarada en cualquier lugar, posiblemente en otro archivo y espacio de nombres.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top