Domanda

sto sviluppando alcuni software di simulazione in Clojure che dovrà un sacco di processo di dati vettoriali (sostanzialmente originario come offset in array di Java galleggia, lunghezza tipicamente 10-10.000 gamma). Un gran numero di questi vettori dovranno passare attraverso varie fasi di lavorazione - per esempio normalizzare i vettori, concatenare assieme due flussi di vettori, calcolare una media mobile etc.

Invece di fare tutto in uno stile imperativo, speravo di fare era creare una soluzione più funzionale Clojure stile che avrebbe fatto quanto segue:

  • consentire qualsiasi funzione vettoriale per essere trasformato in un pluggable modulo , ad esempio (DEF Modulo-a (make-MODULE qualche funzione))
  • consentono questi moduli siano composto in tubazioni , ad esempio (Def combinato modulo (combinare in serie modulo-modulo-b)) andrebbe ad alimentare l'uscita del modulo-un all'ingresso del modulo-b
  • permettere funzioni auxillary al stato di accesso memorizzati all'interno di un dato modulo, ad esempio (Get-movimento-media qualche movimento-media-modulo), che avrebbe bisogno di lavoro, anche se un po 'di movimento-media-modulo è incorporato in profondità all'interno di una conduttura combinata
  • nascondere qualsiasi codice standard dietro le quinte, per esempio ripartizione sufficientemente grandi array temporanei per il calcolo vettoriale.

Questo suona come un approccio ragionevole?

Se è così, eventuali suggerimenti di attuazione o le librerie che potrebbero aiutare?

È stato utile?

Soluzione

In un linguaggio funzionale, tutto è flusso di dati. È possibile utilizzare funzioni come il vostro concetto di modulo.

Per far fronte a ciascuno dei vostri casi d'uso:

  • Un pluggagble modulo è una funzione Clojure che prende un singolo argomento che è lo stato del vostro vettore di dati. per esempio. (def module-a some-function) per consentire una facile estensione da moduli, io suggerisco di usare una mappa Clojure come il vostro stato, dove un campo è la matrice di carri.
  • Composizione moduli è composizione di funzioni. per esempio. (def combined-module (compose module-a module-b)
  • funzioni ausiliarie sono accessor funzioni, estrazione stato dai dati. per esempio. Se i dati sono una cartina Clojure con un campo :moving-average, quindi la parola chiave :moving-average è la vostra funzione di accesso. Stato non è memorizzato in moduli.
  • codice standard è nascosto nella realizzazione delle vostre funzioni, che può essere dichiarata in qualsiasi punto, possibilmente in un altro file e dello spazio dei nomi.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top