Я написал функцию, которая принимает каталог как входной файл и возвращает список файлов.clojure - conj, кажется, не добавляет значения в вектор
(ns musicdb.filesystem)
(import '(java.io.File) '(java.net.url) '(java.io))
(use 'clojure.java.browse)
(require '[clojure.string :as str])
(defn getFiles
"get a list of all files"
[searchPath]
(def directory (clojure.java.io/file searchPath))
(def files (file-seq directory))
(def fonly (filter (fn [x]
(. x isFile)) files))
(def names [])
(doseq [x fonly]
(conj names (. x toString)) ;doesn't seem to work
(println (. x toString))) ;but this DOES print the file path
names)
Единственное, что здесь не работает, - это вызов вызова.
Вот мой тест
(ns musicdb.core-test
(:require [clojure.test :refer :all]
[musicdb.core :refer :all]
[musicdb.filesystem :refer :all]))
(deftest test_0
(testing "getFiles returns valid result"
(is (> (count (getFiles "/home/ls/books/books")) 1))
(doseq [i (take 5 (getFiles "/home/ls/books/books"))] (searchBook i))))
Этот тест не удается, и показывает, что возвращаемое значение getFiles
пусто.
'conj' возвращает новый вектор с элементом добавленной в конце. Вы создаете вектор и отбрасываете его. – Lee
спасибо. SO решение: (def names (conj names (. X toString))) – Luke
Это будет работать, но это не идиоматический Clojure. См. Мой ответ. –