Я новичок в 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, но те, которые я считаю сложными до сих пор, такие, как этот, которыйа) поддаются манипуляции индексом, а не элементом, и / или б) требуют специальной обработки определенных элементов.
Спасибо за любые предложения.