command-line - 编写 Clojure 代码以重复从控制台读取行的惯用方法?

标签 command-line clojure functional-programming console-input

最近我正在写一个小 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/

相关文章:

php - 如何获取调用 PHP 脚本的目录

c# - 如何解析 C# 的命令行输出?

c# - 命令行 MSBuild 无法编译代码

multithreading - 在 Clojure 中同步多个读取器/单个写入器的线程

scala - 是否有将 Future[Reader[A, X]] 转换为 Reader[A, Future[X]] 的通用方法?

java - 通过属性将 map 的列表值转换为其平均值

file - Mac打开grep文件列表

用于 Clojure 的 Python StringIO

javascript - 逐步执行功能时遇到麻烦,减少了一系列功能

java - 在 kill 时优雅地退出 Clojure core.async go 循环