중괄호 없는 expr는 할 수만 있다면 Tcl에서 금지하고 싶은 습관이에요! 스타일 지적처럼 보이지만 전혀 아니에요.
set qty {[puts "side effect"; list 3]}
puts [expr {$qty == 3}]
puts [expr $qty == 3]
중괄호 버전은 0을 찍어요. 바이트코드 컴파일러가 $qty == 3을 식으로 보고, 변수를 한 번 읽고, 이상한 문자열을 3과 비교해요. 중괄호 없는 버전은 side effect를 찍고 나서 1을 찍어요. Tcl이 명령의 단어를 만들면서 $qty를 치환하니까 expr는 [puts "side effect"; list 3] == 3이라는 텍스트를 받고, 거기서 자기 차례의 치환을 한 번 더 해요. 그때 대괄호 안의 명령이 실행돼요. 치환이 두 번이고, 두 번째 치환은 변수에 들어 있던 걸 뭐든 실행해요.
여기까지가 재밌는 부분이고, 조용한 부분은 속도예요. 중괄호 없는 형태는 미리 컴파일할 수 없어서 실행될 때마다 파싱돼요. 여기선 9.1에서 확인했지만, 이건 아주 오래전부터 그랬어요.