; common/math.clj
(defn nths
"Returns a collection of values for each idx in idxs. Throws an error if any one idx is out of bounds."
[coll idxs]
(map #(nth coll %) idxs))
; nrepl
common.math> (try (/ 1 0)
(catch Exception e (prn "in catch"))
(finally (prn "in finally")))
"in catch"
"in finally"
nil
common.math> (try (nths '(5 6 7 8 9) '(0 5))
(catch Exception e (prn "in catch"))
(finally (prn "in finally")))
"in finally"
IndexOutOfBoundsException clojure.lang.RT.nthFrom (RT.java:784)
common.math> (nths '(5 6 7 8 9) '(0 1 3))
(5 6 8)
common.math> *clojure-version*
{:major 1, :minor 5, :incremental 0, :qualifier "alpha4"}
我无法弄清楚第二个expr中出了什么问题。我原以为它会再打印出来:
"in catch"
"in finally"
运行unittest时会发生同样的事情:
lein test unittest.common.math
FAIL in (test-nths) (math.clj:87)
expected: (thrown? IndexOutOfBoundsException (nths (quote (5 6 7 8 9)) (quote (0 5))))
actual: nil
应该通过。
答案 0 :(得分:3)
Nths很懒,所以当你的repl尝试打印结果时,函数实际运行:
core> (def result (try (nths '(5 6 7 8 9) '(0 5))
(catch Exception e (prn "in catch"))
(finally (prn "in finally"))))
"in finally"
#'core/result
core> result
; Evaluation aborted.
您可以在nths
中捕获异常,或者在使用它时更有意义捕获它
rsadl.core> (def result (try (nths '(5 6 7 8 9) '(0 5))
(catch Exception e (prn "in catch"))
(finally (prn "in finally"))))
"in finally"
#'core/result
core> (try (println result) (catch Exception e (prn "in catch")))
("in catch"
nil
或者作为number23_cn指出你可以在创建它时实现结果,只要你不需要因为其他原因而懒惰。
答案 1 :(得分:1)
(try (doall (nths '(5 6 7 8 9) '(0 5)))
(catch Exception e (prn "in catch"))
(finally (prn "in finally")))
"in catch"
"in finally"
nil
user=>
因为map return lazy-seq?