我需要将存储在磁盘上的Nippy数据结构转换为Nippy可以读取的内容吗?Nippy使用字节数组,所以我需要一些方法将文件转换为字节数组.我试过了
(clojure.java.io/to-byte-array (clojure.java.io/file folder-path file-path))
Run Code Online (Sandbox Code Playgroud)
但这给了
java.lang.IllegalArgumentException: Value out of range for byte: ?
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
(into-array Byte/TYPE (map byte (slurp (clojure.java.io/file folder-path file-path))))
Run Code Online (Sandbox Code Playgroud)
但不知何故,名称空间是错误的,我找不到合适的名称空间.
首先要编写Nippy结构,我正在使用:
(with-open [w (clojure.java.io/output-stream file-path)]
(.write w (nippy/freeze data)))))
Run Code Online (Sandbox Code Playgroud) 我使用模拟样式测试来确保我的整个应用程序正常工作.核心Clojure测试库用于测试,通过Leiningen执行.当-main函数运行时,它定义符号以供以后在其逻辑中使用.问题是,如果我不小心使用在一个-main测试中创建但从未在当前-main测试中定义的符号,它仍然具有值.我希望得到一个错误,该符号是未定义的,但似乎我的测试环境以某种方式在deftest执行之间共享状态.我怎么处理这个?将我所有便利驱动的符号定义移到一个let语句中?
我不确定如何表达这一点,但任何关于如何实现以下行为的想法都会很棒.
我有一个Web服务器,可以长时间调用命令行程序.我希望服务器处理多个长时间运行的调用,但在调用完成之前不返回给定的请求.这不是一个网站,所以调用运行很长时间,客户端也不会超时.关于如何实现这一点的任何想法?
这个链接是否相关?在clojure中写一个多路复用服务器?
我的函数行为不同,具体取决于哪些关键字参数提供了值.对于这个问题,我想知道根据提供的参数类型,行为略有不同的函数.
示例函数,用于递增列表的每个元素:
(defn inc-list [& {:keys [list-str list]}]
(let [prepared-list (if-not (nil? list) list (clojure.string/split list-str #","))]
(map inc prepared-list)))
Run Code Online (Sandbox Code Playgroud)
做一个多方法而不是测试参数的类型是否有意义?我之前没有使用过多种方法,也不确定正确的时间使用它们.如果这是一个好主意,下面的例子是否有意义?
例:
(defn inc-coll [col] (map inc col))
(defmulti inc-list class)
(defmethod inc-list ::collection [col] (inc-col col))
(defmethod inc-list String [list-str]
(inc-col
(map #(Integer/parseInt %)
(clojure.string/split list-str #",")))
Run Code Online (Sandbox Code Playgroud) 我有代码直接改变矩阵的性能.在我改变它之前,我希望得到一个完整的副本来存储一个新符号,然后由变异过程使用.无论如何,我可以将Clojure符号的内容复制到一个新的符号中,以便第一个可以在不影响第二个的情况下进行变异吗?
这是我失败的尝试之一:
(var mat1 (clatrix/matrix (clatrix/ones 2 2)))
(var mat1)
(intern 'analyzer.core 'mat1 (clatrix/matrix (clatrix/ones 2 2)))
mat1
(intern 'analyzer.core 'mat2 mat1)
mat2
(clatrix/set mat1 0 0 2)
mat1
mat2
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用:
(def mat1 (clatrix/matrix (clatrix/ones 2 2)
(def mat2 mat1)
Run Code Online (Sandbox Code Playgroud)
我也尝试过(但不确定我是否正好在这里做):
(def mat1 (clatrix/matrix (clatrix/ones 2 2)
(def mat2 `mat1)
Run Code Online (Sandbox Code Playgroud)
和
(def mat1 (clatrix/matrix (clatrix/ones 2 2))
(def mat2 ~mat1)
Run Code Online (Sandbox Code Playgroud)
和
(def mat1 (clatrix/matrix (clatrix/ones 2 2))
(def mat2 (.dup mat1))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
更新
我对迄今为止提出的答案进行了基准测试.我不确定线条的符号是什么意思.建立:
(def mat1 (clatrix/ones 1000 1000) ; …Run Code Online (Sandbox Code Playgroud) clojure ×5
binary ×1
bytearray ×1
file ×1
immutability ×1
leiningen ×1
luminus ×1
matrix ×1
mutable ×1
performance ×1
tdd ×1
testing ×1
unit-testing ×1