2012-03-19 3 views
3

Существуют ли какие-либо пакеты или какой-либо конкретный способ поддержки перегрузки функций или процедур в TCL?Перегрузка функций в TCL

Это мой сценарий. Мне нужно написать универсальную процедуру, которая принимает два или 3 файла, в котором я могу или не могу иметь третий файл (file3)

    proc fun { File1 File2 File3 } 
        { 
        } 

       proc fun { File1 File2 } 
        { 
        } 
+2

Я понимаю, что это просто псевдо-код, но этот стиль распорка не будет работать в Tcl , –

ответ

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

Tcl имеет очень хорошую поддержку var-args, но это означает, что перегрузка - идти. Эти два являются антагонистическими. –

4

Tcl действительно не поддерживает процедуру перегрузки, которая имеет смысл, когда вы считаете, что у него действительно нет типов, как таковых. Все это строка, которая может, в зависимости от значения, интерпретироваться как другие типы (int, list и т. Д.).

Если вы можете описать, что именно вы пытаетесь выполнить (почему вы думаете, что вам нужно перегрузить), мы могли бы сделать рекомендацию о том, как это сделать.

Учитывая, что вы редактируете свой вопрос, есть несколько способов сделать это. GrAnd показал 2 из них. Третий, и один я фанат, чтобы использовать конкретную информацию о том, как называлась команда:

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

Отредактировал мой вопрос – user1270123

+0

Умный трюк - я всегда задавался вопросом, что делать, если нет разумного значения по умолчанию для необязательного аргумента ;-) – kostix

2

Вот пример взломать путы, используя пространство имен, чтобы скрыть путы и :: для доступа к встроенному -в:

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

Другой способ, вы можете сделать это:

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

при вызове процедурный

example -fiel1 info -file2 info2 
+1

totaly не работают в 8.5 и 8.6. – OliveOne