在TCL中创建函数
有人能帮我做TCL编程吗,我是TCL新手在TCL中创建函数,tcl,Tcl,有人能帮我做TCL编程吗,我是TCL新手 我想创建如下函数 employee_data Name() Dept() Tasks() ... 假设我需要从上面的函数执行,比如employee\u data Name()Tasks()… 这里我想跳过Dept()参数 我试图创建类似的函数,但没有成功 proc employee_data { Name (A B C....) Dept (a b c....) Tasks (s d f...) } employee_
我想创建如下函数
employee_data Name() Dept() Tasks() ...
假设我需要从上面的函数执行,比如employee\u data Name()Tasks()…
这里我想跳过Dept()
参数
我试图创建类似的函数,但没有成功
proc employee_data {
Name (A B C....)
Dept (a b c....)
Tasks (s d f...)
} employee_data;
proc employee_data { Name($A $B $C) Dept($a $b $b) Tasks ($s $d $f) } {
Body...
}
非常感谢。我认为基本的误解是如何调用/调用Tcl函数/命令 与许多其他语言不同,Tcl使用
func调用函数(arg1,arg2,“arg3”,arg4)
func$arg1$arg2“arg3”$arg4,其中arg1
,arg2
和arg4
是变量
要定义此函数,请使用proc
。语法是
proc sum {a b} {
return [expr {$a + $b}]
}
ab
是参数列表。注意,您不需要声明函数
<>我不完全理解你在这里做什么,但是它看起来或多或少像是一个结构/类。 < P>正如你所知道的,Tcl和C++有非常不同的方法和价值。特别是,TCL几乎完全是通过逻辑上不变的引用来引用那些仍然是可变类型的值,这与C++(以及许多其他语言,公平地)非常不同。True mutator操作(例如增量)实际上创建副本 另一个关键区别是,在Tcl中,一切都是通过执行命令来完成的。这包括创建其他命令。那个
程序
?它是对命令(称为proc
)的调用,该命令立即创建一个具有给定名称、参数和主体的过程。没有什么比宣言更重要了;当你告诉代码让它发生时,事情就发生了。这听起来比实际情况要复杂得多
如何将列表值传递到过程中
假设您的名称
是一个列表,然后将整个列表值传入(通过不可变的引用,如此快速和安全),其中的代码可以做任何它想做的事情,而不会影响外部世界。然后你会这样写:
# Define
proc employee_data {Name ...} {
lassign $Name A B C
# ... do other processing ...
}
# Call
set Name {Aitem Bitem Citem}
employee_data $Name ...
employee_data [dict get Name] ...
您还可以使用立即定义的数据调用;Tcl对此非常满意:
employee_data {Aitem Bitem Citem} ...
传递字典值
字典很像列表,只是它们将键映射到值而不是序列
proc employee_data {Name ...} {
dict with Name {}
# ...
}
set Name {A "foo" B "bar" C "grill"}
employee_data $Name ...
还可以将(关联)数组内容的副本作为字典值传递,如下所示:
# Define
proc employee_data {Name ...} {
lassign $Name A B C
# ... do other processing ...
}
# Call
set Name {Aitem Bitem Citem}
employee_data $Name ...
employee_data [dict get Name] ...
传递参考资料
但是假设你想改变外面的世界!为此,必须传递要更改的变量的名称。然后使用upvar
将局部变量绑定到调用方的变量,以便进行修改并使其保持不变。使用upvar
命令,您实际上可以按名称进行调用,这非常神奇
proc employee_data {NameVar ...} {
upvar $NameVar name
# ... accessing $name as if it was whatever variable was passed ...
}
set Name {Aitem Bitem Citem}
# Note: *not* $Name! We want the name, not the contents!
employee_data Name ...
您可以认为像
set
和incr
这样的内置命令是这样工作的。这也适用于关联数组。您知道其他编程语言吗?对于我来说,用这种语言来解释tcl会更容易,因为你有很多令人困惑的误解,这些误解似乎是从其他语言继承而来的。感谢你的回答,我知道C,C++我正在尝试用一些可选参数创建函数proc sum{a(1 2 3)b(4 5 6)C(1 3 2 2)}{Body…例如:我需要执行sum a(1 2 3)这样的命令c(04)或和a(123)b(04)