Диктофон TCL из другого источника - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь использовать команду [dict] в TCL.Следующий код работает безупречно, если я использую его в том же локальном файле без пространства имен ixc и с процессами в том же файле.

Однако, если я пытаюсь использовать его в исходном файле - он полностью освобождает от ответственности

rawrIxc.tcl

namespace eval ixc {
}

proc ixc::add2Dict {var1 var2 var3 var4} {
variable $var1
puts "ixc:: $var1 $var2 $var3 $var4" ;#Debug in console, shows passed params
dict set $var1 $var2 $var3 $var4
}

proc ixc::getFromDict {var1 var2 var3} {
variable $var1
puts "something: $var1 $var2 $var3"
dict get $var1 $var2 $var3
}

rawrSiteButtons.tcl

Добавляет данные в словарь.Я предполагаю

ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic" ;#Button text "comic"
ixc::add2Dict "button" "comic" "buttonUrl" "/comic" ;#Button URL
ixc::add2Dict "button" "comic" "buttonSymbol" "%1" ;#Actual button ID -- used in mapping
ixc::add2Dict "button" "comic" "urlSymbol" "%_1"]" ;#Button replacement symbol -- used in mapping

Однако, когда я сейчас пытаюсь вызвать данные из словаря со следующим

set buttons(comicText) [ixc::getFromDict $button comic buttonText]
set buttons(comicUrl) [ixc::getFromDict $button comic buttonUrl]
set buttons(comicSymbol) [ixc::getFromDict $button comic buttonSymbol]
set buttons(comicUrlSymbol) [ixc::getFromDict $button comic urlSymbol]

, я получаю:

can't read "button": no such variable
    while executing
"ixc::getFromDict $button comic buttonText"
    (procedure "loadSiteButtons" line 41)

, даже если яиспользуйте:

variable button

Я пробовал upvar, переменную и пространство имен upvar [текущее пространство имен] и теперь не знаю, куда идти.Любая помощь будет прекрасна.Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Гленн уже предоставил рабочие решения, но для полноты можно также учесть следующее:

(1) Из proc вы можете использовать переменную команда:

proc someProc {} {
  variable ::ixc::button
  ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"
  ixc::getFromDict $button
}

(2) На верхнем уровне и в вашем интерактивном сеансе оболочки Tcl (но также и внутри proc, в качестве альтернативы) используйте upvar чтобы создать ссылку на переменную пространства имен из текущей области.

upvar "#0" ::ixc::button button
ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"
ixc::getFromDict $button

См. также этот ответ: TCL вызывает переменную пространства имен из proc вне пространства имен

0 голосов
/ 24 февраля 2019

Когда вы делаете это:

ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"

процедура add2Dict устанавливает переменную пространства имен с именем button.

Так что, когда вы вызываете getFromDict, вынеобходимо указать пространство имен переменной:

set buttons(comicText) [ixc::getFromDict $ixc::button comic buttonText]

Или выполнить всю команду из пространства имен:

set buttons(comicText) [namespace eval ixc {getFromDict $button comic buttonText}]

Второй взгляд на это: ваши вызовынемного по-другому:

  • процедура add2Dict принимает переменную name в качестве первого параметра, но
  • процедура getFromDict принимает словарь значение в качестве первого параметра.

Вы можете немного изменить процедуру getFromDict, чтобы в качестве имени переменной использовался «buttom»:

proc ixc::getFromDict {var1 var2 var3} {
    variable $var1
    puts "something: $var1 $var2 $var3"
    dict get [set $var1] $var2 $var3
    # .......^^^^^^^^^^^ -- one argument form of `set` to get the value.
}

затем

set buttons(comicText) [ixc::getFromDict button comic buttonText]
# .......................................^^^^^^
...