Проверьте, существует ли матричный объект в TCL - PullRequest
1 голос
/ 16 апреля 2019

Я хочу проверить, существует ли объект tcl-matrix . Как я могу это сделать?

Следующий код не работает.

package require struct::matrix

# Test (now we expect 0)
info exists m
# Create the object
struct::matrix m

# Test again, now I expect 1, however it returns 0!!!
info exists m

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Используйте info commands для проверки существования матричного объекта.info exists тесты на (не) существование переменных.

% package req struct::matrix
2.0.3
% info commands m
% struct::matrix m
::m
% info commands m
m

Фон

Матричный объект реализован в виде команды Tcl (точнее, псевдонима) плюс пространство имен Tcl для каждой матрицы (как хранилище).

В качестве альтернативы, но это во многом зависит от текущей реализации, вы можете проверить существование так называемого пространства имен:

% package req struct::matrix
2.0.3
% namespace exists m
0
% struct::matrix m
::m
% namespace exists m
1

Тестирование команды также продолжит работать, когда объект матрицы перезапустится.реализованный как объект TclOO, например.

0 голосов
/ 17 апреля 2019

Немного перелистывая исходный код struct :: matrix :

% package req struct::matrix
2.0.3
% set m [struct::matrix]
::matrix1
% expr {$m in [interp aliases]}
1
% string first MatrixProc [interp alias {} $m]
18
% proc is_matrix {name} {
    expr {
         $name in [interp aliases] &&
         [string first MatrixProc [interp alias {} $name]] != -1
    }
}
% is_matrix $m
1

Если вы используете форму struct::matrix m, тогда вместо $m используйтеполностью квалифицированный ::m

% struct::matrix m
::m
% is_matrix m
0
% is_matrix ::m
1
...