TCL中的函数重载

TCL中的函数重载,tcl,overloading,Tcl,Overloading,TCL中是否有支持函数或过程重载的包或特定方式 这是我的设想。我需要编写一个接受两个或三个文件的通用过程,其中可能有也可能没有第三个文件(File3) TCL并不真正支持程序重载,当您认为它实际上不具有类型时,这是有意义的。一切都是一个字符串,可以根据值解释为其他类型(int、list等) 如果你能描述一下你想要完成的事情(为什么你认为你需要重载),我们也许可以就如何完成它提出建议 考虑到对你的问题的编辑,有两种不同的方法来处理。格兰德展示了其中的两个。第三个,也是我非常喜欢的一个,是专门使用

TCL中是否有支持函数或过程重载的包或特定方式

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


TCL并不真正支持程序重载,当您认为它实际上不具有类型时,这是有意义的。一切都是一个字符串,可以根据值解释为其他类型(int、list等)

如果你能描述一下你想要完成的事情(为什么你认为你需要重载),我们也许可以就如何完成它提出建议

考虑到对你的问题的编辑,有两种不同的方法来处理。格兰德展示了其中的两个。第三个,也是我非常喜欢的一个,是专门使用有关如何调用命令的信息:

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]
    }
}

下面是一个破解PUT的示例,使用名称空间隐藏PUT,并使用
访问内置PUT:

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

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
  }
}

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

proc example {
    -file1:required
    -file1:required
    {-file3 ""}
} {
    if {$file3 ne ""} {
            #Do something ...
    }
}
当你调用proc时

example -fiel1 info -file2 info2

我意识到这只是伪代码,但这种支撑风格在tcl中不起作用。这两者是对立的。确实是一个聪明的把戏——我一直想知道,如果可选参数没有合理的默认值,该怎么办;-)
example -fiel1 info -file2 info2