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

从sml中的命令行传递两个参数,sml,smlnj,Sml,Smlnj,我想从命令行传递两个参数。我知道如何使用CommandLine.arguments传递一个参数 val arg1 = CommandLine.arguments(); 但是如何传递两个参数并使用它呢 谢谢。命令行.参数的类型是 unit -> string list 它不返回单个字符串,而是返回字符串列表。任何传递的参数都将在列表中。你只要把它们取出来就行了 如果您要传递一个字符串,该字符串拆分为多个参数,并使用空格以外的内容作为分隔符,则可以在其上使用string.tokens。比如

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

val arg1 = CommandLine.arguments();
但是如何传递两个参数并使用它呢


谢谢。

命令行.参数的类型是

unit -> string list
它不返回单个字符串,而是返回字符串列表。任何传递的参数都将在列表中。你只要把它们取出来就行了

如果您要传递一个字符串,该字符串拆分为多个参数,并使用空格以外的内容作为分隔符,则可以在其上使用
string.tokens
。比如说,

String.tokens (fn c => c = #"|") "abc|de|fgh";

这将产生
[“abc”、“de”、“fgh”]
。您需要传递给
String.tokens
一个布尔值函数,它可以判断字符何时是分隔符。

正如John所说,由于
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
fun main()=
让val(foo,bar)=的case CommandLine.arguments()
[foo,bar]=>(foo,bar)
|_uz=>raise Fail“用法:工具”
在里面
结束
从这里开始,在
foo
bar
上执行转换,例如转换为数字,并不十分困难。但是,如果命令行参数是可选的,或者您不希望它们的顺序是重要的,或者您想提供多种方式来指定它们——例如,代码>胡/代码>是<代码>的别名——人类可读的< /代码>,同时两者都工作-您应该考虑使用SML/NJ中的实用库,称为GETopt。 它提供了一个框架,用于指定如何以动态方式解释命令行参数。您可以阅读,它提供了一个小示例。这是一个非常通用的库,增加了一些复杂性,在您有很多参数之前,可能无法保证这一点,并且无法费心处理它们的所有合法组合。

我发现: 只用

sml "file.sml" "arg1" "arg2"

其中arg1和arg2存储在一个列表中,可以使用列表的“tl”和“hd”函数在程序中提取。

假设我通过了“abcdefg”,并希望将“abcd”和“efg”分开。如何做到这一点?你的程序应该如何分辨一个参数的结束和另一个参数的开始?标准方法是命令行参数以空格分隔。如果你把一个字符串作为一个大参数传递,那么你当然需要解析这个字符串——但是你还没有给出任何关于实际解析问题的相关信息。我不知道这个
GetOpt
库——谢谢你指出它。