Clojure:以类似单子的方式避免NPE的惯用/干净的方法

Clojure:以类似单子的方式避免NPE的惯用/干净的方法,clojure,Clojure,我有点懊恼,一些内置的Clojure函数在我看来是不一致的行为 我正在尝试这样做: (let [kwns (namespace (keyword v))] ...) 在v可能是nil的上下文中。关键字函数按照我的预期工作(返回nil),但名称空间抛出一个NPE 我的印象是单子在Clojure中并不经常使用,因为无双关语似乎是惯用的形式(这一点一直在讨论) 我以为KWN的成绩是零,而不是NPE。当这种不一致性出现时,什么是保持代码干净的推荐方法……当然,在我的代码中插入nil检查并不是我

我有点懊恼,一些内置的Clojure函数在我看来是不一致的行为

我正在尝试这样做:

 (let [kwns (namespace (keyword v))]
   ...)
在v可能是
nil
的上下文中。
关键字
函数按照我的预期工作(返回
nil
),但名称空间抛出一个NPE

我的印象是单子在Clojure中并不经常使用,因为无双关语似乎是惯用的形式(这一点一直在讨论)


我以为KWN的成绩是零,而不是NPE。当这种不一致性出现时,什么是保持代码干净的推荐方法……当然,在我的代码中插入
nil
检查并不是我想要的答案。

一些->对你有用吗

 user=> (doc some->)
 -------------------------
 clojure.core/some->
 ([expr & forms])
 Macro
   When expr is not nil, threads it into the first form (via ->),
   and when that result is not nil, through the next etc
 nil
 user=> (some-> nil keyword namespace)
 nil
 user=> (some-> "user/a" keyword namespace)
 "user"

太好了…我就知道一定有什么!