Clojure中的recur调用出错
我试着从输入中读取数字,然后用Clojure打印出来,直到我读取数字42。这是确保我知道如何读取输入的一件非常基本的事情。取自 我写了这个程序。可能不太好,克洛朱尔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)) )
(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的输出,所以它应该可以工作