Programming/TclTk
TCL 기본
Hunveloper
2022. 9. 1. 17:10
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