3

我有一个函数可以查看其中两个对象,执行一些神秘的逻辑,然后返回其中一个或两个(作为序列)。

我有这些对象的序列[o1 o2 o3 o4 ...],我想返回处理它的结果,如下所示:

  • 在 o1 和 o2 上调用神秘函数
  • 保留butlast你目前所拥有的
  • last上一个神秘函数的结果,并在其上调用神秘函数,然后 o3
  • 保留butlast你目前所拥有的
  • last上一个神秘函数的结果,并在其上调用神秘函数,o4
  • 保留butlast你目前所拥有的
  • last上一个神秘函数的结果,并在其上调用神秘函数,然后 oN
  • ……

这是我到目前为止所得到的:

; the % here is the input sequence
#(reduce update-algorithm [(first %)] (rest %))

(defn update-algorithm
  [input-vector o2]
  (apply conj (pop input-vector)
    (mystery-function (peek input-vector) o2)))

写这个的惯用方式是什么?我不喜欢这看起来的样子。我认为这apply conj有点难以阅读,[(first %)] (rest %)第一行也是如此。

4

1 回答 1

3

into将是比 更好的选择apply conj

不过我觉得[(first %)] (rest %)还好。可能是写这个的最短方法,它可以完全清楚减少的种子和被减少的序列是什么。

此外,reduce它与手头的任务完美匹配,不仅在它起作用的意义上,而且在任务减少/折叠的意义上。同样pop,按照他们的目的是“保留”和“获取”已经积累的东西(在向量中)peek,准确地做指定的事情。通过更改,代码基本上讲述了规范的相同故事,并且用更少的文字来启动。butlastlastinto

所以,不,没有办法改善这一点,对不起。;-)

于 2013-05-10T19:39:17.883 回答