2
; 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"}

2 番目の 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

合格する必要があります。

4

2 に答える 2

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 が指摘しているように、他の理由で怠惰になる必要がない限り、作成時に結果を実現できます。

于 2012-08-28T00:49:30.323 に答える
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 が lazy-seq を返すからですか?

于 2012-08-28T00:32:58.110 に答える