Перегрузка функций в TCL - PullRequest
3 голосов
/ 19 марта 2012

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

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

                 proc fun { File1 File2 File3 }
                    {
                    }

                 proc fun { File1 File2 }
                    {
                    }

Ответы [ 4 ]

8 голосов
/ 19 марта 2012

В 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
  }
}
4 голосов
/ 19 марта 2012

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]
    }
}
2 голосов
/ 19 марта 2012

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

namespace eval newNameSpace {
  proc puts {arg} {
    set tx "ADDED:: $arg"
    ::puts $tx 
  }
  puts 102 
}
1 голос
/ 23 марта 2012

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

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

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

example -fiel1 info -file2 info2
...