gpt4 book ai didi

recursion - 不在尾部位置重复

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:16 24 4
gpt4 key购买 nike

我如何使用类似的东西来recur而不是在尾部位置?

看看我的代码:

(defn -main [& args]

(println "Hi! Type a file name...")

(defn readFile[])
(let [fileName(read-line)]
(let [rdr (reader fileName)]
(if-not (.exists rdr)
((println "Sorry, this file doesn't exists. Type a valid file name...")
(recur)))
(defn list '())
(doseq [line (line-seq rdr)]
(if-not (= "" line)
(concat list '(line)))
(list))))

(defn fileLinesList (readFile))
...
...)

我知道我不能在这里使用 recur...但我也不知道如何在 clojure 中使用它。

我是 Clojure 的新手,来自 OOP 环境。所以……

在这种情况下有没有办法使用递归?有什么替代方案?

最佳答案

首先,您不应该将您的函数定义嵌套在另一个 defn 中(在本例中为 -main)。 defndef 总是在命名空间的顶层定义符号绑定(bind),它们不嵌套。如果你想定义一个局部作用域的函数,你需要使用 letfn,例如

(let [my-fn (fn [a b] (+ a b))]
(my-fn 1 2))

在您的特定情况下,我认为将您的代码拆分为多个函数会更容易。这样它会更具可读性。

提示输入文件名是您的逻辑之一。

(defn get-existing-filename []
(let [filename (read-line)]
(if (.exists (java.io.File. filename))
filename
(do
(println "Sorry, this file doesn't exists. Type a valid file name...")
(recur)))))

然后你可以用它来读取文件并删除空行:

(with-open [input (clojure.java.io/reader (get-existing-filename))]
(->> (line-seq input)
(remove empty?)
(doall)))

对于包含以下内容的文件:

AAA

BBB
CCC

DDD

它会回来

("AAA" "BBB" "CCC" "DDD")

如果你真的想把它作为一个单一的功能,下面的方法就可以了:

(defn read-file []
(let [filename (read-line)]
(if (.exists (java.io.File. filename))
(with-open [input (clojure.java.io/reader (get-existing-filename))]
(->> (line-seq input)
(remove empty?)
(doall)))
(do
(println "Sorry, this file doesn't exists. Type a valid file name...")
(recur)))))

最后,这个函数可以从-main调用。

我还注意到您的示例代码中的另一个问题:

((println "Sorry, this file doesn't exists. Type a valid file name...")
(recur))

ifif-notthenelse 分支需要一个表达式。如果你想有多个表达式,你需要将它们嵌套在 do 中:

(do
(println "Sorry, this file doesn't exists. Type a valid file name...")
(recur))

如果您需要 ifif-not 而没有 else 分支,那么您可以使用 whenwhen-not 宏。然后你不需要包装多个表达式,因为 when/when-not 会在你的 do 中包装它们。

(when true
(println 1)
(println 2))

相当于

(if true
(do
(println 1)
(println 2)))

关于recursion - 不在尾部位置重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com