SqueakByExample:4.4
키워드 메시지를 식별하기 위한 힌트
종종, 초보자들은 언제 괄호를 넣어야 할지 판단하는걸 어려워합니다. 이제, 컴파일러가 어떻게 키워드 메시지를 인식하는지 살펴보겠습니다.
괄호를 넣을지에 대한 여부
[, ], 문자는 범위를 뚜렷하게 구분해줍니다. 구분된 각 범위 내에서, 문자 ., 또는 ; 로 잘리지 않고 :*(콜론)으로 끝나는 가장 긴 단어 시퀀스를 키워드 메세지라고 합니다. [, ], 문자가 :(콜론)이 붙은 단어를 둘러 쌓았다면, 이 단어는 해당 영역 한정으로 정의된 키워드 메시지가 됩니다.
아래의 예에는, 두 가지의 명백한 키워드 메시지가 있습니다. rotatedBy:magnify:smoothing: 과 at:put:. 입니다.
aDict
at: (rotatingForm
rotateBy: angle
magnify: 2
smoothing: 1)
put: 3
[, ], 문자로 명확하게 범위를 정한 영역. 이렇게 구분된 각 범위 내에서,
문자 ., 또는 ; 로 잘리지 않고 :*(콜론)으로 끝나는 가장 긴 단어 시퀀스를 키워드 메세지라고 합니다.
[, ], 문자가 :(콜론)이 붙은 단어를 둘러 쌓았다면,
이 단어는 해당 영역 한정으로 정의된 키워드 메시지가 됩니다.
HINT. 만약 이러한 우선순위 규칙이 어렵다면, 동일한 우선순위를 가진 두 개의 메시지를 구별하고 싶을때마다 사용자가 스스로 언제든지 괄호룰 사용하면 됩니다.
메시지 전송식 x isNil 은 단항메시지 이므로, 키워드 메시지 ifTrue:보다 먼저 전달되기 때문에 아래 코드는 괄호가 필요 없습니다.
(x isNil)
ifTrue:[...]
아래 코드에서 메시지 includes: 와 ifTrue: 는 둘 다 키워드 메시지이기때문에 괄호를 필요로 합니다.
ord := OrderedCollection new.
(ord includes: $a)
ifTrue:[...]
괄호가 없다면 includes:ifTrue: 라는 정의되지 않은 메시지는 곧바로 ord라는 컬렉션으로 보내지게 됩니다.
언제 [ ] 또는 ( )를 사용할까요?
당신은 괄호보다 꺽쇠괄호를 사용할 때를 더 어렵게 느낄수도 있습니다. 0순위로 구문을 처리하고싶은경우 [ ] 를 사용하면 되고, 이것이 바로 [ ] 괄호 사용의 기본 원칙입니다. [ expression ] 구문으로 상황에 따라 반복처리(0번도 가능)가 가능한 블록(즉 블록객체)을 만들 수 있습니다. 참고로 안에 들어갈 구문은 메시지전송식, 변수, 리터럴, 할당문 또는 어떤 것이든 가능합니다.
이런 이유때문에, ifTrue: 또는 ifTrue:ifFalse:의 상태분기문에서는 블록을 요구합니다. 같은 이유로 수신자와 whileTrue: 메시지의 인자는 이것(수신자와 인자)들의 반복처리 횟수를 모르는경우 꺽쇠 괄호를 사용해야 합니다.
꺽쇠괄호와 달리, 괄호는 메시지를 보내는 순서에만 영향을 미칩니다. 따라서 ( expression ) 의 상황에서 expression은 반복없이 한번만 처리됩니다.
[ x isReady ] whileTrue: [ y doSomething ] "수신자와 인자 둘 다 블록이어야 합니다"
4 timesRepeat: [ Beeper beep ] "인자를 반복적으로 처리해야 하기 때문에 블록이어야 합니다"
(x isReady) ifTrue: [ y doSomething ] "수신자(이경우 ifTrue:)는 한번만 처리되므로, 블록이 필요 없습니다"