【问题标题】:Why when I'm using printf program do not send string to output, but when I use println it does?为什么当我使用 printf 程序时不将字符串发送到输出,但当我使用 println 时它会发送?
【发布时间】:2016-04-20 15:54:59
【问题描述】:

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

)

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

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

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

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

    因为println 调用flush 函数,而printf 不调用。因此,如果您在每次调用 printf 之后添加 (flush),它就会起作用。

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

    【讨论】:

    • 你会推荐使用你的方式还是我在编辑中添加的方式(println (format "Searching for %s...\n" (rest string-tokens)))),使用format
    • 事实上我宁愿重写整个函数。会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2021-09-21
    • 2020-01-12
    • 2019-06-07
    相关资源
    最近更新 更多