2012-05-26 99 views
2

我想將定義的函數轉換爲匿名函數。我怎麼做?以下函數返回序列中的最後一個元素:如何將定義的函數轉換爲匿名函數

(defn lastt [l] 
    (cond 
     (nil? (next l)) l 
     :else 
      (lastt (next l)))) 

如何將它轉換爲fn表單?

PS:我知道last的功能,這只是一個練習。

+0

你還是要定義一個函數,或者你只是想一個匿名函數? – outis

+0

@outis anonymous –

+1

請用所需信息更新問題。一般而言,通過更新您的帖子來回應澄清請求,而不是回覆評論。首先,如果沒有閱讀評論,一個問題應該是可以理解的。另一方面,SO是Q&A網站,而不是論壇,評論意圖不適合(也不適合)討論。 – outis

回答

8

首先,該函數返回一個列表中的最後一個列表。我會改變你的定義,使其返回只是的最後一個項目:

(defn lastt [l] 
    (cond 
    (nil? (next l)) (first l) 
    :else (lastt (next l)))) 

爲了簡化,我會使用一個let結合,因爲你在l調用next兩次:

(defn lastt [l] 
    (let [n (next l)] 
    (cond 
    (nil? n) (first l) 
    :else (lastt n)))) 

我要做的下一件事是取代最後的電話lastt使用recur而不是

(defn lastt [l] 
    (let [n (next l)] 
    (cond 
    (nil? n) (first l) 
    :else (recur n)))) 

然後我會替換成

#(let [n (next %)] 
    (cond 
    (nil? n) (first %) 
    :else (recur n))) 

而就意識到,這可能更加使用解構:)

#(let [[h & t] %] 
    (cond 
    (nil? t) h 
    :else (recur t))) 

更新

無需爲cond簡化,因爲只有兩個分支,並且使用fn而不是#速記將允許解構發生在在fn的參數,使得整個功能有點更簡潔:

(fn [[h & t]] 
    (if (empty? t) h 
     (recur t))) 
+1

+1使用反覆和解構:) – ivant

+0

謝謝,幾乎覺得我知道我現在正在做一半的時間。 :) –

+1

你可以在這裏使用if而不是'cond',並且使用'fn'而不是'#'可以直接在args中進行解構:'(fn [[h&t]](if(空?t)h(recur t)))' – ivant

6

我更奸人的/德克勒比clojer,但(defn f [args] body)看起來是爲(def f (fn f ([args] body)))大多是語法糖,在這種情況下lastt可能留下了def寫成匿名函數:

(fn lastt 
    ([l] (cond 
      (nil? (next l)) 
      l 
      :else 
      (lastt (next l))))) 

由於lastt遞歸,您需要提供一個名稱將其綁定到正文中。

+0

對於defn你是對的。這是一個宏觀。 – octopusgrabbus

相關問題