TCL中的函数重载

时间:2012-03-19 18:04:16

标签: tcl overloading

在TCL中是否有任何软件包或任何特定方式来支持函数或过程重载?

这是我的情景。我需要编写一个接受两个或三个文件的通用程序,其中我可能有也可能没有第三个文件(File3)

                 proc fun { File1 File2 File3 }
                    {
                    }

                 proc fun { File1 File2 }
                    {
                    }

4 个答案:

答案 0 :(得分:8)

tcl没有压倒一切。第二个声明将取代第一个声明。 但是你用一个程序来处理它。至少有两种方式:

1)使用默认值指定最后一个参数。然后,当您调用该函数时,它将是可选的。

proc fun { file1 file2 {file3 ""} } {
  if {$file3 != ""} {
    # the fun was called with 3rd argument
  }
}

2)使用特殊参数args,它将包含所有参数作为列表。然后分析实际传递给的参数数量。

proc fun { args } {
  if {[llength $args] == 3} {
    # the fun was called with 3rd argument
  }
}

答案 1 :(得分:4)

Tcl并不真正支持程序重载,当你认为它本身并没有类型时,这是有道理的。一切都是一个字符串,可以根据值被解释为其他类型(int,list等)。

如果你能描述你想要完成的是什么(为什么你认为你需要超载),我们或许可以就如何完成它做出推荐。

考虑到你的问题的编辑,有几种不同的方法可以解决它。 GrAnd已经展示了其中的两个。第三个,也就是我的粉丝,是使用有关如何调用命令的具体信息:

proc fun { File1 File2 {File3 ""}} {     ;# file3 has a default
    if {[llength [info level 0]] == 3} { ;# we were called with 2 arguments
                                         ;# (proc name is included in [info level 0])
        # do what you need to do if called as [fun 1 2]
    } else {                             ;# called with 3 arguments
        # do what you need to do if called as [fun 1 2 3]
    }
}

答案 2 :(得分:2)

以下是hack puts的示例,使用命名空间隐藏puts和::来访问内置:

namespace eval newNameSpace {
  proc puts {arg} {
    set tx "ADDED:: $arg"
    ::puts $tx 
  }
  puts 102 
}

答案 3 :(得分:1)

另一种方法,你可以这样做:

proc example {
    -file1:required
    -file1:required
    {-file3 ""}
} {
    if {$file3 ne ""} {
            #Do something ...
    }
}

当你调用proc

example -fiel1 info -file2 info2