많은 언어에서 아래와 같은 구조를 사용해서 명령을 몇 번이고 반복합니다.
예를들어 Visual Basic에서는 아래와 같은 루프가 있습니다.
For X = 1 to 100
Y = Y + X
Next
Do While X < 100
Y = Y + X
X = X + 1
Loop
스몰토크에서의 구조는 아래와 같습니다.
[ 판단조건 ] whileFalse: [ 구문 ]
[ 판단조건 ] ifTrue: [ 구문 ]
aCollection do: [ :변수1 :변수2 | 文구문]
스몰토크에서는 block(블록)이라 불리는 사각형 괄호([])를 사용합니다. 이 구조에는 두 종류의 블록이 포함되어 있습니다. 첫 블록은 논리연산입니다. 두 번째는 "일반적인" 스몰토크 구문입니다. 예를 들어보자면....
[ 당신은 배가 고픕니다 ] ifTrue: [ 무언가 먹습니다 ]
첫 블록은 논리연산구문입니다. Ture나 false중 한가지가 돌아옵니다. 그리고 루프 객체에 ifTrue: 메시지를 보냅니다. ifTrue: 메시지는 콜론이 있기 때문에 파라메터가 필요합니다. 파라메터에는 처리하고픈 방대한 양의 코드도, 혹은 단 한줄짜리라도 가능합니다. 예문은 아래와 같습니다.
[ 당신은 배가 고픕니다 ] ifTrue:
[ 덥밥집에 가세요.
덥밥을 주문하세요.
덥밥을 집에 포장해 오세요.
덥밥을 드세요. ]
whileFalse: 메시지를 사용한 이상적인 예는 한줄씩 외부 파일에서 불러오는 것입니다. 코드 예문은 아래에 나타나있습니다.
| myFile myStream myLine addrIP |
myFile := 'ws000101.log' asFilename.
myStream := myFile readStream.
[ myStream atEnd ] whileFalse: [
myLine := myStream upTo: Character cr.
Transcript show: myLine.].
myStream close.
whileFalse: 행의 조건은 스트림(파일)의 마지막에 있는지 알아보는 myStream atEnd입니다. 맨 처음 대답은 false이기 때문에 False를 whileFalse:메시지에 보냅니다. 이상하게 생각하실 수도 있습니다만, false whileFalse는 true이기 때문에 Smalltalk은 whileFalse: 메시지에 뒤이어 오는 블록 안의 코드를 실행합니다.
블록 안의 첫 행은 행 종료문자에 다다를때까지 임시변수에 스트림을 카피합니다. 그리고 Transcript에 행을 표시합니다. "파라메터" 블록의 모든 코드의 실행을 끝내면 "조건"블록으로 돌아갑니다. 그리고 다시 myStream atEnd의 조건을 검토합니다. 스트림은 모든 스트림의 끝이 아닌, 맨 처음 행의 끝까지였기 떄문에, 아직 false입니다. 따라서, Smalltalk는 다시 파라메터 블록의 코드를 실행합니다. 실행 할 때, 다음 행까지 문자열의 스트림을 불러와서 Transcript에 표시합니다. 그리고 조건 블록으로 돌아가 다시 myStream atEnd의 조건을 검토합니다.
이런 처리도 결국에는 종료됩니다. 스트림의 맨 마지막까지 오면 myStream atEnd의 조건이 true가 됩니다. 이것이 발생하면 Smalltalk는 파라메터 블록을 뛰어넘어 파라메터 블록에 이은 최초의 코드행을 처리합니다.
단 한줄의 코드로 많은 것을 하고 있습니다. 하지만, 그것은 전체의 일부에 지나지 않습니다. 어떠한 루프를 실행하고, 조건을 테스트하는 것은 어느 소프트웨어든지 항시 일어나는 일입니다. 그렇기에, Smalltalk 창시자는 이러한 일련의 작업을 실행하는 구문을 간단히 만드려고 했습니다.
여기서 또 하나의 예를 표시하겠습니다. 프로그래머는 컬렉션이나 배열에 대해 대해 반복처리를 실행하고자 합니다. 이는 단 1행의 코드를 기술함으로써 처리할 수 있습니다.
| mySC |
mySC := SortedCollection new.
mySC add: 'one'.
mySC add: 'two'.
mySC add: 'three'.
mySC add: 'four'.
mySC add: 'five'.
mySC do: [ :X | Transcript show: X; cr.].
이것은 do 루프의 예입니다. 임시변수 mySC는 다섯개의 단어를 격납해, Transcript에 하나하나 단어를 표시합니다. do 블록이 사용된 컬렉션에 대해 반복 처리를 실행합니다. do 블록은 두 개의 부분으로 구성되어있습니다. 첫 부분은 임시변수(위의 경우 X)를 선언합니다. 두 번째 부분은 단순히 스몰토크문을 기술한 곳입니다. 두 부분은 세로줄로 분할합니다.
임시변수 X의 선언에서는 처음에 콜론을 기술합니다. do 블록 두 번째는 많이 본 Transcript show:문이 있습니다. Transcript에 표시된 내용은 정렬된 컬렉션 값(내용)입니다. mySC 컬렉션의 모든 요소는 do 블록의 임시변수 X에 전달됩니다. Transcript show:문은 mySC 컬렉션의 모든 요소에 대해 반복을 진행합니다. 이것은 다음과도 같이 말할 수 있습니다. "정렬된 컬렉션의 각 요소를 취득하여 그 요소를 Transcript에 표시한다"
|