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))))

2つの引数署名を持つことができるようにします。この例は、str-1 str-2とlen(固定長)を示しています。これが行われたため、文字列が固定のデフォルトであるたとえば15未満の場合、オーバーラン例外を発生させない長さの値が返されます。

str-2なしでstr-1とlenだけを通過できるようにしたいのですが、どうすればよいかわかりません。

l2が渡されない場合、コードを変更する必要があることは承知しています。アリティを設定する方法を考えています。任意の例をいただければ幸いです。

ありがとう。

4

2 に答える 2

5

defnには2つの構文があります

(defn foo [] (expression) (expression))

(defn foo
  ([] (exp1) (exp2)) ; arity 0
  ([x] (exp1) (exp2)) ;arity 1
  ([x y] (exp1) (exp2)) ; arity 2

一般的なパターンは、アリティの低いバージョンにデフォルトを入力させ、アリティの高いケースを呼び出すことです。

(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 に答える