SqueakByExample:4.4

From 흡혈양파의 번역工房
Revision as of 12:39, 22 August 2012 by Onionmixer (talk | contribs) (스타일 수정)
Jump to navigation Jump to search

키워드 메시지를 식별하기 위한 힌트

종종, 초보자들은 언제 괄호를 넣어야 할지에 대한 이해에 있어 문제를 갖고 있습니다. 이제, 컴파일러에 의해 어떻게 키워드 메시지가 인식되는지 보겠습니다.

괄호를 넣을지에 대한 여부

문자 [, ], 와 분명히 범위를 정한 영역. 이러한 영역 내에서, 키워드 메시지는 문자 ., 또는 ; 로 잘라지지 않는 :에 의해, 종료되는 단어들의 가장 긴 시퀀스입니다. 문자 [, ],과 콜론으로 몇몇 단어들이 둘러싸일 때, 이러한 단어들은 정의된 영역에 로컬인 키워드 메시지에 동참하게 됩니다.

이 예시에서, 두 개의 분명한 키워드 메시지가 있습니다. rotatedBy:magnify:smoothing:at:put:. 입니다.


aDict
  at: (rotatingForm
    rotateBy: angle
    magnify: 2
    smoothing: 1)
    put: 3


문자 [, ], 와 분명히 범위를 정한 영역. 이러한 영역 내부에서,
키워드 메시지는 문자 ., 또는 ;에 의해 잘라지지 않고 :에 의해 종료되는 단어들의 가장 긴 시퀀스입니다.
문자 [, ],과 콜론으로 몇몇 단어들이 둘러싸일 때,
그러한 단어들은 정의된 영역에 로컬인 키워드 메시지에 동참하게 됩니다. (키워드 메시지가 됩니다:역주)


HINT. 만약 여러분이 이 우선권 규칙에 어려움을 느낀다면, 동일한 우선권을 가진 두 개의 메시지를 구별하기를 원할 때마다 여러분 스스로 단순히 괄호를 넣어 시작할 수 있습니다.


다음 코드 조각은 괄호를 필요로 하지 않습니다. 그 이유는 메시지 보내기 x isNil이 단항이므로, 키워드 메시지 ifTrue:보다 먼저 발송되기 때문입니다.

(x isNil)
  ifTrue:[...]


다음 코드 조각은 괄호를 필요로 합니다. 그 이유는 메시지 includes: and ifTrue: 둘 모두 키워드 메시지 이기 때문입니다.

ord := OrderedCollection new.
(ord includes: $a)
  ifTrue:[...]

괄호 없는 알려지지 않은 메시지 includes:ifTrue:는 컬렉션에 보내질 것입니다.

언제 [ ] 또는 ( )를 사용할까요?

여러분께서는 또한 괄호보다는 꺽쇠괄호를 사용할 때를 몰라 어려움을 겪고 계실 수 있습니다. 여러분이 [ ]를 사용해야 할 때를 아는 기본 원리는, 어쩌면 0번일 수도 있지만 얼마나 많이 표현식이 평가 되어야만 하는지를 모를 때 입니다. [표현식(expression)]은 컨텍스트에 기초하여 어떤 횟수라도 평가할 수 있는(0번도 가능) 블록 클로져(block closure)를 만들 것입니다. (예, 오브젝트) 표현식은 메시지 보내기, 변수, 리터럴(literal), 할당(assignment) 또는 블록들 중 어떤 것도 될 수 있습니다.

그러므로, ifTrue: 또는 ifTrue:ifFalse:의 가지(branch)는 블록을 요구합니다. whileTrue: 메시지의 수신자(the receiver)와 인수(the argument) 이 둘의 동일한 원리를 따르는 것들은 꺽쇠괄호 사용을 요구합니다. 그 이유는 우리가 수신자 또는 인수가 얼마나 많은 횟수만큼 평가되어야 하는지를 모르기 때문입니다.

다시말해, 괄호는 단지, 메시지를 발송 순서에만 영향을 미칩니다. 그러므로, 표현식은 항상 정확히 한번만 평가 될 것입니다.

[ x isReady ] whileTrue: [ y doSomething ] "both the receiver and the argument must  
    be blocks"
4 timesRepeat: [ Beeper beep ]             "the argument is evaluated more than once
    , so must be a block"
(x isReady) ifTrue: [ y doSomething ]      "receiver is evaluated once, so is not a
    block"

Notes