我正在编写一个程序,它既有命令行界面又有交互模式。在CLI模式下,它执行一个命令,打印结果并退出。在交互模式下,它使用GNU readline重复读取命令,执行它们并打印结果(类似于REPL)。
无论命令来自命令行还是stdin,命令及其参数的语法几乎相同。我希望通过使用单个框架解析命令行和交互模式输入来最大化代码重用。
我的建议语法为(方括号表示可选部分,花括号表示重复):
我的问题是CL和交互式界面之间存在一些差异: 某些全局选项仅从命令行有效(例如--help,--version或--config-file)。显然还有“quit”命令,在交互模式下非常重要,但在CL中使用它没有意义。
为了解决这个问题,我搜索了网络和hackage上的命令行解析库。我发现最有趣的是cmdlib和optparse-applicative。然而,我对Haskell还很陌生,即使我可以通过从库文档中复制和修改示例代码来创建一个工作程序,但我还没有完全理解这些库的机制,因此无法解决我的问题。
我有以下问题: 如何为CL和REPL接口通用的命令和选项创建基本解析器,然后能够扩展基本解析器以添加新的命令和选项? 如何防止这些库在输入不正确或使用“--help”时退出我的程序? 我计划为我的程序添加完整的i18n支持。因此,我希望防止我的选择库打印任何消息,因为所有消息都需要翻译。如何实现这一点?
因此,我希望您能为我提供一些提示,告诉我该从哪里开始。cmdlib或optparse-applicative(或其他库)是否支持我正在寻找的功能?还是应该回到手工制作解析器?
无论命令来自命令行还是stdin,命令及其参数的语法几乎相同。我希望通过使用单个框架解析命令行和交互模式输入来最大化代码重用。
我的建议语法为(方括号表示可选部分,花括号表示重复):
From shell:
program-name {[GLOBAL OPTION] ...} <command> [{<command arg>|<GLOBAL OPTION>|<LOCAL OPTION> ...}]
In interactive mode:
<command> [{<command arg>|<GLOBAL OPTION>|<LOCAL OPTION> ...}]
我的问题是CL和交互式界面之间存在一些差异: 某些全局选项仅从命令行有效(例如--help,--version或--config-file)。显然还有“quit”命令,在交互模式下非常重要,但在CL中使用它没有意义。
为了解决这个问题,我搜索了网络和hackage上的命令行解析库。我发现最有趣的是cmdlib和optparse-applicative。然而,我对Haskell还很陌生,即使我可以通过从库文档中复制和修改示例代码来创建一个工作程序,但我还没有完全理解这些库的机制,因此无法解决我的问题。
我有以下问题: 如何为CL和REPL接口通用的命令和选项创建基本解析器,然后能够扩展基本解析器以添加新的命令和选项? 如何防止这些库在输入不正确或使用“--help”时退出我的程序? 我计划为我的程序添加完整的i18n支持。因此,我希望防止我的选择库打印任何消息,因为所有消息都需要翻译。如何实现这一点?
因此,我希望您能为我提供一些提示,告诉我该从哪里开始。cmdlib或optparse-applicative(或其他库)是否支持我正在寻找的功能?还是应该回到手工制作解析器?