수색…


비고

참고 문헌 : proc
인수 확장 (5 절)

인수를 허용하지 않는 프로 시저

proc myproc {} {
    puts "hi"
}
myproc
# => hi

빈 인수 목록 (프로 시저 이름 뒤에 두 번째 인수 인 "myproc")은 프로 시저가 인수를 허용하지 않음을 의미합니다.

두 개의 인수를 허용하는 프로 시저

proc myproc {alpha beta} {
    ...
    set foo $alpha
    set beta $bar     ;# note: possibly useless invocation
}

myproc 12 34          ;# alpha will be 12, beta will be 34

인수 목록이 단어로 구성되어 있으면 프로 시저의 로컬 변수 이름이되며 초기 값은 명령 행의 인수 값과 같습니다. 인수는 값에 의해 전달되며 프로 시저 내부의 변수 값에 어떤 일이 발생하더라도 프로 시저 외부의 데이터 상태에는 영향을 미치지 않습니다.

가변 개수의 인수를 허용하는 프로 시저

### Definition
proc myproc {alpha {beta {}} {gamma green}} {
    puts [list $alpha $beta $gamma]
}
### Use
myproc A
# => A {} green
myproc A B
# => A B green
myproc A B C
# => A B C

이 프로시 저는 하나, 둘 또는 세 개의 인수를 허용합니다. 두 개 항목 목록의 첫 번째 항목이 이름 인 매개 변수는 선택 사항입니다. 매개 변수 변수 ( alpha , beta , gamma )는 사용 가능한 인수 값을 왼쪽에서 오른쪽으로 할당합니다. 인수 값을 얻지 못하는 매개 변수 변수는 대신 목록의 두 번째 항목에서 값을 가져옵니다.

선택적 인수는 인수 목록의 끝에 와야합니다. 인수 N-1 이 선택적이면 인수 N 도 선택적이어야합니다. 프로 시저를 호출하는 동안 사용자가 인수 N하지만 인수 N-1, N-1이 명시 적으로 인수 N 전에 언급 할 필요가 인수의 기본값이 경우에합니다.

myproc A B C D
# (ERROR) wrong # args: should be "myproc alpha ?beta? ?gamma?"

이 절차는 3 개 이상의 인수를 허용하지 않습니다. 인수 구문을 설명하는 유용한 오류 메시지가 자동으로 작성됩니다.

임의의 수의 인수를 허용하는 프로 시저

proc myproc args { ... }
proc myproc {args} { ... } ;# equivalent

특수 매개 변수 이름 args 가 인수 목록의 마지막 항목이면 명령 행의 해당 지점에서 모든 인수 목록을 수신합니다. 없으면 목록이 비어 있습니다.

args 앞에 선택적 인자를 포함한 인자가있을 수 있습니다 :

proc myproc {alpha {beta {}} args} { ... }

이 절차는 하나 이상의 인수를 허용합니다. 처음 두 개가 있으면 alphabeta 의해 소비 될 것입니다 : 나머지 인수들의 목록은 args 할당 될 것입니다.

변수에 대한 이름 / 참조를 수락하는 프로 시저

proc myproc {varName alpha beta} {
    upvar 1 $varName var
    set var [expr {$var * $alpha + $beta}]
}
set foo 1
myproc foo 10 5
puts $foo
# => 15

이 특별한 경우 프로 시저에는 현재 범위의 변수 이름이 제공됩니다. Tcl 프로 시저에서 이러한 변수는 자동으로 표시되지 않지만 upvar 명령은 다른 스택 수준의 변수에 대한 별칭을 만들 수 있습니다. 1은 호출자의 스택 수준을 의미하고 0은 전역 수준을 의미합니다. 스택 레벨 1과 foo 라는 이름 (변수 varName )은 upvar 변수를 찾아 var 라는 별칭을 생성합니다. 에 대한 모든 읽기 또는 쓰기 작업 var 또한 일어나는 foo 호출자의 스택 수준.

{*} 구문

당신이 갖고있는 것은 목록이지만 명령에서 목록의 항목을 전달하여 각 항목을 별도의 인수로 가져 오려고합니다. 예 : winfo children 명령은 창 목록을 리턴하지만 destroy 명령은 일련의 창 이름 인수 만 취합니다.

set alpha [winfo children .]
# => .a .b .c
destroy $alpha
# (no response, no windows are destroyed)

해결 방법은 {*} 구문을 사용하는 것입니다.

destroy {*}[winfo children .]

또는

destroy {*}$alpha

{*} 구문은 다음 값 (사이에 공백이 없어야합니다!)을 사용하여 해당 값의 항목을 개별 인수 인 것처럼 명령 줄에 연결합니다.

다음 값이 빈 목록이면 아무 것도 연결되지 않습니다.

puts [list a b {*}{} c d]
# => a b c d

하나 이상의 항목이있는 경우 삽입됩니다.

puts [list a b {*}{1 2 3} c d]
# => a b 1 2 3 c d


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow