본문 바로가기
Programming/TclTk

TCL 기본

by Hunveloper 2022. 9. 1.
728x90

TCL 기본

TCL이란?

  • 간단한 구조와 문법을 가지고 있는 스크립트 언어
  • 자료형이 없는 등 다른 언어들과 다른 면이 많으므로 기본 개념을 잘 다져야함

TCL 시작하기

  • tclsh은 sch나 sh을 이용할 수 있는 명령어 해석기
  • wish는 Tk 명령어(GUI)들을 해석할 수 있도록 확장된 TCL 해석기
  • 여러 명령을 파일에 넣어두고 실행시킬 수 있음
  • TCL의 source 명령을 사용해 실행 가능 ex) source filename
  • 쉘 스크립트와 같이 독립적인 스크립트로 작성 가능
  • 스크립트로 작성하기 위해서는 소스 코드의 맨 첫 줄에 추가해야 함
**!/usr/local/bin/tcl # 방법 1**
**!/usr/lcoal/bin/wish # 방법 2**
  • TCL/TK가 설치된 디렉토리가 위의 경로가 아닐 경우는 따로 지정해야 함
  • TCL의 라이브러리 기능을 사용할 수 있음

TCL 명령

  • TCL의 기본적인 형태
**command arg1 arg2 arg3 … argn**
  • ‘command’는 내부 명령이나 TCL 프로시저의 이름
  • 명령어와 인자를 구분하기 위해 스페이스나 tab 문자를 사용함
  • 한 명령줄의 마지막을 나타내기 위해 newline이나 ‘;’을 사용
  • 기본적인 문법은 하나의 인자에 여러 단어를 허용하는 grouping 등을 이용하여 확장 가능
  • 인자는 모두 문자열임

Hello World

puts "Hello World!"
puts stdout "HeLLo World!"
puts {hello, world!}
puts heLLo,woRLd!

#Hello World!
#HeLLo World!
#hello, world!
#heLLo,woRLd!
  • puts가 command이고 인자는 “Hello World!”, stdout “HeLLo World!”, {hello, world!}, heLLo,woRLd! 들이다
  • puts 명령어는 I/O 스트림에 String을 출력하고 newline 문자를 출력
  • stdout은 출력될 I/O 장치의 이름
  • {hello, world!}는 {}에 의해 Grouping 되었음
  • 마지막의 경우 인자를 구분하는 스페이스가 없기 때문에 하나의 문자열로 인식하여 출력됨

변수

  • 변수에 값을 대입하기 위해서 set 명령을 사용
  • set 명령은 두 개의 인자를 받음
  • 첫 번째 인자는 variable의 이름이며 두 번째 인자는 value.
  • 변수 이름은 길이 제한이 없으며 대소문자를 구분
  • 변수를 미리 정의할 필요 없음
  • 변수 값을 이용하기 위해서는 C 포인터와 유사하게 변수 이름 앞에 $를 붙임
set var 13 => 13
set temp $var => 13
  • 변수 이름 앞에 $를 붙이는 것을 ‘변수 치환’
  • 명령어 해석기는 $var를 13으로 대체함

