Posted to tcl by CecilWesterhof at Tue Jul 24 16:47:46 GMT 2018view pretty

I have the following code:
proc balancedBrackets {string brackets} {
    if {[expr {[string length $string] % 2}]} {
        return 0
    }
    set closeBrackets [dict values ${brackets}]
    set stack         {}

    foreach ch [split ${string} {}] {
        if {[dict exists ${brackets} ${ch}]} {
            lappend stack [dict get ${brackets} ${ch}]
            puts "push: ${ch}"
        } elseif {[lsearch ${closeBrackets} ${ch}]} {
            if {[lindex ${stack} end] ne ${ch}} {
                puts "Wrong value: #${stack}#${ch}#"
                return 0
            }
            set stack [lrange ${stack} 0 end-1]
            puts "pop:  ${ch}"
        } else {
            error "Wrong character: ${ch}"
        }
    }
    return [expr {[llength ${stack}] == 0}]
}


I set brackets with:
set brackets [dict create \{ \} \[ \] \( \)]

The following works without a problem:
puts [balancedBrackets "()"             ${brackets}]
puts [balancedBrackets "\[]"            ${brackets}]

They give:
push: (
pop:  )

and:
push: [
pop:  ]

But when I try:
puts [balancedBrackets "{}"             ${brackets}]

I get:
push: {
Wrong character: }

What am I doing wrong?