Как лучше всего обрабатывать это преобразование последовательности в Clojure?

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

Спасибо за любые предложения.

8
задан eggsyntax 17 November 2011 в 12:38
поделиться