我想从命令行传递两个参数。我知道如何使用CommandLine.arguments传递一个参数。
val arg1 = CommandLine.arguments();
但是如何传递两个参数并使用它?
谢谢。
答案 0 :(得分:4)
正如约翰所说,自CommandLine.arguments : unit -> string list
以来,您可以通过此列表上的常规模式匹配来提取第一个和第二个参数。假设两个第一个参数可以命名为 foo 和 bar ,并且都应该被解释为字符串,以及任何其他数量的参数(0,1,3,... 。)是一个错误,你可以写:
fun main () =
let val (foo, bar) = case CommandLine.arguments () of
[foo, bar] => (foo, bar)
| _ => raise Fail "Usage: tool <foo> <bar>"
in ...
end
从foo
和bar
执行转换,例如转换为数字,从这里开始并不是非常困难。但是,如果你的命令行参数是可选的,或者你不希望它们的顺序很重要,或者你想提供多种方式来指定它们 - 例如-h
是--human-readable
的别名,但两者都有效 - 您应该考虑在SML / NJ中使用名为GetOpt的实用程序库。
它提供了一个框架,用于指定如何以动态方式解释命令行参数。您可以阅读SML/NJ GetOpt documentation,它提供了一个小例子。它是一个非常通用的库,增加了一些复杂性,在你有很多论点之前可能没有保证,并且不能为处理它们的所有合法组合而烦恼。
答案 1 :(得分:3)
CommandLine.arguments
的类型是
unit -> string list
它不返回单个字符串,它返回一个字符串列表。任何传递的参数都将在列表中。你只需要提取它们。
如果您传递一个字符串,该字符串将多个参数拆分为多个参数而不是空格作为分隔符,则可以使用String.tokens
。例如,
String.tokens (fn c => c = #"|") "abc|de|fgh";
产生["abc","de","fgh"]
。你需要传递给String.tokens
一个布尔值函数,它可以判断一个字符何时是一个分隔符。
答案 2 :(得分:0)
我明白了: 只需使用
sml "file.sml" "arg1" "arg2"
其中arg1和arg2存储在列表中,可以使用&#34; tl&#34;在程序中提取。和&#34; hd&#34;列表的功能。