명령 치환

  • 중첩된 명령은 ‘[ ]’로 둘러싸며 ‘[ ]’ 안에 포함된 명령의 실행 결과로 대체됨
  • 일반 shell에서 ‘`’ (backquote) 와 비슷한 의미
set len [string length asdfasdf]
puts $len
puts len

#8
#len
  • 8은 첫 번째 줄에서 len을 “asdfasdf”의 길이만큼 설정한다 했기에 8로 설정되며 len의 값 8이 출력되었으며
  • ‘len’은 변수를 호출한 것이 아닌 문자열 자체로 호출을 했기에 ‘len’이라는 string이 출력됨

수식

  • expr 명령을 이용하여 수식을 계산함
puts [expr 45.0 / 23]
puts [expr 45 / 23.0]
puts [expr 45 / 23]
puts [expr 1==2]
puts [expr 3==3]

#1.95652173913
#1.95652173913
#1
#0
#1
  • expr은 정수, 실수, boolean 값에 대한 연산을 처리
  • 연산하는 값이 실수 형태로 표현되어 있다면 실수 연산을 수행하며, 값들이 정수로 표현되어 있으면 정수 형태로 연산을 수행
  • boolean 값에 대한 연산은 0이나 1을 return
  • 8진수는 수 앞에 0을 붙여 표기, 16진수는 수 앞에 0x를 붙여 표기
puts [set len [expr [string length asdf] + 3]]
puts [append len "00"]
puts [expr $len - 10]

#7
#700
#690
  • len에 정수 값이 저장되어 있을 때 문자로 숫자를 append시키면 정수랑 동일하게 수식 연산이 가능
  • e-val 명령은 기본 내장 수학 함수들을 지원
set pi [expr 2 * asin(1.0)]
puts $pi

#3.14159265359
  • 유효 자릿수는 tcl-precision 변수 값에 원하는 유효 자릿수를 대입해 바꿀 수 있으며 default는 12
    최대 가능한 자릿수는 17
puts [expr 13.0/7]

set tcl_precision 17
puts [expr 13.0/7]

#1.85714285714
#1.8571428571428572
  • Tcl에서 사용할 수 있는 연산자와 함수
    • -, ~, !: Unary minus, bitwise NOT, logical NOT
      • / % + -
    • <<, >> : Left or Right shift
    • < > <= >=
    • == !=
    • &, ^, |, &&, ||
    • x?y:z
    • acos(x): Arc-cosin of x
    • asin(x): Arc-sine of x
    • atan(x): Arc-tangent of x
    • atan2(y, x): Rectangular (x, y) to polar (r, th). atan 2 gives th.
    • ceil(x): Ceiling of x
    • cos(x): Cosine of x
    • cosh(x): Hyperbolic cosine of x
    • exp(x): Exponential
    • floor(x): Floor of x
    • fmod(x, y): Floating point remainder of x/y
    • hypot(x, y): sqrt(x_x + y_y)
    • log(x): Natural log of x
    • log10(x): Log base 10 of x
    • pow(x, y): x to the y power
    • sin(x): Sine of x
    • sinh(x): Hyperbolic sine of x
    • sqrt(x): Square root of x
    • tan(x): Tangent of x
    • tanh(x): Hyperbolic tangent of x
    • abs(x): Absolute value of x
    • double(x): x의 실수형 값
    • int(x): x의 정수형 값
    • round(x): x를 내림한 정수값

역슬래쉬 치환

  • 해석기에 특별한 의미를 가지는 문자를 표현하기 위해 사용
  • $는 변수 치환을 위해 사용되므로 명령어 상에 $를 사용하여 해석기는 이름 변수 치환으로 해석
  • 이를 해결하고자 역슬래쉬 치환을 사용
    다른 언어들과 마찬가지로 \n, \t 등으로 사용
set dollar \$
puts dollar

#$
  • 다른 사용 예는 한 명령줄이 너무 긴 경우 다음 줄과 연결됨을 표시하기 위해 한 줄의 마지막에 ‘\’을 사용
set one "this is one"
set two    2

set len [expr [string length $one] + \
[string length $two]]

puts $len

#12
  • 역슬래쉬 치환의 예
    • \a: Bell(0x7)
    • \b: Backspace(0x8)
    • \f: Form feed(0xc)
    • \n: Newline(0xa)
    • \r: Carriage return(0xd)
    • \t: Tab(0x9)
    • \v: Vertical tab(0xb)
    • \: \
    • \0XX: 8진수
    • \xhh: 16진수
    • \c: c 문자

Grouping

  • 여러 단어를 하나로 Grouping하기 위해서는 ‘{ }’ 와 ‘” ”’가 사용
  • 인용 부호를 사용하는 경우는 치환을 허용
  • ‘{ }’을 이용하는 경우에는 String으로 인식하여 치환이 일어나지 않음
  • @산출물 참고

프로시져

  • 프로시져를 정의하기 위해서는 proc 명령을 사용
proc name arglist body
  • 첫 번째 인자는 새로 정의할 프로시져의 이름
  • 프로시져의 이름은 대소문자를 구분
  • 두 번째 인자는 프로시져에게 전달한 파라미터의 리스트
  • 세 번째 인자는 프로시져의 몸체 부분
  • 정의된 프로시져는 다른 내장 명령과 똑같은 방법으로 사용
proc dist {a b} {
    set c [expr sqrt ($a * $a + $b * $b)]
    return $c
}

puts [dist 3 4]

#5.0

While 루프

set a 1; set product 1
while {$a <= 10} {
    set product [expr $product * $a]
    incr a
}

puts $product

#3628800
  • ‘;’을 이용하여 두 개 이상의 명령을 한 줄에 사용 가능
  • while 명령의 첫 번째 인자는 boolean 수식
  • while의 첫 번째 인자에 expr은 쓰지 않아도 무방
  • incr 명령은 변수의 값을 1 증가시킴
  • while의 첫 번째 인자를 { }를 사용해 grouping 함

주석

  • TCL에서 주석을 포함하는 줄은 #으로 시작
  • 주석 문은 \에 의해 다음 줄에 계속될 수 있음
#this is the start of a Tcl comment \
and some more of it; still in the comment
  • 한 줄의 뒷부분에 주석을 달기 위해서는 ;으로 한 줄을 마치고 #을 달 수 있음

Command line argument

  • TCL 쉘은 명령행에서 준 인자를 argv 변수를 통해 스크립트에게 전달
  • argc 변수에는 인자의 개수가 들어감
  • 스크립트 이름은 argv0 변수에 들어감
set progname $argv0
set first [lindex $argv 0]
set seconf [lindex $argv 1]
728x90
728x90

'Programming > TclTk' 카테고리의 다른 글

TCL 순서제어 명령  (0) 2022.09.02
TCL 자료 구조  (0) 2022.09.02
TCL 스트링과 패턴 매칭  (0) 2022.09.02
TCL 설치하기  (0) 2022.09.01
TCL 별찍기와 산출물  (0) 2022.08.31

댓글