Как правильно сравнивать два списка в TCL?

Я новичок в TCL, и я написал следующий код:

set list1 {{1 2} 3 4}
set list2 {{1 2} 8 1}
if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"}

Но когда я печатаю элементы подсписка, я вижу, что они равны, но оператор if этого не улавливает. Почему? Как я должен исправить это сравнение?


person Narek    schedule 04.03.2011    source источник
comment
В качестве примечания используйте eq для сравнения этих элементов, а не == (что на самом деле является только числовым равенством).   -  person Donal Fellows    schedule 05.03.2011


Ответы (3)


Если бы мне нужно было реализовать процедуру lequal, я бы начал с этого:

proc lequal {l1 l2} {
    foreach elem $l1 {
        if {$elem ni $l2} {return false}
    }
    foreach elem $l2 {
        if {$elem ni $l1} {return false}
    }
    return true
}

А затем оптимизируйте это:

proc K {a b} {return $a}

proc lequal {l1 l2} {
    if {[llength $l1] != [llength $l2]} {
        return false
    }

    set l2 [lsort $l2]

    foreach elem $l1 {
        set idx [lsearch -exact -sorted $l2 $elem]
        if {$idx == -1} {
            return false
        } else {
            set l2 [lreplace [K $l2 [unset l2]] $idx $idx]
        }
    }

    return [expr {[llength $l2] == 0}]
}
person glenn jackman    schedule 04.03.2011
comment
Почему вы сравниваете их как независимые от порядка? Это хорошее сравнение, но не то, что я бы назвал равенством списков. Ваша версия похожа на то, что равенство строк должно соответствовать team==mate - person Andy Dent; 07.05.2012

Я бы сделал:

# from tcllib
package require struct::list


if {[::struct::list equal $list1 $list2]} { puts "Lists are equal"}
person schlenk    schedule 04.03.2011

Они не равны, и вы правильно проверяете это. Уверены, что печатаете правильные переменные?

РЕДАКТИРОВАТЬ: Поведение для меня.

# cat test.tcl
set list1 {{1 2} 3 4}
set list2 {{1 2} 8 1}
if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"}
# tclsh test.tcl
They are equal!
#
person Erik    schedule 04.03.2011
comment
Извините, пример не тот :)! Я печатаю то, что сравниваю, и вижу, что они равны. - person Narek; 04.03.2011