Я новичок в Clojure, и я недавно перевел некоторые работы по манипулированию данными, которые я сделал, чтобы помочь в обучении . У меня есть перевод функций, который работает нормально и короче, но кажется гораздо менее читаемым. Может ли кто-нибудь предложить более читаемый и / или более идиоматический способ справиться с этим?
В Python:
def createDifferenceVector(v,startWithZero=True):
deltas = []
for i in range(len(v)):
if i == 0:
if startWithZero:
deltas.append(0.0)
else:
deltas.append(v[0])
else:
deltas.append(v[i] - v[i-1])
return deltas
Моя попытка перевода Clojure:
(defn create-diff-vector [v start-zero]
(let [ext-v (if start-zero
(cons (first v) v)
(cons 0 v))]
(for [i (range 1 (count ext-v))]
(- (nth ext-v i) (nth ext-v (- i 1))))))
Возможно, он менее читабелен только из-за моей неопытности с Clojure, но, в частности, мне кажется, что трюк с добавлением элемента к входному вектору скрывает замысел. Все решения, которые я пробовал, в которых не использовался предварительный трюк, были намного длиннее и уродливее.
Многие преобразования последовательностей невероятно элегантны в Clojure, но те, которые я считаю сложными до сих пор, - это такие, как это: а) поддаются манипуляции по индексу, а не по элементам, и / или б) требуют специальной обработки для определенные элементы.
Спасибо за любые предложения.