我想將定義的函數轉換爲匿名函數。我怎麼做?以下函數返回序列中的最後一個元素:如何將定義的函數轉換爲匿名函數
(defn lastt [l]
(cond
(nil? (next l)) l
:else
(lastt (next l))))
如何將它轉換爲fn
表單?
PS:我知道last
的功能,這只是一個練習。
我想將定義的函數轉換爲匿名函數。我怎麼做?以下函數返回序列中的最後一個元素:如何將定義的函數轉換爲匿名函數
(defn lastt [l]
(cond
(nil? (next l)) l
:else
(lastt (next l))))
如何將它轉換爲fn
表單?
PS:我知道last
的功能,這只是一個練習。
首先,該函數返回一個列表中的最後一個列表。我會改變你的定義,使其返回只是的最後一個項目:
(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)))
我更奸人的/德克勒比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
遞歸,您需要提供一個名稱將其綁定到正文中。
對於defn你是對的。這是一個宏觀。 – octopusgrabbus
你還是要定義一個函數,或者你只是想一個匿名函數? – outis
@outis anonymous –
請用所需信息更新問題。一般而言,通過更新您的帖子來回應澄清請求,而不是回覆評論。首先,如果沒有閱讀評論,一個問題應該是可以理解的。另一方面,SO是Q&A網站,而不是論壇,評論意圖不適合(也不適合)討論。 – outis