У меня есть функция переменного тока (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% случаев, когда люди ожидают скаляр
Альтернативой будет сделать мой собственный lappend, который проверяет llength == 1 и в особых случаях это