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

Why when I'm using printf program do not send string to output, but when I use println it does?

提问人:blekione 提问时间:4/20/2016 最后编辑:blekione 更新时间:4/21/2016 访问量:77

问:

在 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))
 )
))

)

当我用来发送字符串输出时,它工作正常,但是当我使用“printf”时,当我通过选择 :quit 选项退出程序时,它看起来像字符串被保存在缓冲区中并打印出来。println

我认为这与块和递归有关,但如果没有它,我无法使用,因为我收到“只能从尾部位置重复出现”错误。dorecur

编辑:并不是说我的程序不起作用。我找到了先使用然后(例如)来解决问题的方法,但这种行为对我来说很奇怪。formatprintln(println (format "Searching for %s...\n" (rest string-tokens)))

递归 clojure

评论


答:

2赞 leetwinski 4/21/2016 #1

因为调用起作用,而没有。因此,如果您在每次通话后添加,它将起作用。printlnflushprintf(flush)printf

(printf "Usage:\nsearch <term>\nquit\n")
(flush)
(recur)

我建议您按以下方式重写整个函数:

(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)))))

因此,您可以将应答选择逻辑与函数的输出和递归/终止逻辑分开。作为奖励,您可以避免重复,并提高可读性(好吧,IMO)

评论

0赞 blekione 4/21/2016
您是否建议使用您的方式或我在编辑()中添加的方式,并使用?println (format "Searching for %s...\n" (rest string-tokens)))format
0赞 leetwinski 4/21/2016
事实上,我宁愿重写整个函数。会更新我的答案。