流控制语句中的clojure方式

Bud*_*sno 2 clojure

假设我有一个像这样的python函数:

def required(value):
    if value is None:
        throw Exception
    if isintance(value, str) and not value:
        throw Exception
    return value
Run Code Online (Sandbox Code Playgroud)

基本上我想检查值是否为null.如果值是String,也要检查它是否为空.

做这样的事情的clojure方式是什么?

A. *_*ebb 5

在这种情况下,先决条件可以很好地完成.否则使用Clojure的控制流特殊形式/宏,例如if,cond使用throw.

user=> (defn required 
         [value] 
         {:pre [(string? value) (not-empty value)]} 
         value)
#'user/required

user=> (required nil)
AssertionError Assert failed: (string? value)  user/required ...

user=> (required "")
AssertionError Assert failed: (not-empty value) ...

user=> (required "foo")
"foo"
Run Code Online (Sandbox Code Playgroud)


n2o*_*n2o 5

做这样的事情的Clojure方法不是抛出异常.惯用的方式是返回nil而不是别的东西.

所以我建议:这样做没有例外.

您的功能将如下所示:

(defn required [value]
  (when (string? value)
    value))
Run Code Online (Sandbox Code Playgroud)

它检查值的类型,nil如果它不是String,则返回.否则返回你的价值.

或者如果您想在终端中显示错误消息:

(defn required [value]
  (if (string? value)
    value
    (println "Value must be a String.")))
Run Code Online (Sandbox Code Playgroud)

请注意,println打印String然后再次返回nil.