7

-> 演算子が行うことと同じように、一連の関数を介して入力をスレッド化したいと考えています。ただし、いずれかの関数が nil / false を返す場合は、評価を中断してエラー メッセージを返したいと思います。どうすればいいですか、この機能を提供する演算子/マクロはありますか?

4

2 に答える 2

11

これを試してください:-?> ドキュメントから:

(-?> "foo" .toUpperCase (.substring 1)) returns "OO"
(-?> nil .toUpperCase (.substring 1)) returns nil

2番目の例でマクロを使用する場合->は、間違いなく。を取得しNullPointerExceptionます。

于 2012-09-17T05:05:21.237 に答える
3

にもmaybe-mモナドがありclojure.algo.monadsます。モナドフレームワークの一部であるため、マクロよりも重いため、とにかくモナドを使用している場合、または計算グラフが単純な関数のチェーンよりも複雑な場合-?>に使用するのが理にかなっています。maybe-m

スレッド化マクロとは異なり、domonadコンポジションは、前の複数の計算ステップから引数を取る複数の引数関数を処理できます。

(domonad maybe-m
    [a 1
     b nil
     c (* a b)]
    c)

この例では、は nilである(* a b)ため、評価されません。bnil で乗算しようとして例外をスローする代わりに、式全体が nil を返します。

于 2012-09-17T14:21:06.040 に答える