我想通过一系列函数来处理输入,就像 - >运营商。但是,如果任何函数返回nil / false,那么我想打破评估并返回错误消息。我该怎么做,是否有一些提供此功能的运算符/宏?
答案 0 :(得分:11)
试试这个:-?>
来自文档:
(-?> "foo" .toUpperCase (.substring 1)) returns "OO"
(-?> nil .toUpperCase (.substring 1)) returns nil
如果您将第二个示例使用->
宏,则肯定会获得NullPointerException
。
答案 1 :(得分:3)
maybe-m
中还有clojure.algo.monads
monad。作为monads框架的一部分,它比-?>
宏更重要,所以如果你正在使用monad或者你的计算图比一个简单的函数链更复杂,那么使用maybe-m
是有意义的。
与线程宏不同,domonad
组合可以处理多个参数函数,这些函数从多个先前的计算步骤中获取参数:
(domonad maybe-m
[a 1
b nil
c (* a b)]
c)
在此示例中,(* a b)
将无法评估,因为b
为零。整个表达式将返回nil,而不是尝试乘以nil而抛出异常。