任何人都可以帮助我进行TCL编程,我是TCL的新手 我想创建像
这样的函数employee_data Name() Dept() Tasks() ...
假设我需要执行上述函数,例如employee_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...
}
非常感谢。
答案 0 :(得分:0)
我认为基本的误解是你如何调用/调用Tcl函数/命令。
与许多其他语言不同,您使用func(arg1,arg2,"arg3",arg4)
调用函数时,Tcl使用func $arg1 $arg2 "arg3" $arg4
,其中arg1
,arg2
和arg4
是变量。
要定义此类功能,请使用proc
。语法是
proc sum {a b} {
return [expr {$a + $b}]
}
a b
是参数列表。请注意,您无需声明该函数。
我并不完全明白你在这里想做什么,但它看起来或多或少像我的结构/类。
答案 1 :(得分:0)
正如您所知,Tcl和C ++对值和类型的方法有很大不同。特别是,Tcl几乎完全是通过逻辑上不可变的引用来实现类型可变的值,这些非常不同于C ++(和许多其他语言一样公平)。真正的mutator操作(例如增量)实际上创建了副本。
另一个关键区别是在Tcl中,一切都是通过执行命令来完成的。这包括创建其他命令。那proc
?它是对命令(称为proc
)的调用,它立即创建一个具有给定名称,参数和正文的过程。没有什么能像宣言那样;当你告诉代码实现它时会发生一些事情。这听起来比现在复杂得多。
假设您的Name
是一个列表,然后您将传递整个列表值(通过不可变引用,如此快速和安全),内部代码可以做任何想做的事情,而不会影响外部世界。然后你会这样写:
# Define
proc employee_data {Name ...} {
lassign $Name A B C
# ... do other processing ...
}
# Call
set Name {Aitem Bitem Citem}
employee_data $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 ...
您还可以将(关联)数组的内容的副本作为字典值传递,如下所示:
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
等内置命令视为这样工作。这也适用于关联数组。