我正在编写一个可以输入字符串,数字,数组,Java集合和地图的函数。约束是两个字符串的输出,数字应为零。
除了处理约束外,Clojure函数计数完成了我需要的所有工作。所以,我想用if语句测试输入是字符串还是数字。如果测试为真,则返回零,否则使用count。我有适用于任何一种情况的可行代码,但不知道如何将两者结合起来。而且,我不确定在这种情况下设置测试的最有效方法。
(defn Swanson [a]
(if (string? a) 0
(count a)))
(defn Propello [b]
(if (instance? Number b) 0
(count b)))
答案 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)))