Tcl Source Code

View Ticket
Login
Ticket UUID: 871387
Title: dict exists throws unexpected error
Type: Bug Version: obsolete: 8.5a0
Submitter: mic42 Created on: 2004-01-06 02:22:24
Subsystem: 15. Dict Object Assigned To: dkf
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2004-01-15 05:10:43
Resolution: Fixed Closed By: dkf
    Closed on: 2004-01-14 22:10:42
Description:
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
User Comments: dkf added on 2004-01-15 05:10:43:

File Added - 73469: dict.patch

dkf added on 2004-01-15 05:10:42:
Logged In: YES 
user_id=79902

I attach the patch I used to fix the fault.

dkf added on 2004-01-15 04:13:52:
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.  :^/

Attachments: