标签: clojure

如何在 Clojure 测试中测试预期异常的消息?

我有以下 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)

unit-testing clojure

0
推荐指数
1
解决办法
115
查看次数

如何从 Clojure 中的指定点循环遍历集合?

如何在集合上循环但从该集合中的不同指定点开始?也就是说,如果我有 [“a” “b” “c” “d” “e”] 能够通过指定从第三个位置开始(或者可能是第二个,如果它需要被零索引)?

clojure clojurescript

0
推荐指数
1
解决办法
57
查看次数

在Clojure中将整数中的所有32位获取为字符串格式

我需要将 Clojure 中的 Integer 的所有 32 位都转换为 String 格式。

当前:(整数/toBinaryString 10)->“1010”

所需:(整数/toBinaryString 10)->“0000000000001010”

我怎样才能轻松有效地做到这一点?

clojure

0
推荐指数
1
解决办法
127
查看次数

如何将哈希图的所有键值对传递给函数(不传递整个哈希图)?

我想将哈希映射的所有键值对传递到函数中,但不是整个哈希映射。

所以我有一个我无法改变的功能,看起来像这样:

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

0
推荐指数
1
解决办法
118
查看次数

如何从 Clojure 中的字符串获取变量的值?

我在 clojure 中做了一个小项目,我想知道是否有这样的东西:

(let [myvar "hello"] (println (read-var "myvar")))
Run Code Online (Sandbox Code Playgroud)

其中“read-var”函数发现有一个名称作为字符串传递的变量并返回它的值。

我发现了这个load-string函数,但它似乎不适用于 let 绑定。

谢谢!

clojure

0
推荐指数
1
解决办法
123
查看次数

这个 clojure 数字函数是如何工作的?

我正在解决 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。我确定一定有一些我遗漏的非常巧妙的技巧。

谢谢!

clojure digits

0
推荐指数
1
解决办法
69
查看次数

循环遍历一系列懒惰的地图并更改其中一个地图中的一个值

我有一些地图的懒惰序列。
我想遍历每个地图并执行:
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)

clojure

0
推荐指数
1
解决办法
62
查看次数

在 Clojure 中映射列表时,如何将其与其他文本穿插?

想象一下我有一个像

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

clojure

0
推荐指数
1
解决办法
117
查看次数

在clojure中执行循环时出现空指针异常

(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

0
推荐指数
1
解决办法
85
查看次数

Clojure 排序字符串值 - 不区分大小写

我正在尝试按值对地图进行排序(不区分大小写)。但似乎 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 中排序?

functional-programming clojure clojurescript

0
推荐指数
1
解决办法
101
查看次数