Короче, эта штука гоняет меня по кругу. Tcl 9.0 на Arch, tclsh main.tcl, небольшой отчёт по заказам для сайта клиента, который торгует хозтоварами для строительства.
У меня в config.tcl было одно правило (total >= 200), и всё работало. Потом я добавил второе правило, чтобы заказы с комментарием клиента тоже помечались:
set ::flag_rules {
{total >= 200}
{note ne {}}
}
Теперь прогон падает где-то посередине с invalid command name "Dana". Трейс указывает на строку с expr в rule_match:
proc rule_match {row rule} {
lassign $rule field op value
set have [dict get $row $field]
return [expr "\"$have\" $op \"$value\""]
}
"Dana" нигде в моём коде не команда. Она в данных. В orders.tsv у одного из крупных заказов такой комментарий:
1003 Petrakis Plumbing 1250.75 call [Dana] before shipping
Остальные комментарии (например, "leave at side door") проходят нормально. Я напечатал dict строки прямо перед падением, и он выглядит совершенно обычно. Табы разделили правильно, все четыре поля на месте, комментарий цел. Так что я час копался в load_orders, уверенный, что в экспорте клиента какая-то странная кодировка или лишний байт. Проверил в Neovim через :set list, табы выглядят как табы. (Кстати, почему в их экспорте у строк с пустым комментарием стоит хвостовой таб, а у 1005 нет? Другая проблема, другой день.)
Чего я не понимаю: как строка, лежащая в dict, превращается в вызов команды? Ничего же её не eval'ит. Почему только эта строка?