在TCL中创建函数

时间:2013-11-12 11:41:05

标签: tcl

任何人都可以帮助我进行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...

}

非常感谢。

2 个答案:

答案 0 :(得分:0)

我认为基本的误解是你如何调用/调用Tcl函数/命令。

与许多其他语言不同,您使用func(arg1,arg2,"arg3",arg4)调用函数时,Tcl使用func $arg1 $arg2 "arg3" $arg4,其中arg1arg2arg4是变量。

要定义此类功能,请使用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 ...

您可以将setincr等内置命令视为这样工作。这也适用于关联数组。