修改函数计数,为字符串返回零,为数字返回零

时间:2013-11-05 20:03:45

标签: clojure clojure-contrib

我正在编写一个可以输入字符串,数字,数组,Java集合和地图的函数。约束是两个字符串的输出,数字应为零。

除了处理约束外,Clojure函数计数完成了我需要的所有工作。所以,我想用if语句测试输入是字符串还是数字。如果测试为真,则返回零,否则使用count。我有适用于任何一种情况的可行代码,但不知道如何将两者结合起来。而且,我不确定在这种情况下设置测试的最有效方法。

  (defn Swanson [a]
        (if (string? a) 0
        (count a)))

  (defn Propello [b]
        (if (instance? Number b) 0
        (count b)))

4 个答案:

答案 0 :(得分:1)

另一种选择:

(defn swanson-propello [x]
  (if (or (string? x)
          (number? x))
    0
    (count x)))

or是此类组合的最基本形式。它的文档字符串描述得很好:

Evaluates exprs one at a time, from left to right. If a form
returns a logical true value, or returns that value and doesn't
evaluate any of the other expressions, otherwise it returns the
value of the last expression. (or) returns nil.

答案 1 :(得分:1)

如果清晰度比效率更重要(而且几乎总是如此),那么我在这里使用cond:

(cond
  (string? a) 0
  (instance? Number a) 0
  :default (count a))

你真正想要的是“如果它是可数的则计数,否则为0”。在这种情况下,'seq'功能可以帮助

(if (seq a) (count a) 0)

如果您实际关心性能,那么使用协议执行此操作应该可以让您原则上购买更多JVM优化。但是要确保之前和之后的资料!

(defprotocol SwansonPropello
  (swanson-propello [a]))

(extend-protocol SwansonPropello
  clojure.lang.ISeq
  (swanson-propello [a] (count a))

  clojure.lang.Seqable
  (swanson-propello [a] (count a))

  Object
  (swanson-propello [_] 0))

答案 2 :(得分:0)

#(if (string? %)
   0
   (count %))

答案 3 :(得分:0)

(defn alex
  [obj]
  (cond
    (string? obj) 0
    (number? obj) 0
    :otherwise (count obj)))