Hamish wrote:
oh, and FWIW I figured out why my tcl exec solution was failing with:
ERROR: region <> not found
It was trying to run `g.region ""` (expands to `g.region region=""`)
It's redundant now, but for the record adding a "concat" fixed it:
-set regcmd [list exec "g.region" "-ug" $args]
+set regcmd [list exec "g.region" [concat "-ug " $args]]
set retval [catch $regcmd result]
This is bogus. It will fail if $args isn't empty:
% set args {foo bar baz}
% set regcmd [list exec "g.region" [concat "-ug " $args]]
% puts $regcmd
exec g.region {-ug foo bar baz}
% set args foo
% set regcmd [list exec "g.region" [concat "-ug " $args]]
% puts $regcmd
exec g.region {-ug foo}
IOW, the entire list of arguments (including the "-ug") will be passed
to g.region as a single argument.
I'm guessing that you're focusing on the case where $args is empty:
% set args ""
% set regcmd [list exec "g.region" "-ug" $args]
% puts $regcmd
exec g.region -ug {}
% set args ""
% set regcmd [list exec "g.region" [concat "-ug " $args]]
% puts $regcmd
exec g.region -ug
If so, the correct fix is:
set regcmd [concat exec g.region -ug $args]
E.g.:
% set args ""
% set regcmd [concat exec g.region -ug $args]
% puts $regcmd
exec g.region -ug
% set args foo
% set regcmd [concat exec g.region -ug $args]
% puts $regcmd
exec g.region -ug foo
% set args {foo bar baz}
% set regcmd [concat exec g.region -ug $args]
% puts $regcmd
exec g.region -ug foo bar baz
NOTE: if a procedure's last formal argument is named "args", it is
treated specially: $args will be a list containing all of the
remaining arguments. This allows variadic procedures to be
implemented.
If you are passing a list of arguments as a list (rather than as
individual arguments), use a name other than "args". Otherwise, the
list will get "wrapped" inside another list.
Only use "args" as an argument variable if the procedure is supposed
to be variadic.
--
Glynn Clements <glynn@gclements.plus.com>