7

我想通过一系列函数对输入进行线程化,这正是 -> 运算符所做的。但是,如果任何函数返回 nil / false 那么我想中断评估并返回错误消息。我该怎么做,是否有一些提供此功能的运算符/宏?

4

2 回答 2

11

试试这个:-?> 来自文档:

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

如果您将使用->宏作为第二个示例,您肯定会得到NullPointerException.

于 2012-09-17T05:05:21.237 回答
3

中还有maybe-m单子clojure.algo.monads。作为 monads 框架的一部分,它比宏更重量级,因此如果您仍然使用 monads 或者如果您的计算图比简单的函数链更复杂-?>,那么使用它是有意义的。maybe-m

与线程宏不同,domonad组合可以处理多个参数函数,这些函数从多个先前的计算步骤中获取参数:

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

在这个例子中,(* a b)不会被评估,因为b它是 nil。整个表达式将返回 nil 而不是在尝试乘以 nil 时抛出异常。

于 2012-09-17T14:21:06.040 回答