The dict exists subcommand shows a behaviour that is
not clearly documented but unexpected, so either this
is a documentation bug or a misfeature/real bug.
I tried to update msgcat.tcl to dicts and stumbled
accross the following:
set Msgs [dict create]
# create a subdict for a locale
dict set Msgs de [dict create]
# create a subdict for a namespace
dict set Msgs de "" [dict create]
# create an entry there
dict set Msgs de "" hello Hallo
# check if a translation exists
dict exists $Msgs fr "" hello
This throws an error if the subdict fr and fr "" does
not exist. I would expect it to simply return 0.
It would be better if it simply returned 0, as there is
no good (and fast) workaround.
The only alternatives are:
set ok 0
set path ""
foreach key {fr "" hello} {
lappend path $key
if {[dict exists $Msgs {expand}$path]} {
set ok 1
} else {
break
}
}
or:
if {[catch {dict exists $Msgs fr "" hello} val]} { ... }
As i think a check for element existance is a common
operation it should not need such complex workarounds
to be useful for nested dicts.
The current behaviour would be more appropriate for
something like a dict exists -strict command variant.
Michael
Logged In: YES
user_id=79902
Hmm. Is it a bug or a misfeature? I've a test (dict-9.5)
checking for exactly this behaviour...
Review of documentation indicates bug. :^/
Logged In: YES
user_id=79902
I attach the patch I used to fix the fault.
unidiff vs. HEAD