0

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

}

非常感谢。

4

2 回答 2

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像这样工作。这也适用于关联数组。

于 2013-11-12T16:19:27.093 回答
0

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

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

要定义这样的函数,请使用proc. 语法是

proc sum {a b} {
    return [expr {$a + $b}]
}

a b是参数列表。请注意,您不需要声明该函数。

我不完全理解您在这里尝试做什么,但它看起来或多或少像我的结构/类。

于 2013-11-12T16:16:07.380 回答