Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何将函数多次应用于序列_Clojure - Fatal编程技术网

Clojure 如何将函数多次应用于序列

Clojure 如何将函数多次应用于序列,clojure,Clojure,我正在使用Clojure编写一些Lisp。我试图在不利用向量和Clojure函数的情况下进行这些练习 此函数 (defn rev-seq [s1] (concat (pop s1) (list (peek s1)))) 将列表的第一个元素放在末尾。我希望调用此函数的次数与反转列表所需的次数相同(无需调用Clojure的reverse函数) 我不知道用什么来代替它。我尝试了map、apply和repeat,但没有成功。我宁愿有一种不同的思考方式,而不是直接的回答,但我不是要求讨论

我正在使用Clojure编写一些Lisp。我试图在不利用向量和Clojure函数的情况下进行这些练习

此函数

(defn rev-seq
    [s1]
    (concat (pop s1) (list (peek s1))))
将列表的第一个元素放在末尾。我希望调用此函数的次数与反转列表所需的次数相同(无需调用Clojure的
reverse
函数)


我不知道用什么来代替它。我尝试了map、apply和repeat,但没有成功。我宁愿有一种不同的思考方式,而不是直接的回答,但我不是要求讨论。

首先,我认为如果您想处理一般序列,您需要先将rev-seq转换为使用
/
rest
,而不是
peek
/
pop
,至少在Clojure 1.4
peek
/
pop
中似乎需要一个持久堆栈:

(defn rev-seq
  [s1]
  (concat (rest s1) (list (first s1))))
然后您可能会注意到,重复应用此函数将“循环”列表,而不是将其反转。如果使用
迭代查看少量应用程序的结果,您可以看到:

(def s '(1 2 3 4 5 6 7 8 9))

(nth (iterate rev-seq s) 3)
=> (4 5 6 7 8 9 1 2 3)
一个可行的选项是使用递归函数进行反转:

(defn reverse-seq [s]
  (concat (reverse (next s)) (list (first s))))

(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
或者,您也可以使用clojure.core中的技术进行反向操作:

(defn reverse-seq [s]
  (reduce conj () s))

(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
希望这能给你一些想法

递归功能强大! 我翻译 进入Clojure

(defn- inverte-aux
  [lista resto]
  (if lista
    (recur (next lista) (cons (first lista) resto))
    resto))

(defn inverte
  [lista]
  (inverte-aux lista nil))

user> (inverte [4 3 2 1 3])
(3 1 2 3 4)

事实证明(#(into()%1);(abcd))逆转了列表。也许值得指出的是,(into()'(abcd))也逆转了列表。