我有一个非常庞大的哈希表,每当我尝试更改哈希时,都会返回整个哈希值,这会导致我的REPL崩溃.有没有办法可以让Clojure设置值并返回nil?
谢谢.
假设我有这种多方法
(defmulti m (fn [v] [(:type v)]))
(defmethod m [Object] [k] (prn "Object"))
(defmethod m [:mykwd] [k] (prn "mykwd"))
Run Code Online (Sandbox Code Playgroud)
当我用子类调用它时Object,它会正确地调度到第一个实现:
(m {:type String})
"Object"
Run Code Online (Sandbox Code Playgroud)
随着:mykwd它也按预期工作:
(m {:type :mykwd})
"mykwd"
Run Code Online (Sandbox Code Playgroud)
但当我提供另一个关键字时,我得到一个例外:
(m {:type :anotherkwd})
#<CompilerException java.lang.IllegalArgumentException: No method in multimethod 'm'
for dispatch value: [:anotherkwd] (NO_SOURCE_FILE:0)>
Run Code Online (Sandbox Code Playgroud)
这个调度究竟是如何工作的?
是否可以为类继承保留此行为,并且仍然具有捕获所有关键字的"默认"实现?
编辑这个例子很简单,但我需要它来处理二进制函数.我的真正需求如下.我不知道如何申请:default它.
(defmulti m (fn [arg mp] [(class arg) (:type mp)]))
Run Code Online (Sandbox Code Playgroud)
然后,我正在寻找一种方式,当定义它的情况arg是nil和(:type mp)是什么.这适用于value for :type是一个类,但不适用于任何关键字:
(defmethod …Run Code Online (Sandbox Code Playgroud) 我正在开发一个包含以下代码行的clojure程序:
(defn makeStruct
"Take a line of input and return a starbucks-struct"
[input]
(let[(apply struct storeinfo (clojure.string/split input #","))]
)
Run Code Online (Sandbox Code Playgroud)
)
我得到这个编译器错误:
Exception in thread "main" java.lang.IllegalArgumentException: let requires an even number of forms in binding vector (clojureHW.clj:24)
Run Code Online (Sandbox Code Playgroud)
我对clojure很新,并不完全确定我在做什么,但在这种情况下,输入是一个字符串,我将它拆分为一个向量来初始化我的结构.我使用的语法let不正确吗?
可以请一些人解释原因
(some #(= 3 %) (range))
Run Code Online (Sandbox Code Playgroud)
返回true但是
(some #(= 4/3 %) (range))
Run Code Online (Sandbox Code Playgroud)
永远不回来?
Programmin Clojure由"Stuart Halloway"一书讲述了Lancet,非常第一步是(使用' lancet ),它抛出一些异常,
异常 user =>(使用'lancet)java.io.FileNotFoundException:无法在类路径上找到lancet__init.class或lancet.clj:(NO_SOURCE_FILE:0)
是否需要任何jar文件或某些包才能使其工作?
Clojure问题
我在clojure中编写了以下函数:在第一个循环中,它迭代一个映射列表并创建一个映射.然后第二个循环迭代一个列表,匹配先前创建的映射数据和一个向量并返回一个新映射.但是,使用相同数据的不同运行会产生不同的结果.见下文.
(defn resolve-case-per-period
"Constructs a map by matching data existing in input parameter vectors"
[dd case-details periods]
(let [cases ((fn [in]
(loop [case-details in, result-map {}]
(if (= (count case-details) 0)
result-map
(recur (rest case-details)
(assoc result-map
(:priority (first case-details))
(:caseid (first case-details)))))))
case-details)
periods periods]
(info "Mapping cases to periods step 1 completed " cases)
(loop [periods periods, result-map {}]
(if (= (count periods) 0)
result-map
(recur (rest periods)
(conj result-map
{ (str (:period (first periods)))
(get cases …Run Code Online (Sandbox Code Playgroud) 如何将 ASCII值转换为十六进制和二进制值(不是ASCII中的字符串表示形式)?例如,如何将十进制值26转换为0x1A?
到目前为止,我已尝试使用以下步骤进行转换(请参阅下面的实际代码):
String.toString(intValue, radix)注意:我确实询问了有关将十六进制值写入文件的相关问题.
Clojure代码:
(apply str
(for [byte (.getBytes value)]
(.replace (format "%2s" (Integer/toString (.intValue byte) 16)) " " "0")))))
Run Code Online (Sandbox Code Playgroud)
Java代码:
Byte[] bytes = "26".getBytes();
for (Byte data : bytes) {
System.out.print(String.format("%2s", Integer.toString(data.intValue(), 16)).replace(" ", "0"));
}
System.out.print("\n");
Run Code Online (Sandbox Code Playgroud) 我通过MacPorts在Mac OS X 10.7.2上安装了Leiningen:
$ lein version
Leiningen 1.6.1.1 on Java 1.6.0_29 Java HotSpot(TM) 64-Bit Server VM
Run Code Online (Sandbox Code Playgroud)
我也有clojure和clojure-contrib安装的软件包:
$ sudo port installed clojure*
The following ports are currently installed:
clojure @1.3.0_0 (active)
clojure-contrib @1.2.0_0 (active)
Run Code Online (Sandbox Code Playgroud)
为了测试我的环境,我生成了一个示例helloworld项目,如Zef Hemel所述.这是project.clj文件:
(defproject helloworld "0.1"
:dependencies [[org.clojure/clojure
"1.3.0-master-SNAPSHOT"]
[org.clojure/clojure-contrib
"1.2.0-SNAPSHOT"]]
:main helloworld)
Run Code Online (Sandbox Code Playgroud)
这是helloworld.clj文件:
(ns helloworld
(:gen-class))
(defn -main [& args]
(println "Hello world!"))
Run Code Online (Sandbox Code Playgroud)
当我尝试编译这个项目时,我收到了几条更新消息......
$ pwd
/Users/alexreynolds/helloworld
$ sudo lein compile
[INFO] snapshot …Run Code Online (Sandbox Code Playgroud) 我正在尝试将嵌套向量添加到地图中,即({:cells {[xy]})。我尝试过多种方式来做到这一点,但无论我如何尝试,我都无法让它发挥作用。我不断收到“错误数量的参数(0)传递给:clojure.lang.PercientArrayMap”,或者在另一种情况下,我什至无法让我的剩余函数即(坐标生成)来编译它。我必须手动重新输入它们才能让 REPL 识别它们。一般来说,我确实是一个认真编码的初学者,所以我不知道该去哪里。这是我的功能:
(defn values-manual [grid values]
(let [inter (interleave (coordinates-gen grid) [values])]
(loop [[x y & remaining] inter]
do(
(assoc grid :cells (x y))
(recur remaining)))))
Run Code Online (Sandbox Code Playgroud)
我选择将两个向量(网格和值)交错在一起,因为它们的大小可能不同,并且交错会自动截断为较小的向量,这对于我的输出来说是理想的。然后我访问该列表的前两个元素。然后将它们与我的“网格”地图中的 :cells 键关联起来。然后对其余元素重复。一旦我尝试运行它,它就无法工作,并且我的其他定义的函数也无法被识别。我还使用了 do() 因为我可以验证循环是否适用于多个函数。到底是怎么回事?非常感谢任何帮助。
我尝试了我能想到的一切。这是我的第一个大型编码项目。