最近我正在写一个小 CLI 脚本,它需要从控制台重复读取日期(要读取的日期数是计算出来的,每次都可能不同)。示例 Ruby 代码可以让您了解这个想法:
dates = x.times.collect { print "Enter date: "; Date.parse(gets.chomp) }
只是为了它,我在 Clojure 中编写了脚本,并最终使用了一些相当丑陋的代码
swap!
和 loop...recur
.我想知道在 Clojure 中达到预期效果的最干净的方法是什么。 (Clojure 确实有 dotimes
,但它不保留从评估主体返回的值......正如从强调纯函数式编程的语言中所预期的那样。)
最佳答案
如果您的目标是最终得到一个恰好是 x
的序列用户输入的日期然后:
(for [line (repeatedly x read-line)] (DateFormat/parse line))
或使用
map
:(map DateFormat/parse (repeatedly x read-line))
当心 Clojure 中的惰性序列:用户将被要求输入更多需要的日期。如果您的目标是让用户一次输入所有日期(例如在启动时),则使用
doall
:(map DateFormat/parse (doall (repeatedly x read-line)))
这将一次读取所有日期,但仍会懒惰地解析它们,因此日期格式验证可能会在您的程序稍后失败。您可以移动
doall
上一级也可以立即解析:(doall (map DateFormat/parse (repeatedly x read-line)))
您可以使用辅助函数读取带有提示的行:
(defn read-line-with-prompt [prompt]
(print prompt)
(read-line))
然后替换
read-line
与:#(read-line-with-prompt "Enter date: ")
或者
(partial read-line-with-prompt "Enter date: ")
关于command-line - 编写 Clojure 代码以重复从控制台读取行的惯用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484113/