提问人:blekione 提问时间:4/20/2016 最后编辑:blekione 更新时间:4/21/2016 访问量:77
为什么当我使用 printf 程序时不发送字符串到输出,但当我使用 println 时它会?
Why when I'm using printf program do not send string to output, but when I use println it does?
问:
在 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
我认为这与块和递归有关,但如果没有它,我无法使用,因为我收到“只能从尾部位置重复出现”错误。do
recur
编辑:并不是说我的程序不起作用。我找到了先使用然后(例如)来解决问题的方法,但这种行为对我来说很奇怪。format
println
(println (format "Searching for %s...\n" (rest string-tokens)))
答:
2赞
leetwinski
4/21/2016
#1
因为调用起作用,而没有。因此,如果您在每次通话后添加,它将起作用。println
flush
printf
(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
事实上,我宁愿重写整个函数。会更新我的答案。
评论