2

我想要这个功能

(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。任何示例将不胜感激。

谢谢。

4

2 回答 2

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
于 2012-06-21T18:28:12.100 回答
3

我会更进一步,使其适用于任意数量的字符串,使用&可选参数列表的语法,使用以下内容:

(defn lowest-str-len [default-len & strs]
    (let [lens (map count strs)]
        (apply min default-len lens)))
于 2012-06-21T18:45:41.110 回答