在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_

有人能帮我做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_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)