从sml中的命令行传递两个参数

时间:2016-02-21 17:47:02

标签: sml smlnj

我想从命令行传递两个参数。我知道如何使用CommandLine.arguments传递一个参数。

val arg1 = CommandLine.arguments();

但是如何传递两个参数并使用它?

谢谢。

3 个答案:

答案 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

foobar执行转换,例如转换为数字,从这里开始并不是非常困难。但是,如果你的命令行参数是可选的,或者你不希望它们的顺序很重要,或者你想提供多种方式来指定它们 - 例如-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;列表的功能。