Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: et99 Newsgroups: comp.lang.tcl Subject: Re: confused about lists and strings... Date: Wed, 2 Jul 2025 02:53:02 -0700 Organization: A noiseless patient Spider Lines: 60 Message-ID: <1042vhu$3eavg$1@dont-email.me> References: <1042r7u$3dr0l$1@dont-email.me> <1042u2q$3eaoi$1@dont-email.me> <1042uek$3dr0l$2@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 02 Jul 2025 11:53:02 +0200 (CEST) Injection-Info: dont-email.me; posting-host="048938ceb69a34314b69bf9c47160de4"; logging-data="3615728"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18m7kWhRzyfB9qCjcIxG2lV" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:8QrjV5/8/sKp/kV2sh9AUQ+HDUA= In-Reply-To: <1042uek$3dr0l$2@dont-email.me> Content-Language: en-US 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