Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Mark Summerfield 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!