cmd_line.anubis
22.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
*Project* The Anubis Project
*Title* Handling command line arguments.
*Copyright* Copyright (c) Alain Prouté 2007.
*Released*
*Author* Alain Prouté
This file defines a tools for handling command line arguments.
The system provides command line arguments in the form of a list of character
strings. In general, a program requires a minimal number of arguments, plus optional
arguments, plus options. Each command line argument must be checked and eventually
converted into some datum whose type depends on the argument. Nevertheless, we assume
that optional arguments are treated the same way. Options are supposed to begin by an
hyphen, and each option may itself have one or several argument which are just the
following command line items. If something is unacceptable, an error function of type
'One -> One' is called (which may print a message on the console or do anything else),
and the program is not started.
For example, assume your program requires 2 mandatory arguments, eventually followed by
optional arguments, and may also accept options. You may use the following tool:
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) convert_argument_1,
String -> Result(One -> One,$A2) convert_argument_2,
String -> Result(One -> One,$A) convert_optional_argument,
$O default_options,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_option,
One -> One recall_syntax,
($A1,$A2,List($A),$O) -> One the_program
).
The function 'cmd_line' discriminates between normal arguments and option by testing
for a leading hyphen. For example, 'my_file' is an argument, whilst '-verbose' is an
option.
You must provide a datum 'default_options' of type '$O' representing the default values
of all the options of your program. This datum is updated at each option successfully
read.
When an option is encountered, the current values of options and the list of all
command line arguments starting at the option is transmitted to the function
'read_option'. This function is supposed to recognize the option (which is the head of
list) and to use eventually one or several subsequent elements of the list of command
line arguments. If the option is accepted, a pair made of the new values of all
options, and the remaining command line arguments must be returned. If the option is
not accepted, a function of type One -> One must be returned. This function is executed
(it may write an error message on the console for example) and the program is not
started.
The function 'convert_argument_1' is applied to the first normal (non option) argument.
If the argument is not acceptable, it returns a function of type One -> One which is
executed, and the program is not started. If the argument is accepted, its value (of
type '$A1') is returned. Other mandatory arguments are treated similarly with the
corresponding conversion functions.
Optional arguments are handled similarly by 'convert_optional_argument'.
The function 'recall_syntax' is executed only if a mandatory argument is missing.
If everything succeeds, the program is called with the two mandatory arguments, the
list of optional arguments, and the value of all options.
You create your Anubis module like this:
global define One
my_program
(
List(String) args
) =
cmd_line(cv1,cv2,cvo,def_opts,read_opt,prog)(args).
where 'cv1', 'cv2', 'cvo', 'def_opts', 'read_opt' and 'prog' have been previously
defined.
We provide the variants of this tools for any number of mandatory arguments from 1 to
4.
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) convert_argument_1,
String -> Result(One -> One,$A) convert_optional_argument,
$O default_options,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_option,
One -> One recall_syntax,
($A1,List($A),$O) -> One the_program
).
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) convert_argument_1,
String -> Result(One -> One,$A2) convert_argument_2,
String -> Result(One -> One,$A3) convert_argument_3,
String -> Result(One -> One,$A) convert_optional_argument,
$O default_options,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_option,
One -> One recall_syntax,
($A1,$A2,$A3,List($A),$O) -> One the_program
).
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) convert_argument_1,
String -> Result(One -> One,$A2) convert_argument_2,
String -> Result(One -> One,$A3) convert_argument_3,
String -> Result(One -> One,$A4) convert_argument_4,
String -> Result(One -> One,$A) convert_optional_argument,
$O default_options,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_option,
One -> One recall_syntax,
($A1,$A2,$A3,$A4,List($A),$O) -> One the_program
).
--- That's all for the public part ! --------------------------------------------------
define Bool
is_option
(
String s
) =
if nth(0,s) is
{
failure then false, // actually can never happen
success(c) then c = '-'
}.
*** 1 Mandatory argument.
type ToolBox1($A1,$A,$O):
tb(String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A) cv,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,List($A),$O) -> One prog).
define One
cmd_line /* 1 mandatory argument already read */
(
ToolBox1($A1,$A,$O) tool_box,
$A1 a1,
List($A) oas,
$O opts,
List(String) args
) =
if args is
{
[ ] then prog(tool_box)(a1,reverse(oas),opts), /* everything is ok: execute program */
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,oas,opts1,args1)
}
else if cv(tool_box)(s) is
{
error(f) then f(unique),
ok(a) then cmd_line(tool_box,a1,[a . oas],opts,t)
}
}.
define One
cmd_line /* 0 mandatory argument read */
(
ToolBox1($A1,$A,$O) tool_box,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,opts1,args1)
}
else if cv1(tool_box)(s) is
{
error(f) then f(unique),
ok(a1) then cmd_line(tool_box,a1,[],opts,t)
}
}.
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A) cv,
$O opts,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,List($A),$O) -> One prog
) =
(List(String) args) |->
with tool_box = tb(cv1,cv,read_opt,syntax,prog),
cmd_line(tool_box,opts,args).
*** 2 Mandatory arguments.
type ToolBox2($A1,$A2,$A,$O):
tb(String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A) cv,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,List($A),$O) -> One prog).
define One
cmd_line /* 2 mandatory arguments already read */
(
ToolBox2($A1,$A2,$A,$O) tool_box,
$A1 a1,
$A2 a2,
List($A) oas,
$O opts,
List(String) args
) =
if args is
{
[ ] then prog(tool_box)(a1,a2,reverse(oas),opts),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,oas,opts1,args1)
}
else if cv(tool_box)(s) is
{
error(f) then f(unique),
ok(a) then cmd_line(tool_box,a1,a2,[a . oas],opts,t)
}
}.
define One
cmd_line /* 1 mandatory argument already read */
(
ToolBox2($A1,$A2,$A,$O) tool_box,
$A1 a1,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,opts1,args1)
}
else if cv2(tool_box)(s) is
{
error(f) then f(unique),
ok(a2) then cmd_line(tool_box,a1,a2,[],opts,t)
}
}.
define One
cmd_line /* 0 mandatory argument read */
(
ToolBox2($A1,$A2,$A,$O) tool_box,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s1 . t1] then
if is_option(s1)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,opts1,args1)
}
else if cv1(tool_box)(s1) is
{
error(f) then f(unique),
ok(a1) then cmd_line(tool_box,a1,opts,t1)
}
}.
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A) cv,
$O opts,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,List($A),$O) -> One prog
) =
(List(String) args) |->
with tool_box = tb(cv1,cv2,cv,read_opt,syntax,prog),
cmd_line(tool_box,opts,args).
*** 3 Mandatory arguments.
type ToolBox3($A1,$A2,$A3,$A,$O):
tb(String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A3) cv3,
String -> Result(One -> One,$A) cv,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,$A3,List($A),$O) -> One prog).
define One
cmd_line /* 3 mandatory arguments already read */
(
ToolBox3($A1,$A2,$A3,$A,$O) tool_box,
$A1 a1,
$A2 a2,
$A3 a3,
List($A) oas,
$O opts,
List(String) args
) =
if args is
{
[ ] then prog(tool_box)(a1,a2,a3,reverse(oas),opts),
[s4 . t4] then
if is_option(s4)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,a3,oas,opts1,args1)
}
else if cv(tool_box)(s4) is
{
error(f) then f(unique),
ok(a) then cmd_line(tool_box,a1,a2,a3,[a . oas],opts,t4)
}
}.
define One
cmd_line /* 2 mandatory argument already read */
(
ToolBox3($A1,$A2,$A3,$A,$O) tool_box,
$A1 a1,
$A2 a2,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,opts1,args1)
}
else if cv3(tool_box)(s) is
{
error(f) then f(unique),
ok(a3) then cmd_line(tool_box,a1,a2,a3,[],opts,t)
}
}.
define One
cmd_line /* 1 mandatory argument already read */
(
ToolBox3($A1,$A2,$A3,$A,$O) tool_box,
$A1 a1,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,opts1,args1)
}
else if cv2(tool_box)(s) is
{
error(f) then f(unique),
ok(a2) then cmd_line(tool_box,a1,a2,opts,t)
}
}.
define One
cmd_line /* 0 mandatory argument already read */
(
ToolBox3($A1,$A2,$A3,$A,$O) tool_box,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,opts1,args1)
}
else if cv1(tool_box)(s) is
{
error(f) then f(unique),
ok(a1) then cmd_line(tool_box,a1,opts,t)
}
}.
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A3) cv3,
String -> Result(One -> One,$A) cv,
$O opts,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,$A3,List($A),$O) -> One prog
) =
(List(String) args) |->
with tool_box = tb(cv1,cv2,cv3,cv,read_opt,syntax,prog),
cmd_line(tool_box,opts,args).
*** 4 Mandatory arguments.
type ToolBox4($A1,$A2,$A3,$A4,$A,$O):
tb(String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A3) cv3,
String -> Result(One -> One,$A4) cv4,
String -> Result(One -> One,$A) cv,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,$A3,$A4,List($A),$O) -> One prog).
define One
cmd_line /* 4 mandatory arguments already read */
(
ToolBox4($A1,$A2,$A3,$A4,$A,$O) tool_box,
$A1 a1,
$A2 a2,
$A3 a3,
$A4 a4,
List($A) oas,
$O opts,
List(String) args
) =
if args is
{
[ ] then prog(tool_box)(a1,a2,a3,a4,reverse(oas),opts),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,a3,a4,oas,opts1,args1)
}
else if cv(tool_box)(s) is
{
error(f) then f(unique),
ok(a) then cmd_line(tool_box,a1,a2,a3,a4,[a . oas],opts,t)
}
}.
define One
cmd_line /* 3 mandatory arguments already read */
(
ToolBox4($A1,$A2,$A3,$A4,$A,$O) tool_box,
$A1 a1,
$A2 a2,
$A3 a3,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,a3,opts1,args1)
}
else if cv4(tool_box)(s) is
{
error(f) then f(unique),
ok(a4) then cmd_line(tool_box,a1,a2,a3,a4,[],opts,t)
}
}.
define One
cmd_line /* 2 mandatory argument already read */
(
ToolBox4($A1,$A2,$A3,$A4,$A,$O) tool_box,
$A1 a1,
$A2 a2,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,a2,opts1,args1)
}
else if cv3(tool_box)(s) is
{
error(f) then f(unique),
ok(a3) then cmd_line(tool_box,a1,a2,a3,opts,t)
}
}.
define One
cmd_line /* 1 mandatory argument already read */
(
ToolBox4($A1,$A2,$A3,$A4,$A,$O) tool_box,
$A1 a1,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,a1,opts1,args1)
}
else if cv2(tool_box)(s) is
{
error(f) then f(unique),
ok(a2) then cmd_line(tool_box,a1,a2,opts,t)
}
}.
define One
cmd_line /* 0 mandatory argument already read */
(
ToolBox4($A1,$A2,$A3,$A4,$A,$O) tool_box,
$O opts,
List(String) args
) =
if args is
{
[ ] then syntax(tool_box)(unique),
[s . t] then
if is_option(s)
then if read_opt(tool_box)(opts,args) is
{
error(f) then f(unique),
ok(p) then if p is (opts1,args1) then cmd_line(tool_box,opts1,args1)
}
else if cv1(tool_box)(s) is
{
error(f) then f(unique),
ok(a1) then cmd_line(tool_box,a1,opts,t)
}
}.
public define List(String) -> One
cmd_line
(
String -> Result(One -> One,$A1) cv1,
String -> Result(One -> One,$A2) cv2,
String -> Result(One -> One,$A3) cv3,
String -> Result(One -> One,$A4) cv4,
String -> Result(One -> One,$A) cv,
$O opts,
($O,List(String)) -> Result(One -> One,($O,List(String))) read_opt,
One -> One syntax,
($A1,$A2,$A3,$A4,List($A),$O) -> One prog
) =
(List(String) args) |->
with tool_box = tb(cv1,cv2,cv3,cv4,cv,read_opt,syntax,prog),
cmd_line(tool_box,opts,args).