Question

Je développe des logiciels de simulation Clojure qui devra beaucoup de processus de données vectorielles (essentiellement d'origine sous forme de décalages dans des tableaux de Java flotte, longueur généralement dans 10-10000 plage). Un grand nombre de ces vecteurs devront passer par différentes étapes de traitement - par exemple normalisant les vecteurs, concaténant deux flux de vecteurs, calculer une moyenne etc.

en mouvement

Plutôt que de faire tout dans un style impératif, j'espérais faire était de créer une solution de Clojure plus de style fonctionnel qui procédez comme suit:

  • permettre à une fonction vectorielle à être transformé en un Module enfichable , par exemple, (Def module un (make-module une fonction))
  • permettre à ces modules d'être composé de pipelines , par exemple, (-Module combiné def (combiner en série module d'un module-b)) alimenterait la sortie du module à un à l'entrée du module-b
  • permettre aux fonctions auxillary à l'état d'accès stockés dans un module donné, par exemple, (Get-moyenne mobile un peu en mouvement-module moyen), qui aurait besoin de travailler même si certains en mouvement-module moyen est intégré dans un pipeline profond combiné
  • cacher tout code boilerplate dans les coulisses, par exemple allouer des réseaux temporaires suffisamment grandes pour le calcul vectoriel.

Est-ce son comme une approche sensible?

Dans ce cas, les conseils de mise en œuvre ou les bibliothèques qui pourraient aider?

Était-ce utile?

La solution

Dans un langage fonctionnel, tout est flux de données. Vous pouvez utiliser les fonctions que le concept de votre module.

Pour répondre à chacun de vos cas d'utilisation:

  • Module pluggagble est une fonction Clojure qui prend un seul argument qui est l'état de votre vecteur de données. par exemple. (def module-a some-function) Pour permettre une extension aisée par des modules, je suggère d'utiliser une carte de Clojure comme votre état, où un champ est votre gamme de flotteurs.
  • de composition de modules est la composition de la fonction. par exemple. (def combined-module (compose module-a module-b)
  • Fonctions auxiliaires sont accesseurs fonctions, l'état de l'extraction des données. par exemple. Si vos données est une carte Clojure avec un champ :moving-average, le mot-clé :moving-average est votre fonction accesseur. Etat ne sont pas stockées dans des modules.
  • Code boilerplate est caché dans la mise en œuvre de vos fonctions, ce qui peut être déclarée nulle part, peut-être dans un autre fichier et espace de noms.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top