【发布时间】:2011-11-17 12:27:30
【问题描述】:
我是 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 中的许多序列转换都非常优雅,但到目前为止我发现具有挑战性的是像这样的转换,它 a) 适合通过索引而不是元素进行操作,和/或 b) 需要特殊处理某些元素。
感谢您的任何建议。
【问题讨论】:
标签: clojure functional-programming