2016-03-07 90 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

首先斷言該命令不存在,然後立即調用它似乎有點奇怪嗎? –