Recursion 为什么我';我使用printf程序不会将字符串发送到输出,但当我使用println时,它会发送吗?

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 (

在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
                  (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字符串标记))
),使用
格式
?事实上,我宁愿稍微重写整个函数。。将更新我的答案。