clojure - conj 似乎没有为向量增加值(value)

标签 clojure

我编写了一个函数,它将目录作为输入并返回文件列表。

(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)

这里唯一不起作用的是 conj 调用。

这是我的测试

(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的返回值为空。

最佳答案

names 是一个不可变的向量。 (conj names (.x toString)) 创建一个新向量,但不对其执行任何操作。您的代码还存在其他问题:

  • 您不想使用doseq。这是为了产生副作用,例如打印内容。如果您要创建一个集合,通常不需要在 clojure 中进行迭代,或者如果需要,您可以使用不可变累加器、循环和递归。
  • 您不想使用嵌套定义。您正在定义全局变量,而您想要的是函数局部变量。请改用 let
  • clojure 命名风格是使用破折号而不是驼峰式大小写(次要的,只是一个约定)。
  • 您似乎没有在此代码中使用 java.io importa。
  • use 一般来说并不是一个好主意,除非您使用 :only 将其限制为一些显式命名的函数。这是为了避免在查看代码中的非限定名称时产生混淆,因为您不知道它来自哪里。

你想要这样的东西:

(defn get-files [search-path]
  (let [directory (clojure.java.io/file search-path)
        files (file-seq directory)
        fonly (filter #(.isFile %) files)]
   (map #(.toString %) fonly)))

关于clojure - conj 似乎没有为向量增加值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327175/

相关文章:

java - 你能用 Guava 复制 Clojure 的(分区)或 Scala 的 sliding() 函数吗?

clojure - 如何在 clojure 中为变量重新分配另一个值

namespaces - 将 Clojure 命名空间拆分为多个文件

ide - Clojure 开发 : IDE or REPL?

scala - 从Scala sbt任务中调用Clojure代码

java - 将常规 Servlet 编码转变为我的 DSL 的起点

multithreading - 何时使用非阻塞 >!/线程和阻塞>!!/带有 clojure core.async 的 goroutines

clojure - 传递给Clojure函数的参数数量错误

clojure - 使用 `->`( "thread-first"宏)Clojure

java - 将像素映射到数据