2

Je suis en train de développer un logiciel de simulation dans Clojure qui devra traiter de nombreuses données vectorielles (essentiellement issues de décalages dans des tableaux de flottants Java, d'une longueur typiquement comprise entre 10 et 10 000). Un grand nombre de ces vecteurs devra passer par diverses étapes de traitement - par ex. en normalisant les vecteurs, en concaténant ensemble deux flux de vecteurs, en calculant une moyenne mobile, etc.Unités de traitement vectoriel enfichables dans Clojure

Plutôt que de tout faire dans un style impératif, j'espérais créer une solution Clojure plus fonctionnelle qui ferait ce qui suit:

  • permettent une fonction de vecteur pour être transformée en un module enfichable , par exemple, (def module-a (make-module une certaine fonction))
  • permettent à ces modules d'être composés dans des pipelines, par ex. (def combine-module (combiner-en-série module-un module-b)) alimenterait la sortie du module-a dans l'entrée du module -b
  • permettre fonctions auxiliaires pour accéder à l'état stocké dans un module donné , par exemple (moyennement mobile moyennement-mobile-module), qui devrait fonctionner même si un module à moyenne mobile est enfoncé profondément dans un pipeline combiné
  • cacher tout code standard dans les coulisses, par ex. allouer des tableaux temporaires suffisamment grands pour le calcul vectoriel.

Cela vous semble-t-il logique?

Si oui, des conseils d'implémentation ou des bibliothèques qui pourraient vous aider?

Répondre

3

Dans un langage fonctionnel, tout est flux de données. Vous pouvez utiliser des fonctions comme concept de module.

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

  • A 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 facile par modules, je suggère d'utiliser une carte Clojure comme état, où un champ est votre tableau de flottants.
  • La composition des modules est une composition de fonction. par exemple. (def combined-module (compose module-a module-b)
  • Les fonctions auxiliaires sont des fonctions d'accès qui extraient l'état de vos données. par exemple. Si vos données sont une carte Clojure avec un champ :moving-average, le mot-clé :moving-average est votre fonction d'accès. L'état n'est pas stocké dans les modules.
  • Le code de la chaudière est masqué dans l'implémentation de vos fonctions, qui peut être déclarée n'importe où, éventuellement dans un autre fichier et espace de noms.