Clojure 在调用每个相邻元素上的函数时,将序列缩减为较短的序列

Clojure 在调用每个相邻元素上的函数时,将序列缩减为较短的序列,clojure,functional-programming,Clojure,Functional Programming,我有一个函数,它可以查看其中两个对象,执行一些神秘的逻辑,然后返回其中一个或两个(作为序列) 我得到了这些对象的一个序列[o1 o2 o3 o4…],我想返回这样处理的结果: 调用o1和o2上的神秘函数 保留到目前为止所拥有的但最后一个 取上一个神秘函数结果的最后一个,并在其上调用神秘函数,然后 保留到目前为止所拥有的但最后一个 取上一个神秘函数结果的最后一个,并在其上调用神秘函数,然后o4 保留到目前为止所拥有的但最后一个 取上一个神秘函数结果的最后一个,并在其上调用神秘函数,然后继续

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

我得到了这些对象的一个序列
[o1 o2 o3 o4…]
,我想返回这样处理的结果:

  • 调用o1和o2上的神秘函数
  • 保留到目前为止所拥有的
    但最后一个
  • 取上一个神秘函数结果的
    最后一个
    ,并在其上调用神秘函数,然后
  • 保留到目前为止所拥有的
    但最后一个
  • 取上一个神秘函数结果的
    最后一个
    ,并在其上调用神秘函数,然后o4
  • 保留到目前为止所拥有的
    但最后一个
  • 取上一个神秘函数结果的
    最后一个
    ,并在其上调用神秘函数,然后继续
以下是到目前为止我得到的信息:

; 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
有点难读,第一行的
[(第一个%)](其余%)
也有点难读

进入
将是比
应用conj
更好的选择

我认为
[(第一个%)](其余%)
很好。这可能是写这篇文章的最短方式,它让我们完全清楚了,缩减的种子和被缩减的序列是什么

此外,
reduce
与手头的任务完美匹配,不仅从工作的意义上,而且从任务是缩减/折叠的意义上来说。类似地,
pop
peek
做了明确规定的事情,即他们的目的是“保留
但最后一次
”和“取
最后一次
”(在向量中)。随着
变为
的变化,代码基本上讲述了与规范相同的故事,并且用更少的词语引导


所以,不,没有办法改善这一点,对不起

我认为
输入向量
参数对应于身体中的
同意向量
。@MichałMarczyk typo:)修复了很多问题。我很高兴你能理解我想做什么,因为我在描述它时遇到了很多麻烦。