Sujet : Re: confused about lists and strings...
De : et99 (at) *nospam* rocketship1.me (et99)
Groupes : comp.lang.tclDate : 02. Jul 2025, 10:53:02
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <1042vhu$3eavg$1@dont-email.me>
References : 1 2 3
User-Agent : Mozilla Thunderbird
On 7/2/2025 2:34 AM, Mark Summerfield wrote:
On Wed, 2 Jul 2025 11:27:54 +0200, Harald Oehlmann wrote:
Am 02.07.2025 um 10:39 schrieb Mark Summerfield:
proc process1 args {
set first [lindex $args 0]
puts "first='$first' args='$args' list? [string is list -strict $args]"
set rest [lrange $args 1 end]
puts "rest='$rest' list? [string is list -strict $rest]"
}
>
The name "args" is special in TCL returning all remaining arguments as a
list.
>
As you call:
process1 $argv
>
The one argument is put in a list. The result is a matrix (list in list).
>
How to solve:
>
a) don't use "args":
>
proc process1 myargs {
set first [lindex $myargs 0]
puts "first='$first' args='$myargs' list? [string is list -strict
$myargs]"
set rest [lrange $myargs 1 end]
puts "rest='$rest' list? [string is list -strict $rest]"
}
>
b) use the delist operator:
>
process {*}$argv
>
Hope this helps,
Harald
Thanks, I hadn't realised that using `args` would give me a list in a list.
I now just pass the list as-is (and called `rest` to avoid confusion!).
This used to confuse me totally. Now I understand (I think) that args and {*} are inverses of each other. If you can get your head around this, then you got it :)
% proc p args {puts [list {*}$args]} ;# so an inverse of an inverse is an identity
% p 1 2 3
1 2 3
% p {1 2 3}
{1 2 3}
% p {1 2 3} {4 5 6}
{1 2 3} {4 5 6}
% p {*}{1 2 3}
1 2 3