2016-02-21 5 views

ответ

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, что дает небольшой пример. Это довольно общая библиотека и добавляет некоторую сложность, которая, возможно, не оправдана до тех пор, пока у вас не будет достаточно аргументов, и не стоит беспокоиться обо всех юридических комбинациях из них.

+0

Я не знал об этой библиотеке «GetOpt» - спасибо, что вы указали это. –

3

Тип CommandLine.arguments является

unit -> string list 

Он не возвращает одну строку, он возвращает список строк. Любой переданный аргумент будет в списке. Вам просто нужно их добыть.

Если вы передаете одну строку, которая разбивается на несколько аргументов с чем-то другим, кроме пробела в качестве разделителя, вы можете использовать на нем String.tokens. Например,

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

Что дает ["abc","de","fgh"]. Вам нужно перейти к String.tokens a Boolean-значная функция, которая может указывать, когда символ является разделителем.

+0

как? скажите –

+0

Предположим, что я прошел «abcdefg» и хочу, чтобы «abcd» и «efg» были разделены. как это сделать? –

+1

Как ваша программа должна указывать, где заканчивается один аргумент, а другой начинается? Стандартный подход заключается в том, что аргументы командной строки ограничены пробелом. Если вы передаете одну строку в качестве одного большого аргумента, то, конечно, вам нужно проанализировать строку, но вы не указали какую-либо релевантную информацию о том, какова будет ваша фактическая проблема синтаксического анализа. –

0

Я понял это: Просто используйте

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

где arg1 и arg2, хранятся в виде списка и могут быть извлечены в программе с помощью «ТЛ» и функцию «HD» списка.