Deutsch   English   Français   Italiano  
<103do3k$1s2ei$3@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: Harald Oehlmann <wortkarg3@yahoo.com>
Newsgroups: comp.lang.tcl
Subject: Re: misunderstaning of switch command
Date: Tue, 24 Jun 2025 10:37:08 +0200
Organization: A noiseless patient Spider
Lines: 55
Message-ID: <103do3k$1s2ei$3@dont-email.me>
References: <103dnah$1tams$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Tue, 24 Jun 2025 10:37:08 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="c298b2c3f9e49450bb0b13b061c6e981";
	logging-data="1968594"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19CyOf04NXU/4eH1SQXFzFq"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:htx9jjJrQaZVY8LJmsyEpltG7dc=
In-Reply-To: <103dnah$1tams$1@dont-email.me>
Content-Language: en-GB

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