Clojure是否支持循环重复形式?

时间:2015-11-02 05:48:23

标签: loops clojure common-lisp

我有以下Common Lisp代码片段:

(loop repeat len
  do
    (rotatef
      (nth (random len) list)
      (nth (random len) list))
  finally
    (return list)))))

我希望能够使用Clojure运行。

无论如何,编译器告诉我

  

循环需要一个用于其绑定的向量

这究竟是什么意思?我在哪里介绍一个载体?

2 个答案:

答案 0 :(得分:3)

这是你使用循环的方式:

var requestStream = Rx.Observable.just('https://api.github.com/users');

var responseMetastream = requestStream
  .flatMap(function(requestUrl) {
    return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
  });

responseMetastream.subscribe(url => {console.log(url)})

“循环需要一个用于绑定的向量”消息来自循环的第一个参数,在上面的示例中,这是 [n 0] ,这是一个向量,说我们初始化变量当我们使用 recur 时,n到0.我们的意思是我们想要用n的新值重复循环体。

提醒,loop in clojure是向量的函数,一些表达式为body:

(loop [n 0]
  (if (> n 10)
    n
    (recur (inc n))))

答案 1 :(得分:3)

洗牌

您的示例的目的是随机播放列表。为了完整起见,在Common Lisp中,您可以使用alexandria:shuffle在广义序列上执行相同的任务,而clojure中的等效函数是clojure.core/shuffle

循环构造

有一个名为clj-iter的库,其灵感来自CL的iterate函数,该函数本身基于loop。然而,人们tend to avoid在Clojure中使用这样的结构并且更喜欢功能组合等。

Clojure是一种单独的语言

只有像(+ 3 4)这样非常简单的表达式才能被解析并解释为Clojure和Common Lisp代码。 Clojure不会尝试以任何方式与现有的Lisp或Scheme语言兼容,并且有自己的计算模型,不鼓励使用可变结构,就像在您的示例中使用rotatef一样。因此,将Common Lisp代码移植到Clojure需要重新设计现有代码,就像你必须在Scala(或Python或Ruby)中重写它一样。

ABCL

我真的不知道你要执行什么,但是如果你想在JVM上运行Common Lisp代码,你可以使用ABCL (Armed Bear Common Lisp),这是Java中CL的有效实现。