Clojure中的recur调用出错

Clojure中的recur调用出错,clojure,Clojure,我试着从输入中读取数字,然后用Clojure打印出来,直到我读取数字42。这是确保我知道如何读取输入的一件非常基本的事情。取自 我写了这个程序。可能不太好,克洛朱尔 (defn universe [] (let [num (line-seq (java.io.BufferedReader. *in*))] (if (not= num 42) (do (println num) (recur (universe)) )

我试着从输入中读取数字,然后用Clojure打印出来,直到我读取数字42。这是确保我知道如何读取输入的一件非常基本的事情。取自

我写了这个程序。可能不太好,克洛朱尔

(defn universe
  []
  (let [num (line-seq (java.io.BufferedReader. *in*))]
    (if (not= num 42)
      (do
        (println num)
        (recur (universe))
        )
      )
    )
  )
我的理解是,
line-seq
从给定的任何读取器惰性地进行计算。在这种情况下,标准输入

所以我把它设为num。若num不是42,我打印它,然后递归调用universe。但它抛出了一个例外

Mismatched argument count to recur, expected: 0 args, got: 1,

我看到了一个例子,再次出现确实需要一个论点。看着这个,我看不出它的语法。那么,为什么我会出现此错误?

recur
不使用要重复出现的位置的名称。相反,recur特殊形式跳回最近的函数或
循环
表达式,以较近的为准。然后它传递不同的参数。这允许您在处理数据时重复处理相同的代码块,并且没有函数调用开销

在您的情况下,它会重复出现在函数调用之前:

(defn universe [] ...
试图给它传递一个参数,但失败了,因为宇宙,函数,不接受任何参数。也许您打算在if周围放置一个
循环
表达式

user> (defn universe
        []
        (let [numbers (line-seq (java.io.BufferedReader. *in*))]
          (loop [numbers numbers]
            (let [num (first numbers)]
              (if (not= (Integer/parseInt num) 42)
                (do
                  (println num)
                  (recur (rest numbers))))))))
#'user/universe
user> (universe)
3   ;; typed 3 
nil ;; typed 42

或者,如果您打算返回函数的顶部,在这种情况下,只需调用
(recur)
,而不是
(recur universe)

recur
不使用要返回的位置的名称。相反,recur特殊形式跳回最近的函数或
循环
表达式,以较近的为准。然后它传递不同的参数。这允许您在处理数据时重复处理相同的代码块,并且没有函数调用开销

在您的情况下,它会重复出现在函数调用之前:

(defn universe [] ...
试图给它传递一个参数,但失败了,因为宇宙,函数,不接受任何参数。也许您打算在if周围放置一个
循环
表达式

user> (defn universe
        []
        (let [numbers (line-seq (java.io.BufferedReader. *in*))]
          (loop [numbers numbers]
            (let [num (first numbers)]
              (if (not= (Integer/parseInt num) 42)
                (do
                  (println num)
                  (recur (rest numbers))))))))
#'user/universe
user> (universe)
3   ;; typed 3 
nil ;; typed 42

或者,如果您打算返回函数的顶部,则只需调用
(recur)
,而不是
(recur universe)

,逻辑是有意义的,但这两种方式都无法工作。只要调用recur而不是(recur universe)就会得到一个无限循环。我已经停止了回复。即使在let之后添加println也不会给我任何输出。正如您所做的那样放置一个循环,这给了字符串一个lazySeq的casteException。我认为这可能是因为(第一个数字)是参数值。因此,尝试在循环中添加另一个let以获得第一个let。然后得到了另一个无限循环。在Ubuntu 14.04上使用Clojure 1.7和OpenJDK 64位服务器VM 1.7.0_79-b14。以防万一。对于任何
重复
调用,无论是对
循环
还是对函数表单,肯定没有函数调用开销。您的逻辑看起来有问题。
循环
是通过绑定到
(第一个数字)
num
设置的,但是
循环
将其绑定到
(剩余数字)
,肯定不兼容。此外<代码>数字因此
(其余数字)
循环中保持不变
@Thumbnail-oops我粘贴了完全错误的代码块:-/并且在单击之前没有阅读我的帖子。很抱歉,谢谢你指出这一点。这次我粘贴了repl的输出,所以它应该可以工作。逻辑是有道理的,但这两种方式都不起作用。只要调用recur而不是(recur universe)就会得到一个无限循环。我已经停止了回复。即使在let之后添加println也不会给我任何输出。正如您所做的那样放置一个循环,这给了字符串一个lazySeq的casteException。我认为这可能是因为(第一个数字)是参数值。因此,尝试在循环中添加另一个let以获得第一个let。然后得到了另一个无限循环。在Ubuntu 14.04上使用Clojure 1.7和OpenJDK 64位服务器VM 1.7.0_79-b14。以防万一。对于任何
重复
调用,无论是对
循环
还是对函数表单,肯定没有函数调用开销。您的逻辑看起来有问题。
循环
是通过绑定到
(第一个数字)
num
设置的,但是
循环
将其绑定到
(剩余数字)
,肯定不兼容。此外<代码>数字因此
(其余数字)
循环中保持不变
@Thumbnail-oops我粘贴了完全错误的代码块:-/并且在单击之前没有阅读我的帖子。很抱歉,谢谢你指出这一点。这次我粘贴了repl的输出,所以它应该可以工作