感受 Tcl ...
===================================================================================
Tcl foreach
http://www.blueantstudio.net/scriptnet/ssdn/tcl/tcltrain/tcl_ctrl_circle.htm
Tcl 的 foreach 真的很强大, 上面链接里的两种语法形式都很有用,
拿 Tcl 跟 Prolog 比, 在 Prolog 里, 你想把一个list 的所有元素,
从尾到头的重新组成新的list, 虽然也是几行代码,可是在Prolog 里,需要很强的逻辑性,
而在Tcl 中, 你只要掌握了 foreach 的语法就很容易理解,只要很少的代码
---------------------------------------------------------------------------------------
set a [list 1 2 3 4 5 6 7]
set b ""
foreach i $a {set b [linsert $b 0 $i]}
puts $b
输出:
7 6 5 4 3 2 1
------------------------------------------------------------------------------------
而且要在Prolog 里把两个list 的元素 按一定的顺序混合成一个新的元素,
除了递归还是递归,思路要是一步不清楚了,就会栈溢出,
而在Tcl 中,竟然这么简单
----------------------------------------------------
set x {}
foreach i {a b c} {j k} {d e f g} {
lappend x $i $j $k
}
这时总共有三次循环,x的值为"a d e b f g c {} {}"
但是这么用foreach 稍微有一点不容易理解
这里的 i 是指得 list {a b c} 里的每一项
j k 指得是 {d e f g} 里的每两项
这三行代码就是说, 拿 {a b c} 里的每一项 加上{d e f g} 里的每两项
-----------------------------------------------------
要在 java 里实现这个 真的很不容易
----------------------------------------------------------------------------------------------
Tcl 里的另一个 很强大的 foreach 例子
set a "abc def ghi
xyz"
foreach i $a {
puts "$i"
}
输出是:
-------------------------------------------
abc
def
ghi
xyz
-------------------------------------------
==================================================================
tcl switch
下面是个简单的tcl 的 switch 应用
--------------------------------------------------------------------------------------
set x "002"
switch $x {
"001" {puts "Montag" }
"002" {puts "Dienstag" }
"003" {puts "Mittwoch" }
"004" {puts "Donnerstag" }
"005" {puts "Freitag" }
"006" {puts "Samstag" }
"007" {puts "Sonntag" }
"default" {puts "$x is NOT A MATCH"}
}
输出: Dienstag
----------------------------------------------------------------------------------------------
这种情况在c,c++,java 里想都不要想,在java 里只能这么实现, c, c++ 里语法都跟这个差不多
都是只能用整数和字符,
----------------------------------------------------------------------------------------------
public class SwitchTest {
public static void main(String args[]) {
int zahl;
zahl = -2;
switch (zahl) {
case 1:
System.out.println("Montag");
break;
case -2:
System.out.println("Dienstag");
break;
case 3:
System.out.println("Mittwoch");
break;
case 4:
System.out.println("Donnerstag");
break;
case 5:
System.out.println("Freitag");
break;
case 6:
System.out.println("Samstag");
break;
case 7:
System.out.println("Sonntag");
break;
default:
System.out.println("Eingabe ist falsch.");
}
System.exit(0);
}
}
输出: Dienstag
----------------------------------------------------------------------------------------------
真的是每个语言都有它的适用性和优缺点,
想当初写稍微复杂点的单个程序里用switch 语句少写一个break 结果还找了半天找不到错在那里,
如果不用switch 就只能用 if else if else
==================================================================
tcl 函数
==================================================================
tcl 里有一个很灵活的用法,就是可以跟返回一个整数一样返回一个含有任何基本数据类型的字符串的数组,
而且有两种返回的方法,
一是返回一个 list
二是返回一个以任何字符串为key 任何字符串为value 的一个array.
==================================================================
最不习惯的几点
一 变量前加美元符号,不过想想如果变量前加欧元符号那会更不习惯,
二 每个元素之间都要有空格, 比如写成 while{$x<5} 就出错,必须写成 while _{$x<5}
_这里代表空格
三 参数之间不用逗号分开, 用空格分开
四 elseif 不分开
五 我错了无数次的到现在还没改掉的 几个例子
if () { } 错 ===========> 参数应该在大括号里 if { } { }
if { } {
}else { } 错, else 跟 前面的大括号中间没有加空格,
if { } { }
else { } 错, if 语句的结尾的大括号要跟 else 在同一行上,
============> 应该是
if { } {
} else { }
还有呢,
set a 10
if { a > 0} {
puts "a>0"
} else {
puts "a<0"
}
还错, 为什么呢, if 的条件应该这么写 $a >0
缺点
-----------------------------------------------
没有类型, 这个是缺点也是优点,缺点是不支持复杂的数据类型, 优点呢太多了
举个缺点的例子吧
不过就像蜘蛛侠里说的,能力越大责任也越大, 在 Tcl 里也是, 如果不注意随心而写,
很可能写出来的程序很难维护,甚至是自己写的代码,
如果你这写这么一个函数
proc , countryName {
set systemTime [clock seconds]
puts "the time of $countryName now is :[clock format $systemTime -format {%Y-%m-%d %H:%M:%S}]"
}
在调用时写这么一行
----------------------------------------------
, china
----------------------------------------------
然后输出是:
---------------------------------------------
the time of china now is :2007-01-15 23:11:16
--------------------------------------------
如果你看到 下面一堆, 你会不会马上头就大了呢,这是写作文呢,还是学英语呢,
---------------------------------------------
, america
, china
--------------------------------------------
怎么看都不像代码,所以说,如果你的tcl 代码大概有一两百行的话,慢慢分析还能看懂,
如果到一两千行,分析起来就很麻烦了,
可是越是用tcl 熟练的人, 越是会起这种古怪的名字,这个是tcl 的一个缺点,
但绝对也是个能让人去炫耀的东西, 怎么样,你不是会 tcl 吗,但我的程序你就是看不懂。
==================================================================
很好的一个练习工具是 TclTutor
http://www.msen.com/~clif/TclTutor.html
下面是几个讲解 tcl 的网站
http://www.tclchina.com/column/tools.htm
http://www.blueantstudio.net/scriptnet/ssdn/tcl/tcl_train.htm
不过最好的还是, man page,
http://tmml.sourceforge.net/search.php
Tcl/Tk 安装,
windows 下直接安装就可以了
http://www.activestate.com/store/download.aspx?prdGUID=f0cd6399-fefb-466e-ba17-220dcd6f4078
Tcl/tk download
http://www.activestate.com/store/download.aspx?prdGUID=f0cd6399-fefb-466e-ba17-220dcd6f4078=tcl8414-src.zip&5874443
Visual Tcl
http://vtcl.sourceforge.net/?x=screen
download
http://sourceforge.net/project/showfiles.php?group_id=285&package_id=304&release_id=178864
Windows XP and NT
* Download and install Visual Tcl from the projet download page, you should grab the newest release.
* My file was named: tcl-1.6.0.tar.gz
* Unpack the file. In my case, I used WinZip to extract to: c:/
* Rename c:/vtcl-1.6.0 to c:/vtcl
* Go into your vtcl directory and double-click on "vtcl.tcl" icon.
TclPro
http://www.tcl.tk/software/tclpro/
download
http://www.tcl.tk/software/tclpro/eval/1.4.html