2017-10-19 19 views
2

J'essaie de faire fonctionner Overtone sur mon ordinateur Windows 10. Je semble avoir trouvé un bug dans le code qui tente de démarrer le serveur de synthétiseur. Overtone dépend de SuperCollider, et il recherche l'emplacement de scsynth.exe en regardant où SuperCollider est installé. Mais le code qui est censé vérifier à la fois C:\Program Files et C:\Program Files (x86) vérifie uniquement la première qui existe au lieu de deux:Liste des fichiers dans deux répertoires distincts dans Clojure

(import java.io File) 
(let [p-files-dir (System/getenv "PROGRAMFILES(X86)") 
     p-files-dir (or p-files-dir (System/getenv "PROGRAMFILES")) 
     p-files-dir (File. p-files-dir) 
     p-files  (map str (.listFiles p-files-dir)) 
     p-files]) 

Dans mon cas, les deux répertoires existent, mais SuperCollider existe que dans C:\Program Files. L'extrait ci-dessus répertorie uniquement les fichiers dans C:\Program Files (x86).

Comment puis-je obtenir ce code pour retourner tous les fichiers dans les deux répertoires, et ne pas rompre quand il n'existe pas?

Répondre

4

Vous ne revenaient pas quelque chose de votre forme let, donc remarquez ici p-files est en dehors de la []:

(let [p-files-dir-1 (System/getenv "PROGRAMFILES(X86)") 
     p-files-dir-2 (System/getenv "PROGRAMFILES") 
     p-files-dir-file-1 (File. p-files-dir-1) 
     p-files-dir-file-2 (File. p-files-dir-2) 
     p-files (map str (concat 
         (.listFiles p-files-dir-file-1) 
         (.listFiles p-files-dir-file-2)))] 
    p-files) 

La réponse à votre question est que vous pouvez seulement concat ensemble deux listes, après quoi vous auriez besoin Filtrer pour le fichier.

Voici une courte réponse (la map str est pas strictement nécessaire ici):

(map str (concat ["a" "b" "c"] ["d" "e" "f"])) 
;; => ("a" "b" "c" "d" "e" "f") 

Pour supprimer toutes les variables temporaires, vous pouvez utiliser cette fonction:

(defn env-files [file-name] 
    (some-> file-name 
      System/getenv 
      File. 
      .listFiles)) 

Ensuite, le code devient:

(map str (concat 
      (env-files "PROGRAMFILES(X86)") 
      (env-files "PROGRAMFILES"))) 
+0

Parfait! Je suis vraiment surpris que '(some->' gère correctement les environnements invalides. –