/* Command-line arguments (Rosettta code) in Picat. http://rosettacode.org/wiki/Command-line_arguments """ Retrieve the list of command-line arguments given to the program. For programs that only print the arguments when run directly, see Scripted main. See also Program name. For parsing command line arguments intelligently, see Parsing command-line arguments. Example command line: myprogram -c "alpha beta" -h "gamma" -d """ This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % The command line arguments are as a list in the parameter to main/1. /* Picat does not have an option argument parser so it must be written specifically for each usage. Here is a simple argument parser that just collect the parameters in a map. Note: The parameters to the picat program should not be used as program parameters: -g goal --help --v, -v, --version -b B size of the trail stack -log, -l -p P size of program area -path P -s S size of stack/heap */ % % $ picat command_line_arguments.pi nc -v -n -z -w 1 192.168.1.2 1-1000 % Note: -v is not allowed. Set it to -x instead % % Here is a simple parser for these arguments main(ARGS) => println(main=ARGS), Opts = new_map(), process_args(ARGS,Opts), foreach(Pos=V in Opts) println(Pos=V) end, nl. main(_) => println(after),true. process_args(ARGS,Opts) :- process_args(ARGS,1,Opts). process_args([],_Pos,_Map). process_args(["-x"|As],Pos,Map) :- Map.put(Pos,[verbose,true]), process_args(As,Pos+1,Map). process_args(["-n"|As],Pos,Map) :- Map.put(Pos,[numbers,true]), process_args(As,Pos+1,Map). process_args(["-z"|As],Pos,Map) :- Map.put(Pos, [zebra,true]), process_args(As,Pos+1,Map). process_args(["-w",Arg|As],Pos,Map) :- Map.put(Pos,[walking,Arg]), process_args(As,Pos+1,Map). process_args([Opt|As],Pos,Map) :- Map.put(Pos,[Opt,'']), process_args(As,Pos+1,Map). go ?=> main(["nc","-x","-n","-z","-w","1","192.168.1.2","1-1000"]), nl. go => true. % Process the parameters /* process_args([],_Pos,Opts,Opts). process_args([['-',Opt],Arg|As],Pos,Opts0,Opts) :- println($process_args_1(['-',opt=Opt,arg=Arg|As],Pos,Opts0,Opts) ), Opts1 = Opts0 ++ [[Pos,Opt,Arg]], process_args(As,Pos+1,Opts1,Opts). process_args([['-',Opt]|As],Pos,Opts0,Opts) :- println($process_args_2([-,opt=Opt|As],Pos,Opts0,Opts)), Opts1 = Opts0 ++ [[Pos,Opt,true]], process_args(As,Pos+1,Opts1,Opts). process_args([Opt|As],Pos,Opts0,Opts) :- Opt.first != '-', println($process_args_3([opt=Opt|As],Pos,Opts0,Opts)), Opts1 = Opts0 ++ [[Pos,Opt,""]], process_args(As,Pos+1,Opts1,Opts). */ /* process_args([],_Pos,Opts,Opts). process_args(["-x"|As],Pos,Opts0,Opts) :- Opts1 := Opts0 ++ [[Pos,verbose,true]], process_args(As,Pos+1,Opts1,Opts). process_args(["-n"|As],Pos,Opts0,Opts) :- Opts1 = Opts0 ++ [[Pos,numbers,true]], process_args(As,Pos+1,Opts1,Opts). process_args(["-z"|As],Pos,Opts0,Opts) :- Opts1 = Opts0 ++ [[Pos,zebra,true]], process_args(As,Pos+1,Opts1,Opts). process_args(["-w",Arg|As],Pos,Opts0,Opts) :- Opts1 = Opts0 ++ [[Pos,walking,true]], process_args(As,Pos+1,Opts1,Opts). % Default: no -w process_args([Opt|As],Pos,Opts0,Opts) :- Opts1 = Opts0 ++ [[Pos,Opt,'']], process_args(As,Pos+1,Opts1,Opts). */