Deutsch   English   Français   Italiano  
<103dom1$1tams$2@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Mark Summerfield <m.n.summerfield@gmail.com>
Newsgroups: comp.lang.tcl
Subject: Re: misunderstaning of switch command
Date: Tue, 24 Jun 2025 08:46:57 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 56
Message-ID: <103dom1$1tams$2@dont-email.me>
References: <103dnah$1tams$1@dont-email.me> <103do3k$1s2ei$3@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Injection-Date: Tue, 24 Jun 2025 10:46:57 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="a2fd230b69efee73973f83cd7be3696e";
	logging-data="2009820"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18iffW6NaPITld66qqx3HoW"
User-Agent: Pan/0.154 (Izium; 517acf4)
Cancel-Lock: sha1:31hAC8woFnu1ZvfMsBgItpCQvd0=

On Tue, 24 Jun 2025 10:37:08 +0200, Harald Oehlmann wrote:

> Am 24.06.2025 um 10:23 schrieb Mark Summerfield:
>> I have a switch command which is doing something I don't expect but I
>> don't understand what I've done wrong. In this example the default is
>> always executed but I expect the case before that to be executed.
>> 
>>      const UNCOMPRESSED U const ZLIB_COMPRESSED Z const SAME_AS_PREV =
>>      set filename somefile.txt set action "added"
>>      set kind Z switch $kind {
>>          $::SAME_AS_PREV { puts "unchanged \"$filename\"" }
>>          $::UNCOMPRESSED { puts "$action \"$filename\"" }
>>          $::ZLIB_COMPRESSED { puts "$action \"$filename\" (zlib
>> compressed)" }
>>          default { puts "!!!!!!!! UNEXPECTED !!!!!!!!" }
>>      }
>> 
>> What am I doing wrong?
> 
> Nothing wrong. Tcl is just different, sorry for that.
> 
> The "{" always avoids expansion of variables and commands. If you want
> to use variables in the switch, you have to avoid the "{".
> 
>      switch -exact -- $kind [list\
>            $::SAME_AS_PREV { puts "unchanged \"$filename\"" }\
>            $::UNCOMPRESSED { puts "$action \"$filename\"" }
>            $::ZLIB_COMPRESSED { puts "$action \"$filename\" (zlib
> compressed)" }\
>            default { puts "!!!!!!!! UNEXPECTED !!!!!!!!" }\
>            ]
> 
> Nevertheless, this is no fun on the quoting level (backslashes at the
> end etc). In addition, you have to take care, when the variable
> expansion happens. This might be tricky.
> 
> I personally would write it like that:
> 
>        switch -exact -- $kind {
>            = { # SAME_AS_PREV
>                puts "unchanged \"$filename\""
>            }
>            U { # UNCOMPRESSED
>                puts "$action \"$filename\""
>            }
>            Z { # ZLIB_COMPRESSED
>                puts "$action \"$filename\" (zlib compressed)"
>            }
>            default { puts "!!!!!!!! UNEXPECTED !!!!!!!!" }
>        }
> 
> Harald

Thanks that works great.

Bit of a disinsentive to use consts though!