Ваша версия выглядит хорошо для меня.Обычные имена, которые вы увидите в базе кода clojure, - это 'coll' для коллекций.Я также видел 'xs' в стиле Haskell, я думаю.Вы также можете обратиться к стандартам кодирования библиотеки Clojure в различных соглашениях.
Возвращаясь к примеру: два наблюдения.
- Использование: else для 'cond' в качестве условия выхода, вместо стиля Common Lisp 'T'.
- Вместо того, чтобы предполагать списки, подумайте о последовательностях.
Имея в виду эти два, если я переписываю ваш код:
user> (defn mapper [coll f]
(cond
(not (seq coll)) nil
:else (conj (mapper (next coll) f)
(f (first coll)))))
#'user/mapper
user> (mapper '(1 2 3) #(* % %))
(1 4 9)
user> (mapper [1 2 3] #(* % %))
(1 4 9)
Обратите внимание, что "Con" делает "правильную вещь" какЧто касается коллекций.Он добавляет новый элемент в начало списка, в конец вектора и так далее.Также обратите внимание на использование выражения «следующий» вместо идиом «первый / остальные» в традиционном языке LISP.«next» возвращает последовательность элементов после первого элемента.Таким образом, пустота может быть проверена путем seq'ing для коллекции, которая вернет nil для пустого списка или пустого вектора.Таким образом, он работает для всех коллекций.