我想要这个功能
(defn ret-lowest-str-len
"Computes the lengths of two strings. Returns default length -- len --
if len is <= the length of str-1 and len is <= length of str-2.
Else, returns smaller of length of str-1 and str-2."
[str-1 str-2 len]
(let [l1 (count str-1)
l2 (count str-2)]
(if (and (<= len l1) (<= len l2))
len
(if (< l1 l2)
l1
l2))))
能够有两个参数签名。该示例显示了str-1 str-2和len(固定长度)。这样做了,所以如果一个字符串小于15的固定默认值,将返回一个不会导致溢出异常的长度值。
我希望能够在没有str-2的情况下传递str-1和len,我不太确定该怎么做。
我知道如果没有传入l2,代码将不得不改变。我想知道如何设置arity。任何例子都将不胜感激。
感谢。
答案 0 :(得分:5)
defn有两种语法
(defn foo [] (expression) (expression))
和
(defn foo
([] (exp1) (exp2)) ; arity 0
([x] (exp1) (exp2)) ;arity 1
([x y] (exp1) (exp2)) ; arity 2
一个常见的模式是让较小的arity版本填充默认值并调用更高级的arity案例:
(defn ret-lowest-str-len
([str-1 len] (ret-lowest-str-len str-1 "" len))
([str-1 str-2 len]
(let [l1 (count str-1)
l2 (count str-2)]
(if (and (<= len l1) (<= len l2))
len
(if (< l1 l2)
l1
l2)))))
<小时/> 在旁注中,您可以使用可变数量的参数编写一个类似的函数:
user> (defn ret-lowest-str-len [& args] (reduce min (map count args)))
#'user/ret-lowest-str-len
user> (ret-lowest-str-len "a" "aaaa" "aaaaaaaaa")
1
答案 1 :(得分:3)
我会更进一步使任何数量的字符串工作,使用&
语法作为可选的参数列表,使用以下内容:
(defn lowest-str-len [default-len & strs]
(let [lens (map count strs)]
(apply min default-len lens)))