Поскольку вообще нет необходимости использовать 'let' или 'def', я должен согласиться с Амаллой в ответе Барта J.Конечно, это оправдывает положительные отзывы, потому что это полезная информация, но это неправильный ответ.
На самом деле, определение функции является бесполезным, поскольку (сортировка ilist) поможет.Результатом функции является «объект», который вы хотите.То есть, если вы не хотите использовать результат сортировки , кратный раз, в различных местах в теле функции.В этом случае свяжите результат сортировки с локальной переменной функции.
Если вам нужна сортировка один раз , не связывайте ее вообще, а просто вкладывайте в другиефункции.Например, если вы хотите использовать его внутри уникальной функции (что, я думаю, именно то, что вы хотите сделать):
(defn uniq
"Get only unique values from a list"
[ilist]
; remove nils from list
(filter #(not(nil? %))
; the list of intermediate results from (reduce comppair sortedlist)
; (includes nils)
(reductions
; function to extract first and second from a list and compare
(fn comppair
[first second & rest]
(if (not= first second) second))
; the original sort list function
(sort ilist))))
(uniq '(1,2,3,6,1,2,3))
(1 2 3 6)
Опять же, вы также можете просто использовать встроенную отдельную функцию,и посмотрите на его источник:
(distinct '(1,2,3,6,1,2,3))
(1 2 3 6)
(source distinct)
(defn distinct
"Returns a lazy sequence of the elements of coll with duplicates removed"
{:added "1.0"}
[coll]
(let [step (fn step [xs seen]
(lazy-seq
((fn [[f :as xs] seen]
(when-let [s (seq xs)]
(if (contains? seen f)
(recur (rest s) seen)
(cons f (step (rest s) (conj seen f))))))
xs seen)))]
(step coll #{})))