## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > proc

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

proc — Tcl の手続函数を作る Create a Tcl procedure

### 構文 SYNOPSIS

proc name args body

### 説明 DESCRIPTION

このproc 命令は､ name と名付けられた新しい Tcl の手続函数を生成し､その名前を付けた既存のどのような命令又は手続函数があっても､これに置換える｡何時であれ､新しい命令が起動されると body の内容がTcl 解釈実行機能により実行される｡通常は､ name は修飾されず(どの様な名前空間を含む名前も含まない)､新しい手続函数が現在の名前空間内に生成される｡もし､ name が何かの名前空間修飾子を含んでいると､その手続函数はその指定された名前空間内に生成される｡ args は手続函数に対する形式上の引数を指定する｡それは､リストを構成し､空のこともあり得るが､それぞれの要素が一つの引数を指定する｡それぞれの引数の指示子も､一つ又は二つの欄のリストである｡指示子に一つだけしか欄がないとそれは引数の名前である; 欄が２つあると､第１が引数の名前､第２がその省略時値である｡省略時値ありの引数は､後に省略時値なしの引数が続くと､値が必要な引数に換ってしまう; そこまでと､更に形式的引数が必要な最後のところ迄に足るだけの充分な実引数を供給する必要がある｡　 The proc command creates a new Tcl procedure named name, replacing any existing command or procedure there may have been by that name. Whenever the new command is invoked, the contents of body will be executed by the Tcl interpreter. Normally, name is unqualified (does not include the names of any containing namespaces), and the new procedure is created in the current namespace. If name includes any namespace qualifiers, the procedure is created in the specified namespace. Args specifies the formal arguments to the procedure. It consists of a list, possibly empty, each of whose elements specifies one argument. Each argument specifier is also a list with either one or two fields. If there is only a single field in the specifier then it is the name of the argument; if there are two fields, then the first is the argument name and the second is its default value. Arguments with default values that are followed by non-defaulted arguments become required arguments; enough actual arguments must be supplied to allow all arguments up to and including the last required formal argument.

name が起動された時､手続函数に対するそれぞれの形式的な引数に関して局所変数が生成される;その値は､起動する命令内の引数に対応する値か､又は引数の省略時設定値になる｡実際の引数が､厳密にその順に､形式的引数に代入される｡省略時設定の値を伴う引数は､手続函数の起動中に指定されなくてもよい｡しかしながら､省略時設定を有さない全ての形式引数の為に､対応する実引数が必要であり､且つ､如何なる余分な実引数もあってはならない｡省略時設定値を伴う引数は､省略時値なしの引数が続くと事実上の値が必要な引数に替わる､この事柄は Tcl の将来の版では変更されるかもしれないが; 確実に移行可能な命令である為には､全ての実引数が必要な引数が後ろに継続する引数には全て引数指定があるべきである｡ When name is invoked a local variable will be created for each of the formal arguments to the procedure; its value will be the value of corresponding argument in the invoking command or the argument's default value. Actual arguments are assigned to formal arguments strictly in order. Arguments with default values need not be specified in a procedure invocation. However, there must be enough actual arguments for all the formal arguments that do not have defaults, and there must not be any extra actual arguments. Arguments with default values that are followed by non-defaulted arguments become de-facto required arguments, though this may change in a future version of Tcl; portable code should ensure that all optional arguments come after all required arguments.

変動個数の引数を伴う手続函数を許容する特別な場合が一つある｡もし､形式上の最後の引数が名前 “args” を有すると､その手続函数の呼出しは､手続函数が形式上有しているより多くの実引数を含んでもよい｡この場合､ args に割当てが始まる全ての実引数は､(恰も､ list 命令が使われたかの如く)リストにまとめられる; このまとめられた値は､局所変数 args に代入される｡ 　　　 There is one special case to permit procedures with variable numbers of arguments. If the last formal argument has the name “args”, then a call to the procedure may contain more actual arguments than the procedure has formal arguments. In this case, all of the actual arguments starting at the one that would be assigned to args are combined into a list (as if the list command had been used); this combined value is assigned to the local variable args.

body が実行されているとき､変数名は通常局所変数を参照する､それは､参照された時に自動的に生成され､手続函数が戻るときに削除される｡手続函数のそれぞれの引数の為に自動的に一つの局所変数が生成される｡その他の変数は global 命令か, variable 命令か, upvar 命令か, namespace upvar 命令の内の一つを起動することによってのみ利用可能になる｡本体の body が実行されている時､現在の名前空間は､その手続函数の名前がその中に実在する名前空間であって､ rename によって変更されていない限り､その手続函数がその中で生成されたものである｡ 　　　　　 When body is being executed, variable names normally refer to local variables, which are created automatically when referenced and deleted when the procedure returns. One local variable is automatically created for each of the procedure's arguments. Other variables can only be accessed by invoking one of the global, variable, upvar or namespace upvar commands. The current namespace when body is executed will be the namespace that the procedure's name exists in, which will be the namespace that it was created in unless it has been changed with rename.

proc 命令は空文字列を返す｡手続函数が起動された時､その手続函数の戻り値は return 命令の中で指定される｡もしその手続函数が明示的な return を実行しない時､返り値は､手続函数の本体のなかで実行された最後の命令の値になる｡もし､手続函数の本体の実行中に不都合が生じると､手続函全体として､その同じ不都合を返すことになる｡ The proc command returns an empty string. When a procedure is invoked, the procedure's return value is the value specified in a return command. If the procedure does not execute an explicit return, then its return value is the value of the last command executed in the procedure's body. If an error occurs while executing the procedure body, then the procedure-as-a-whole will return that same error.

### 用例 EXAMPLES

これは二つの引数を取り､両者の和と積を印刷する手続き函数である｡それはまた､使用者に明示的な答えの意味で文字列 “OK” を返す｡　 This is a procedure that takes two arguments and prints both their sum and their product. It also returns the string “OK” to the caller as an explicit result.

    proc printSumProduct {x y} {
        set sum [expr {$x + $y}]
        set prod [expr {$x * $y}]
        puts "sum is $sum, product is $prod"
        return "OK"
    }

これは､多くの引数を幾つでも受取り､それを一つづつ印刷出力する｡ This is a procedure that accepts arbitrarily many arguments and prints them out, one by one.

    proc printArguments args {
        foreach arg $args {
            puts $arg
        }
    }

この手続函数は incr 命令とやや似ているが､名前を付けられた変数の内容に､省略時設定で 2 になっている値を掛合す｡ This procedure is a bit like the incr command, except it multiplies the contents of the named variable by the value, which defaults to 2:

    proc mult {varName {multiplier 2}} {
        upvar 1 $varName var
        set var [expr {$var * $multiplier}]
    }

### SEE ALSO

info, unknown

### KEYWORDS

argument, procedure
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.