고대의 강력한 메인프레임, Bracketeer™를 위한 소프트웨어를 작성할 기회를 얻었어요. 그 위에서 돌아가는 소프트웨어는 독자적인 언어로 작성돼요. 문법은 대부분 익숙한데, 대괄호와 중괄호, 소괄호가 정말 많이 눈에 띄어요. Bracketeer™는 강력하지만 유연하지는 않아요. 소스 코드에 짝이 맞지 않는 대괄호나 중괄호, 소괄호가 하나라도 있으면 Bracketeer™는 멈춰 버리고 다시 부팅해야 해요. 그런 일을 피하려고, Bracketeer™에서 실행하기 전에 대괄호와 중괄호, 소괄호의 짝이 맞는지 확인할 수 있는 코드를 작성하기 시작해요.
[] 대괄호, {} 중괄호, () 소괄호 또는 이들의 조합이 들어 있는 문자열이 주어지면, 모든 쌍이 올바르게 짝을 이루고 중첩되어 있는지 확인해요.
그 밖의 다른 문자는 무시해요.
예를 들어, "{what is (42)}?"는 짝이 맞고 "[text}"는 맞지 않아요.
Tcl은 아주 단순한 언어지만, 인터프리터가 코드를 해석하는 방식에는 까다로운 예외 상황이 몇 가지 있어요.
Tcl에서 중괄호는 그저 텍스트 블록을 인용하는 방법일 뿐이에요. 그 텍스트는 코드로 해석될 수도 있고 데이터로 해석될 수도 있어요. 중괄호 안에는 중괄호가 중첩될 수 있지만, 중첩된 중괄호는 짝이 맞아야 해요. Tcl 맨 페이지에는 이렇게 나와 있어요.
중괄호는 단어 안에서 중첩돼요. 여는 중괄호가 하나 더 있으면 닫는 중괄호도 하나 더 있어야 해요. (단, 단어 안의 여는 중괄호나 닫는 중괄호가 백슬래시로 인용되어 있으면 짝이 맞는 닫는 중괄호를 찾을 때 세지 않아요.)
여기서 표현이 아주 구체적이에요. 짝이 맞지 않는 여는 중괄호나 닫는 중괄호 문자를 쓰고 싶다면, 반드시 백슬래시로 인용해야 해요. 그러니 이렇게 하면 안 돼요.
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
이렇게 해야 해요.
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
이 점은 대부분의 언어와 다른 Tcl의 주석 해석 방식 때문에 문제가 될 수 있어요. Tcl 위키에 더 자세한 논의가 있어요.
마찬가지로, Tcl은 명령어 치환에 대괄호를 사용하기 때문에, 큰따옴표 문자열 안에서도 여는 대괄호를 이스케이프하는 일에 주의해야 해요.
연관 배열 변수를 제외하면, 소괄호는 그냥 평범한 문자예요.
Exercism에 가입하고 Tcl 트랙을 연습 문제 135개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.