Metodo alternativo a istruzioni nidificate dipendenti se per controllare più stati

6

Esiste un modo più semplice per elaborare più stati vero / falso rispetto all'utilizzo di istruzioni nidificate if? Penso che ci sia, e sarebbe di creare una sequenza di stati, e quindi utilizzare una funzione come when per determinare se tutti gli stati erano vere, e abbandonare se non. Sto facendo la domanda per assicurarmi che non ci sia un modo Clojure preferito per farlo.

Ecco lo sfondo del mio problema:

Ho un'applicazione che dipende da alcuni file di input. L'applicazione dipende dai report di dati .csv; intestazioni di colonna per ogni rapporto (anche file .csv), in modo che ciascuna sequenza nella sequenza di sequenze possa essere compresso insieme alle sue colonne allo scopo di creare una sequenza più piccola; e file di colonne per i dati di output.

Uso le seguenti funzioni per scoprire se un file è presente:

(defn kind [filename]
  (let [f (File. filename)]
    (cond
      (.isFile f)      "file"
      (.isDirectory f) "directory"
      (.exists f)      "other" 
      :else            "(cannot be found)" )))

(defn look-for 
  [filename expected-type]
    (let [find-status (kind-stat filename expected-type)]
      find-status))

E qui ci sono le prime righe di un multiplo se sembra brutto ed è difficile da mantenere:

(defn extract-re-values
  "Plain old-fashioned sub-routine to process real-estate values / 3rd Q re bills extract."
  [opts]
  (if (= (utl/look-for (:ifm1 opts) "f") 0)             ; got re columns?
    (if (= (utl/look-for (:ifn1 opts) "f") 0)           ; got re data?
      (if (= (utl/look-for (:ifm3 opts) "f") 0)         ; got re values output columns?
        (if (= (utl/look-for (:ifm4 opts) "f") 0)       ; got re_mixed_use_ratio columns?
          (let [re-in-col-nams  (first (utl/fetch-csv-data (:ifm1 opts)))
                re-in-data      (utl/fetch-csv-data (:ifn1 opts))
                re-val-cols-out (first (utl/fetch-csv-data (:ifm3 opts)))
                mu-val-cols-out (first (utl/fetch-csv-data (:ifm4 opts)))
                chk-results     (utl/chk-seq-len re-in-col-nams (first re-in-data) re-rec-count)]

Non sto cercando una discussione sul modo migliore, ma ciò che è in Clojure facilita la risoluzione di un problema come questo.

    
posta octopusgrabbus 08.11.2012 - 19:01
fonte

2 risposte

5

A meno che tu non stia usando più istruzioni, puoi semplicemente collegare le condizioni a un "e". In Clojure, "and" è una macro che trasforma i suoi argomenti in una sequenza di istruzioni nidificate if

    
risposta data 09.11.2012 - 00:25
fonte
2

Monads è la risposta a questo, forse la monade per essere precisi.

Esiste almeno una libreria Clojure per le monadi .

Le monadi hanno la reputazione di essere difficili da imparare, ma ne vale decisamente la pena (e non che sono pessime).

Potresti anche controllare alcuni tutorial di Haskell sulle monadi, dato che sono una parte più grande di Haskell rispetto a Clojure.

    
risposta data 08.11.2012 - 22:06
fonte

Leggi altre domande sui tag