2012-06-21 52 views
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-1和len沒有str-2,我不知道該怎麼做。

我知道代碼將不得不改變,如果l2沒有通過。我想知道如何設置arity。任何例子,將不勝感激。

謝謝。

回答

5

DEFN具有兩種語法

(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 
+0

Thanks @Arthur。我要去看看這個。 – octopusgrabbus

+0

工程就像一個魅力@Arthur Ulfeldt。 – octopusgrabbus

3

我會走的更遠,並使其成爲任何工作串的數量,使用&語法可選參數列表,使用以下內容:

(defn lowest-str-len [default-len & strs] 
    (let [lens (map count strs)] 
     (apply min default-len lens)))