如何将已定义的函数函数转换为匿名函数

Yur*_*rev 2 clojure

我想将一个已定义的函数转换为匿名函数.我怎么做?以下函数返回序列中的最后一个元素:

(defn lastt [l]
    (cond
        (nil? (next l)) l
        :else
            (lastt (next l))))
Run Code Online (Sandbox Code Playgroud)

如何将其变成fn表格?

PS:我知道last功能,这只是一个练习.

ide*_*rld 7

首先,该函数返回一个列表,其中包含最后一项.我会改变你的定义,使其返回在最后一个项目:

(defn lastt [l]
  (cond
   (nil? (next l)) (first l)
   :else (lastt (next l))))
Run Code Online (Sandbox Code Playgroud)

为了简化,我会使用let绑定,因为你打了next两次l:

(defn lastt [l]
  (let [n (next l)]
    (cond
     (nil? n) (first l)
     :else (lastt n))))
Run Code Online (Sandbox Code Playgroud)

我接下来要做的就是替换最后的调用来代替lastt使用recur

(defn lastt [l]
  (let [n (next l)]
    (cond
     (nil? n) (first l)
     :else (recur n))))
Run Code Online (Sandbox Code Playgroud)

然后我会替换它

#(let [n (next %)]
   (cond
    (nil? n) (first %)
    :else (recur n)))
Run Code Online (Sandbox Code Playgroud)

并且意识到使用解构可以简化它:)

#(let [[h & t] %]
   (cond
    (nil? t) h
    :else (recur t)))
Run Code Online (Sandbox Code Playgroud)

更新

不需要cond,因为只有两个分支,而使用fn而不是#简写将允许在fn参数中进行解构,使整个函数更简洁:

(fn [[h & t]]
  (if (empty? t) h
      (recur t)))
Run Code Online (Sandbox Code Playgroud)


out*_*tis 6

我更像是一个策划者/ CLer而不是一个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)))))
Run Code Online (Sandbox Code Playgroud)

lasttrecurses开始,您需要提供一个名称以将其绑定到正文中.