Recursion 为什么我';我使用printf程序不会将字符串发送到输出,但当我使用println时,它会发送吗?
在Clojure中具有简单的功能Recursion 为什么我';我使用printf程序不会将字符串发送到输出,但当我使用println时,它会发送吗?,recursion,clojure,Recursion,Clojure,在Clojure中具有简单的功能 (defn command [] (loop [] (let [input (read-line) string-tokens (string/split input #" ") tokens (map keyword string-tokens) cmd (first tokens)] (cond ;; explain the commands (= cmd :help)(do (
(defn command []
(loop []
(let [input (read-line)
string-tokens (string/split input #" ")
tokens (map keyword string-tokens)
cmd (first tokens)]
(cond
;; explain the commands
(= cmd :help)(do
(printf "Usage:\nsearch <term>\nquit\n")
(recur)
)
;; break the loop
(= cmd :quit) (printf "bye bye")
;; do something
(= cmd :search) (do
(printf "Searching for %s...\n" (rest string-tokens))
(recur))
;; handle unknown input
:else (do
(println "Huh?")
(recur))
)
))
(defn命令[]
(循环[]
(让[输入(读取行)
字符串标记(字符串/拆分输入#“”)
标记(映射关键字字符串标记)
cmd(第一代币)]
(续)
解释命令
(=cmd:help)(do)
(printf“用法:\n搜索\n查询\n”)
(重现)
)
打破循环
(=cmd:quit)(打印“再见”)
做点什么
(=cmd:search)(do)
(printf“搜索%s…。\n”(rest字符串标记))
(重现)
处理未知输入
:其他(做
(打印“嗯?”)
(重现)
)
))
)
当我使用println
将字符串发送到输出时,它工作正常,但当我使用'printf'时,字符串似乎保存在缓冲区中,并在我通过选择:quit选项退出程序时打印出来
我认为这与do
块和递归有关,但如果没有它,我就不能使用recur
,因为我收到“只能从尾部位置重复”错误
编辑:不是我的程序不工作。我找到了解决这个问题的方法,首先使用
format
,然后使用println
(例如(println(format“search for%s...n”(rest string tokens))
),但这种行为对我来说很奇怪。因为println
调用flush
函数,而printf
不调用。因此,如果在每次printf
调用之后添加(flush)
,它就会工作
(printf "Usage:\nsearch <term>\nquit\n")
(flush)
(recur)
(printf“用法:\n搜索\n查询\n”)
(齐平)
(重现)
我建议您按照以下方式重写整个函数:
(defn command []
(loop []
(let [input (read-line)
string-tokens (clojure.string/split input #" ")
cmd (keyword (first string-tokens))
reply (case cmd
:help "Usage:\nsearch <term>\nquit"
:quit "bye bye"
:search (format "Searching for %s..." (rest string-tokens))
"Huh?")]
(println reply)
(when-not (= :quit cmd)
(recur)))))
(defn命令[]
(循环[]
(让[输入(读取行)
字符串标记(clojure.string/split input#“”)
cmd(关键字(第一个字符串标记))
答复(案例2)
:help“用法:\n搜索\n退出”
:退出“再见”
:搜索(格式为“搜索%s…”(rest字符串标记))
“嗯?”)]
(书面答覆)
(如果不是(=:退出cmd)
((""))(重复"""")
所以您可以将应答选择逻辑从函数的输出和递归/终止逻辑中分离出来。作为奖励,您可以避免重复并提高可读性(嗯,imo)您建议使用您的方式还是我在编辑中添加的方式(
println(格式“搜索%s…。\n”(rest字符串标记))
),使用格式
?事实上,我宁愿稍微重写整个函数。。将更新我的答案。