2016-03-07 64 views
0

的我有其被定义为以下一个命名空间变量:了解使用Tcl的命名空间变量

namespace eval ::SMB::{ 
     variable SmbInfo 
     ------ 
     ------ 

    proc ::SMB::SmbCreate {name dutport} { 
     variable SmbInfo 
     global DutPorts DutPort_2 DutPorts_3 smb 

     ------ 
     ------ 
     if{"" != [info command SMB::$name]} { 
      return -code error "command name \"$name\" already exists" 
     } 
     set SmbInfo($name -DutPort) $dutport 

我相信新的Tcl和试图了解上面一段代码。几个问题,请纠正我,如果我错了,在任何一点:

  1. 在命名空间在上面定义的变量SmbInfo是越来越由一个在过程SmbCreate声明覆盖。我无法弄清楚什么是该行的目标:

     set SmbInfo($name -DutPort) $dutport 
    

    我可以看到“DutPorts”被定义为全球性,但我找不到“DutPort”。我还没有执行代码。它可能是一个错误?

  2. 是($ name - DutPort)为变量SmbInfo创建数组索引,$ dutport的值是否被设置为该特定数组变量?

  3. 我在文件中类似的代码结构如下图所示

    set SmbInfo($name - SmbSetDmac) [BuildMac1 $SmbInfo($from_name-DutPort)] 
    

    凡BuildMac1是一个过程。上述代码的一点解释也可能使事情变得清晰。

如果我错过了要发布的问题,请指出我,我会编辑我的问题。 在此先感谢。

回答

1
  1. 第二个声明没有重写,它在两种情况下都是相同的变量。
  2. 由于$ name后面的空格,该命令是语法错误。目的似乎是将$ dutport的值分配给名称为“$ name -DutPort”(其中$ name被变量值替换)的SmbInfo成员。
  3. 类似的赋值,但这里的值来自命令的结果。

代码中有一些语法错误,在这里和那里有太多或太少的空间。这个代码似乎不太可能执行。

smb :: SmbCreate命令的用途似乎是:1)在由第一个参数命名的SMB命名空间中创建一个新命令(除非这样的命令已经存在)并且2)将元数据存储在SmbInfo命名空间变量,由a)名称参数和b)关键字(如-DutPort或-SmbSetDmac)索引。

这样的代码基本上实现了一个专门的面向对象的接口。如果解决了空白问题,它应该可以正常工作。

1

你有许多句法问题会引起你很大的悲痛。 Tcl非常关注其语法级别,其中包括空格和换行符的确切位置,以及是否存在{大括号}[括号](如预期的那样)。你必须得到这些东西的权利。

看着您遇到,这条线的问题具体代码:

set SmbInfo($name -DutPort) $dutport 

似乎是极不可能的,因为它是通过三个参数的set命令时只需要一个或两个。我猜你已经得到了你打电话来获得一个数组的一个关键的命令,并因此代码应该是这样的:

set SmbInfo([$name -DutPort]) $dutport 

看到那些[括号]?他们在这里很重要,因为他们说“把我的内容作为一个小脚本运行并使用结​​果”。有了这种解决方案,还有一个问题,即是否可以使用$name -DutPort,但是您只需要在那里输入错误消息。 Tcl通常会给出非常好的错误消息,但有时您必须考虑为什么代码处于传递消息的状态,以便找出实际问题。要知道,通常调试......

我希望有类似问题:

set SmbInfo($name - SmbSetDmac) [BuildMac1 $SmbInfo($from_name-DutPort)] 

和猜想,这实际上应该是:再次

set SmbInfo([$name -SmbSetDmac]) [BuildMac1 $SmbInfo([$from_name -DutPort])] 

请注意,我已经修改的空间遵循现有的模式(我猜是一个属性访问;它看起来像是OTcl或XOTcl)并添加了括号。

最后,这条线:

if{"" != [info command SMB::$name]} { 

也是语法错误,而应是:

if {"" != [info command SMB::$name]} { 

多余的空间问题,因为它分离这是命令名字(if )从作为条件表达式的词开始。该行的其余部分可能是正确的(SMB::$name可能是可疑的,除非您在中使用它,但是您可能只需要info command $name,因为它已经知道您正在使用哪个命名空间,并且您使用的是不合格别名)。

+0

首先断言该命令不存在,然后立即调用它似乎有点奇怪吗? –