Theo VerelstA procedure which takes a list of {argument value} tuples preceded by a tcl procedure name and which returns a command formed of that procedure name followed by as many arguments filled in with default value or the supplied value as needed.
proc pro_args { {p} {ar} } {
set o {}
set c 0; set maxc -1
foreach a [info args $p] {
set m {};
foreach j $ar {
if [string match $a [lindex $j 0]] {
set m 1
set arr [lindex $j 1]
set maxc $c
}
}
if {$m == {}} {
if { [info default $p $a b] == 1} {
append o " [list $b]" } {
append o " {}"
}
} {
append o " [list $arr]"
}
incr c
}
set o "$p [lrange $o 0 $maxc]"
return $o
}
So if we have a procedure like this:
proc manyargumented {{a aaaa} {b bbbb} c {d defaultford} {e e} {f f} {g gg}} {
puts "a=$a b=$b c=$c d=$d e=$e f=$f g=$g"
}
We could call it and have only argument g with a different value then default by using:
% pro_args manyargumented {{g thisisargg}}
manyargumented aaaa bbbb {} defaultford e f thisisargg
And calling:
% eval [pro_args manyargumented {{g thisisargg}}]
a=aaaa b=bbbb c= d=defaultford e=e f=f g=thisisargg
For procedures with more than a few arguments it is preferable that the first arguments are the ones statistically requiring non-default arguments most the time. Then the value of pro_args is less needed, so that we can call
% manyargumented newa newsb
But in this case the undefaulted arguments get in the way and generate an error, which pro_args would solve by:
(Theo) 145 % pro_args manyargumented {{a newa} {b newsb} {c somec}}
manyargumented newa newsb somec
(Theo) 145 % eval [pro_args manyargumented {{a newa} {b newsb} {c somec}}]
a=newa b=newsb c=somec d=defaultford e=e f=f g=gg
Of course we could use set definitions for the arguments and their defaults, and allow all kinds of set based lookups and injections to get what we want fo r procedures with a lot of arguments, and reorder during procedure definitions with an eye for the number of arguments we need to type to fullfill the procedure argument requirements.
I plan on using the pro_args or like function in an interactive command line generator,
interactive command composer, which can be powerfully used for
bwise blocks, and which I will extend to a interactive symbolic and graphics supported functional decomposition tool.