Импорт переменной proc в пространство имен - PullRequest
1 голос
/ 13 октября 2009
proc foo {param} {
  namespace eval foo_ns {
     uplevel {set foo_ns::x $param }
  }
}

Это выглядит ужасно.

[upvar] не будет работать, поскольку он не может ссылаться на «param».

Спасибо.

Код из ответов не работает (tclsh8.4)

-------------------------------------------

% proc bar {param} {
    namespace eval foo_ns {
      uplevel [list set foo_ns::x $param]
    }
  }
% bar 123
can't read "param": no such variable

-------------------------------------------

% proc foo {param} {
    set ::foo_ns::x $param
}
% foo 123
can't set "::foo_ns::x": parent namespace doesn't exist

Ответы [ 3 ]

4 голосов
/ 13 октября 2009

Что не так с:

proc foo {param} {
    set ::foo_ns::x $param
}

В моем тесте, похоже, для достижения той же цели.

Обновление: спасибо K0re за указание на это. Перед вызовом foo необходимо определить пространство имен:

namespace eval ::foo_ns {}
2 голосов
/ 15 октября 2009

Пространства имен и уровни - это две разные вещи. Вам не нужно повышать уровень для этой проблемы.

Вот простое решение, которое создает пространство имен и устанавливает переменную в одну строку:

proc foo {param} {
    namespace eval ::foo_ns [list set x $param]
}
1 голос
/ 14 октября 2009

Хорошо, у вас две разные проблемы. Во-первых, пространство имен еще не существует; во-вторых, вам нужно написать код, чтобы переменная создавалась / записывалась в это пространство имен. В целом, для этого требуется лишь небольшая модификация кода Хая:

proc foo {param} {
    # Create the namespace if it doesn't already exist
    namespace eval ::foo_ns {}
    # Set the variable in the namespace
    set ::foo_ns::x $param
}

В качестве комментария к некоторым проблемам, которые у вас были:

proc foo {param} {
  namespace eval foo_ns {
     uplevel {set foo_ns::x $param }
  }
}

Это не работает, потому что вы, по сути, говорите следующее: в пространстве имен "foo_ns" запустите следующий код: на верхнем уровне стека запустите следующий код: "set foo :: x $ param"

Однако на верхнем уровне стека переменная «param» не имеет значения (она определена только в процедуре. Вам нужно заранее убедиться, что она заменена. Я бы включил код, который будет работать, но Честно говоря, я боюсь, что это приведет к путанице с фактическим ответом на вопрос ... так что я его опущу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...