Hunveloper 2022. 9. 5. 11:18
728x90

EVAL?

  • 어떤 변수나 명령을 해석하기 위해서는 치환을 필요로 함
  • 고급 기능의 치환은 eval이나 subst, after, uplevel, sen 명령에 의해 수행

리스트로 명령어 조합

  • eval 명령은 TCL 해석기에게 또 다른 호출을 하게 만듦
  • 명령어를 동적으로 조합하기 위해서는 eval 명령을 사용
  • 예를 들어 다음 명령을 나중에 수행시키고 싶은 경우
puts stdout "Hello, World!"
  • 이러한 경우에는 아래와 같이 하면 됨
set cmd {puts stdout "Hello, World!"}
eval $cmd

#Hello, World!
  • 외부에 출력할 스트링이 string이라는 변수에 저장 되어 있다고 가정
  • eval 명령의 수행 시점에서 string 변수에 값이 없을 경우
set string "Hello, World!"
set cmd {puts stdout $string}
unset string
eval $cmd
#cant't read "string": no such variable
  • 해결법 : list명령을 사용해 조합하면 됨
set string "Hello, World!"
set cmd [list puts stdout $string]

eval $cmd
#Hello, World!

unset string; #여기서 string 변수를 해제함
eval $cmd
#Hello, World!
  • 아래는 잘못 된 예
set string "Hello, World!"
set cmd "puts stdout $string"
eval $cmd
#bad argument "World!": should be "nonewline"

set cmd [concat puts stdout $string]
eval $cmd
#cant't read "string": no such variable
  • concat은 리스트 구조를 유지하지 않으므로 문제가 됨

Eval에서 수행하는 concat 기능 이용

  • eval 명령은 하나 이상의 인자를 받는 경우에 자동으로 concat 명령을 수행함
eval list1 list2 list3 ...
  • concat 명령의 효과는 모든 리스트들을 하나의 리스트로 합침
  • 새로운 단계의 리스트 구조가 추가되지 않음
  • 명령어가 여러 조각으로 분리되어 있는 경우에 유용함
  • 이런한 기능의 eval 명령은 프로시져의 args와 함께 사용하는 것이 일반적
  • 옵션 인자를 다른 명령에게 전달하기 위해 args 파라미터를 사용
  • 다른 명령어를 호출할 때 eval을 사용하면 $args가 concat 기능에 의해 합쳐지기에 명령어에서 올바른 인자로 파악 가능
  • TK에서의 버튼을 만들기 위한 명령의 형태
button .foo -text Foo -command foo
  • 버튼이 생성된 후에는 pack 명령을 이용해 화면에 보이게 해야 한다
pack .foo -side left
  • 다음은 제대로 동작하지 않음
set args {-text Foo -command foo}
button .foo $args

#unknown option 
  • $args가 리스트 값으로서 button은 args를 구성하는 값 전체를 하나의 파라미터로 인식함
  • 문제를 해결하기 위해서 args를 구성하는 원소 각각을 하나의 파라미터로 인식하게 만들어야 함
set args {-text Foo -command foo}
eval button .foo $args
pack .foo -side left
  • 아래의 코드는 eval의 기능을 사용해 버튼을 만들고 보여주는 프로시져
proc PackedButton {path txt cmd {pack {-side right}} args} {
    eval {button $path -text $txt -command $cmd } $args
    eval {pack $path} $pack
}

PackedButton .foo foo foo
  • pack과 args는 모두 리스트의 파라미터로서 명령어의 일부를 구성

Uplevel 명령

  • uplevel 명령은 eval과 유사하지만 현재 스포시져와는 다른 스코프에서 명령어를 수행
  • 새로운 제어 구조를 정의하는 데에 유용
uplevel level command
  • level 파라미터의 의미는 upvar 명령의 경우와 동일
728x90
728x90