[GRASS5] Re: [GRASSLIST:4422] Re: bug fixes for tcltkgrass for GRASS 5.3

Michael Barton michael.barton at asu.edu
Wed Sep 29 16:38:01 EDT 2004


Glynn,

Given your explanation below, it seems that simplest thing is to treat the
few cases where flags are included with the GRASS 5.3 command in a
tcltkgrass module as user options. Then the flags are treated as arguments
that are parsed correctly. I'll try to ferret out which other ones need to
be changed over the weekend and do so.

Michael


On 9/28/04 6:40 PM, "Glynn Clements" <glynn.clements at virgin.net> wrote:

> 
> Michael Barton wrote:
> 
>> Previously these things all worked (except for r.resamp.rst, which is new
>> since I finished the menus late last Spring). I am guessing that changes to
>> the grass parser modules implemented over the summer have caused some of the
>> tcltkgrass modules in 5.3 to fail now.
>> 
>> To the list in general, it seems that a command with a flag will no longer
>> parse correctly in the tcltkgrass modules for 5.3. The odd thing is that
>> other arguments (at least one that I tried) do seem to parse OK. In a number
>> of cases, the flags were included with the command as a convenience.
>> 
>> I can add them as user options in the modules affected (I don't remember
>> which or how many at the moment), but does anyone have a clue why these are
>> not parsing now? The format is:
>> 
>> interface_build {
>>     {s.to.vect -p} 0
>>     {Converts a GRASS sites map to a GRASS vector map.}
>>     {entry input {Name of input site list:} 0 sites}
>>     {entry output {Name of new vector file:} 0 vector}
>>     {entry cat {String field in site_list to use in vector file
>> (default=1):} 0 ""}
>> }
>> 
>> It seems that the command string in brackets {s.to.vect -p} ought to parse
>> OK. Quoting it seems redundant. Any thoughts?
> 
> I suspect that something is using "list" instead of "concat", e.g.:
> 
> % set cmd {s.to.vect -p}
> % set arg foo
> % foreach word [list $cmd $arg] {puts $word}
> s.to.vect -p
> foo
> % foreach word [concat $cmd $arg] {puts $word}
> s.to.vect
> -p
> foo
> 
> Were there some changes made to deal with arguments which contain
> spaces? That could explain it.
> 
> In order for commands with arguments in the module description to
> work, the command (lindex $description 0) needs to be treated as a
> list. But in order for arguments with spaces to work, they must be
> treated as a single word.
> 
> E.g.:
> 
> % set cmd {s.to.vect -p}
> % set arg {foo bar}
> % foreach word [list $cmd $arg] {puts $word}
> s.to.vect -p
> foo bar
> % foreach word [concat $cmd $arg] {puts $word}
> s.to.vect
> -p
> foo
> bar
> 
> The first is wrong, because it doesn't split the command. The second
> is wrong because it splits the argument. You need to use concat but
> "wrap" the argument:
> 
> % foreach word [concat $cmd [list $arg]] {puts $word}
> s.to.vect
> -p
> foo bar
> 
> However, the 5.3 tcltkgrass is so complex that I'm not even going to
> try to figure out what needs to be changed where. Also, essentially
> the same problem can occur in lots of different ways (e.g. lappend,
> append, eval, subst "$foo $bar", etc).
> 
> It's an inherent consequence of the fact that, in Tcl, everything is a
> string (a list of strings is simultaneously both a string and a list
> of strings).
> 
> Also, the use of variables whose values are variable names tends to
> result in incomprehensible code; unfortunately, the 5.3 version of
> tcltkgrass does a lot of that.

______________________________
Michael Barton, Professor of Anthropology
School of Human Diversity and Social Change
Arizona State University
Tempe, AZ  85287-2402
USA

voice: 480-965-6262; fax: 480-965-7671
www: http://www.public.asu.edu/~cmbarton




More information about the grass-dev mailing list