Прежде всего, эта функция возвращает список с последним элементом в нем. Я изменил свое определение, так что она возвращает только последний пункт:
(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)))
Вы все еще хотите, чтобы определить функцию, или вы просто хотите анонимную функцию? – outis
@outis anonymous –
Пожалуйста, уточните вопрос с запрошенной информацией. В целом, ответьте на просьбы о разъяснениях, обновив сообщение, а не отвечая комментарием. Во-первых, вопрос должен быть понятным без чтения комментариев. Для других SO - это сайт Q & A, а не форум, и комментарии не предназначены (и не подходят) для обсуждений. – outis