2009-07-30

執行程式

Tcl 使用 exec 來執行外部程式:

set var [list rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,@0,2]
exec {*}$var

這裡使用 {*} 和 exec 結合的範例。

2009-07-17

math function

在 Tcl 8.5 以前,Tcl 的數學運算都是透過 expr 這個 command 做到的,而在 8.5 則引進了 tcl::mathfunc,讓使用一些數學運算的 function 上可以更直覺,使用上也更簡單。

如果不想寫一堆很長的 name space path,可以這樣做:

namespace path {::tcl::mathop ::tcl::mathfunc}
所以我們就可以這樣做:

srand [clock seconds]
這樣不管是撰寫程式還是讀 code 的時候,看起來都比較具可讀性。


另外,8.5 同時也 export 出來一些運算子(tcl::mathop)。
puts [* [sqrt 49] [+ 1 2 3]]
也就是,看起來會是類似 lisp 的前序式運算法。

2009-07-16

Access global variables in proc

在 procedure 裡存取全域變數,有二種做法:

1. 使用 global 命令宣告要存取的全域變數
2. 在 Tcl 支援 name space 之後,可以使用 name space 的表達方式(::)來存取變數
set x 0

proc appendMe {number} {
global x
incr x $number
}

proc appendMe2 {number} {
incr ::x $number
}

appendMe 3
puts $x

上面就是這二種方式的說明。

2009-07-15

Tcl/Tk 與編碼 (Encoding)

關於 Tcl 的編碼,可以分為二部份,一部份是 Tcl/Tk 直譯器本身支援的編碼,一部份是使用者的 Tcl script file 所使用的編碼。

首先是使用者的 Tcl script file 所使用的編碼,可以用下列的方法來指定:
tclsh.exe -encoding [編碼方式] [檔案]
wish.exe -encoding [編碼方式] [檔案]

我們可以使用下面的方式來查詢目前 Tcl/Tk直譯器本身所支援的編碼方式:
encoding names

例如用 Tclkit 來查詢,就可以得到他目前支援的編碼方式:
iso8859-2 iso8859-15 utf-8 ascii cp1252 macRoman koi8-r identity unicode iso8859-1

所以 Tclkit 不支援 BIG5... 如果需要的話要自己加上去。

2009-07-11

GetHomeDir

在 Windows,我們可以透過謮取 registry 和環境變數拿到使用者的 My Documents. 下面是來自於 Tcler' Wiki 的 code,只是我自己有小修改一些,好符合我自己的環境。
proc GetHomeDir { } {
global env

# Check if we're using windows
if { [expr [string compare "$::tcl_platform(platform)" "windows" ] == 0] } {
package require registry 1.0

set env_home [registry get {HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders} {Personal}]
set userprofile [set env(USERPROFILE)]
regsub -all {[%]USERPROFILE[%]} $env_home $userprofile env_home
} else {
set env_home $env(HOME)
}

return $env_home
}

另外,如果要刪除 Opera 在 UserProfile 下的 cookie,可以這樣做:
set CookieFile [set env(USERPROFILE)]
append CookieFile {\Application Data\Opera\Opera\profile\cookies4.dat}

if {[file exists $CookieFile]==1} {
file delete $CookieFile
}

因為 AVG 會對這裡一直警告(即使我關掉 Cookie),所以要寫一個小程式殺掉檔案,避免他一直警告(不過話說回來,我已經不用 AVG 了)。