У меня есть функция c (dbread), которая читает «поля» из «базы данных». Большинство этих полей являются однозначными; но иногда они многозначны. Итак, у меня был код c, в котором говорилось
if valcount == 1
return string
else
make list
foreach item in vals
append to list
return list
Потому что я думал, что большую часть времени люди хотят скаляр.
Однако это приводит к некоторым странным ошибкам синтаксического анализа. В частности, если я хочу добавить значение
set l [dbread x] # get current c value
lappend l "extra value" # add a value
dbwrite x {*}$l # set it back to db
Если x имеет единственное значение, и это значение содержит пробелы, lappend анализирует неправильно. Я получаю список с 3 элементами, а не с 2. Я вижу, что это потому, что ему передается что-то, что не является списком, и он анализирует его в список и видит 2 элемента.
set l "foo bar"
lappend l "next val" # string l is parsed into list -> [list foo bar]
поэтому я получаю [list foo bar {next val}]
В любом случае, решение состоит в том, чтобы заставить dbread всегда возвращать список, даже если есть только один элемент. У меня вопрос - есть ли в этом минус? Есть ли сюрпризы для случая 90%, когда люди ожидают скалярное значение?
Альтернативой было бы сделать мой собственный алгоритм, который проверяет llength == 1 и особые случаи.