我有以下 Clojure 代码:
(defn is-valid-lang
[lang]
(.contains (list "ru" "en" "de") lang))
(defn s
[txt]
{
:desc txt
:lang "ru"
})
(defn s
[txt lang]
(if-not (is-valid-lang lang)
(throw (.IllegalArgumentException (format "'%s' is an invalid language." lang)))
{
:desc txt
:lang lang
}
)
)
Run Code Online (Sandbox Code Playgroud)
我想编写一个测试来验证s抛出的异常的消息,如果lang无效。
我是这样写的:
(deftest s-lang-invalid-lang-test
(is
(thrown-with-msg?
IllegalArgumentException
#"'invalid-language' is an invalid language."
(s "something" "invalid-language")
)
)
)
Run Code Online (Sandbox Code Playgroud)
由于以下错误,测试失败:
error {
:cause "No matching field found: IllegalArgumentException for class java.lang.String"
:via …Run Code Online (Sandbox Code Playgroud) 如何在集合上循环但从该集合中的不同指定点开始?也就是说,如果我有 [“a” “b” “c” “d” “e”] 能够通过指定从第三个位置开始(或者可能是第二个,如果它需要被零索引)?
我需要将 Clojure 中的 Integer 的所有 32 位都转换为 String 格式。
当前:(整数/toBinaryString 10)->“1010”
所需:(整数/toBinaryString 10)->“0000000000001010”
我怎样才能轻松有效地做到这一点?
我想将哈希映射的所有键值对传递到函数中,但不是整个哈希映射。
所以我有一个我无法改变的功能,看起来像这样:
(defn foo [a b c & {:keys [x y z]}]
(println x y z))
Run Code Online (Sandbox Code Playgroud)
我有一个哈希图,它将具有可变数量的键和值。假设一个实例是:
(def bar {:d 1
:e 2
:x "x"
:y "y"})
Run Code Online (Sandbox Code Playgroud)
如何在不传递整个哈希图的情况下将所有键值对调用传递到 foo 中?我想要做
(foo "a" "b" "c"
:d 1
:e 2
:x "x"
:y "y")
Run Code Online (Sandbox Code Playgroud) 我在 clojure 中做了一个小项目,我想知道是否有这样的东西:
(let [myvar "hello"] (println (read-var "myvar")))
Run Code Online (Sandbox Code Playgroud)
其中“read-var”函数发现有一个名称作为字符串传递的变量并返回它的值。
我发现了这个load-string函数,但它似乎不适用于 let 绑定。
谢谢!
我正在解决 4clojure 问题。我遇到了 #120 的这个答案,这是我自己完全没有想到的:
(fn sum-square [coll]
(let [digits (fn [n] (map #(- (int %) 48) (str n)))
square #(* % %)
sum-digits (fn [n] (reduce + (map square (digits n))))]
(count (filter #(< % (sum-digits %)) coll))))
Run Code Online (Sandbox Code Playgroud)
我真正想了解的部分是它的数字部分是如何工作的。
(fn [n] (map #(- (int %) 48) (str n))
Run Code Online (Sandbox Code Playgroud)
我真的很困惑如何
(map #(- (int %) 48) "10")
Run Code Online (Sandbox Code Playgroud)
返回
(1 0)
Run Code Online (Sandbox Code Playgroud)
你能解释一下这是如何工作的吗?我很困惑为什么 n 必须变成一个字符串,为什么它然后又变成一个整数,为什么它减去了 48。我确定一定有一些我遗漏的非常巧妙的技巧。
谢谢!
我有一些地图的懒惰序列。
我想遍历每个地图并执行:
if (= :b "this one") 然后将 :c 更改为 99。
({:a 1
:b "this one"
:c 100}
{:a "A"
:c "Q"
:z "Z"})
Run Code Online (Sandbox Code Playgroud) 想象一下我有一个像
(def nodes ["a", "b", "c"])
Run Code Online (Sandbox Code Playgroud)
我想转换nodes成以下字符串:
a -> b -> c
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
(apply str (mapcat
(fn [node]
(str node " -> ")
)
nodes
)
)
Run Code Online (Sandbox Code Playgroud)
结果是
"a -> b -> c -> "
Run Code Online (Sandbox Code Playgroud)
我现在可以检查结果字符串是否以 结尾,->如果是,则删除最后一个->.
但这似乎不是很优雅。在 Clojure 中执行此操作的正确方法是什么?
更新 1:
(transduce
(fn [rf]
(fn
([] "")
([result] result)
([result input] (str
result
"->"
input))
)
)
cat
""
nodes
)
Run Code Online (Sandbox Code Playgroud)
结果是
"->a->b->c"
Run Code Online (Sandbox Code Playgroud) (defn my-loop [x]
(cond (> x 1)
((println x)
(my-loop (- x 1)))
)
)
;; => #'user/my-loop
user> (my-loop 10)
Run Code Online (Sandbox Code Playgroud)
为什么在执行此函数时会出现空指针异常?这不是正常的递归吗?
我正在尝试按值对地图进行排序(不区分大小写)。但似乎 clojure 排序功能区分大小写。见下面的例子,
cljs.user=> (sort {:1 "A" :2 "Z" :3 "i"})
([:1 "A"] [:2 "Z"] [:3 "i"])
cljs.user=> (reverse (sort {:1 "A" :2 "Z" :3 "i"}))
([:3 "i"] [:2 "Z"] [:1 "A"])
Run Code Online (Sandbox Code Playgroud)
任何人都可以为我建议一个解决方案,我如何通过不区分大小写的方式在 clojure 中排序?