Tcl: элемент списка в фигурных скобках, за которым следует «]]» вместо пробела

#tcl

#tcl

Вопрос:

Ошибка: элемент списка в фигурных скобках, за которым следует «]]» вместо пробелов

Код:

 create_pattern  -layers  { [list [list {vertical_layer: m12} [list width: $m12_width] [list pitch: $m12_pitch] {spacing: interleaving}  {trim: false } {track_alignment: track}]] 
[list [list {vertical_layer: m11} [list width: $m11_width] [list pitch: $m11_pitch] {spacing: interleaving}  {trim: false } {track_alignment: track}]] 
}
  

Комментарии:

1. Самые внешние фигурные скобки препятствуют замене переменных. Возможно, вы захотите create_pattern -layers [list ...]

Ответ №1:

Проблема, с которой вы столкнулись, заключается в том, что вы заключили всю эту конструкцию списка в фигурные скобки, что превращает ее во что-то другое (что вам, вероятно, не нужно; анализатор буквального списка обрабатывает [list как фактическое слово списка и путается, }]] поскольку это намеренно глупый код, чтобы он также был предсказуемым кодом). Объем вложенности, который происходит, довольно запутанный и явно неожиданный.

Я предполагаю, что вам было бы лучше использовать вспомогательную процедуру для генерации структуры компонента, а затем использовать это:

 proc LayerDescriptor {id width pitch} {
    # I'm not sure that this is right, but it would be a lot less surprising than a list of lists of lists of things
    return [list 
        [list vertical_layer: $id] 
        [list width: $width] 
        [list pitch: $pitch] 
        {spacing: interleaving} 
        {trim: false } 
        {track_alignment: track}]
}

create_pattern -layers [list 
    [LayerDescriptor "m12" $m12_width $m12_pitch] 
    [LayerDescriptor "m11" $m11_width $m11_pitch]]
  

Обратите внимание на использование обратной косой черты для цитирования всех новых строк. Они здесь важны.

Комментарии:

1. для m12 это работает, но если я хочу горизонтальный слой для m11. например, я хочу написать код: create_pattern -layers { [список [список {вертикальный слой: m12} [ширина списка: $ m12_width] [шаг списка: $ m12_pitch] {интервал: чередование} {обрезка: false } {выравнивание дорожки: track}]] [список [список {horizontal_layer: m11} [ширина списка: $ m11_width] [шаг списка: $ m11_pitch] {интервал: чередование} {обрезка: false } {выравнивание дорожки: track}]] }