2012-05-26 2 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 связывания, так что вы звоните next дважды l:

(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 «S, что делает всю функцию немного более кратким:

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

+1 для использования recur и destructuring :) – ivant

+0

Спасибо, почти чувствую, что я знаю, что я делаю в половине случаев. :) –

+1

Здесь вы можете использовать 'if' вместо' cond', а использование 'fn' вместо' # 'позволит вам выполнить деструктурирование непосредственно в args:' (fn [[h & t]] (if (пустой? t) h (recur t))) ' – ivant

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

С lastt recurses, вам необходимо указать имя, чтобы связать его с телом.

+0

Вы правы относительно defn. Это макрос. – octopusgrabbus

Смежные вопросы