SqueakByExample:4.4: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(번역수정)
 
(용어수정)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
==키워드 메시지를 식별하기 위한 힌트==
==키워드 메시지를 식별하기 위한 힌트==


종종, 초보자들은 언제 괄호를 넣어야 할지에 대한 이해하는데 어려움을 느낍니다. 이제, 컴파일러가 어떻게 키워드 메시지를 인식하는지 보겠습니다.
종종, 초보자들은 언제 괄호를 넣어야 할지 판단하는걸 어려워합니다. 이제, 컴파일러가 어떻게 키워드 메시지를 인식하는지 살펴보겠습니다.




Line 7: Line 7:
===괄호를 넣을지에 대한 여부===
===괄호를 넣을지에 대한 여부===


문자 [, ], 와 분명히 범위를 정한 영역. 이러한 영역 내에서, 키워드 메시지는 문자 ., 또는 ; 로 잘라지지 않는 :에 의해, 종료되는 단어들의 가장 긴 시퀀스입니다. 문자 [, ],과 콜론으로 몇몇 단어들이 둘러싸일 때, 이러한 단어들은 정의된 영역에 로컬인 키워드 메시지에 동참하게 됩니다.
[, ], 문자는 범위를 뚜렷하게 구분해줍니다. 구분된 각 범위 내에서, 문자 ., 또는 ; 로 잘리지 않고 :*(콜론)으로 끝나는 가장 긴 단어 시퀀스를 키워드 메세지라고 합니다. [, ], 문자가 :(콜론)이 붙은 단어를 둘러 쌓았다면, 이 단어는 해당 영역 한정으로 정의된 키워드 메시지가 됩니다.
 
이 예시에서, 두 개의 분명한 키워드 메시지가 있습니다. '''rotatedBy:magnify:smoothing:''' 과 '''at:put:.''' 입니다.


아래의 예에는, 두 가지의 명백한 키워드 메시지가 있습니다. '''rotatedBy:magnify:smoothing:''' 과 '''at:put:.''' 입니다.


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 23: Line 22:


<center>{{HighlightDoubleBox|
<center>{{HighlightDoubleBox|
문자 [, ], 와 분명히 범위를 정한 영역. 이러한 영역 내부에서,<br>
[, ], 문자로 명확하게 범위를 정한 영역. 이렇게 구분된 각 범위 내에서,<BR>
키워드 메시지는 문자 ., 또는 ;에 의해 잘라지지 않고 :에 의해 종료되는 단어들의 가장 긴 시퀀스입니다.<br>
문자 ., 또는 ; 로 잘리지 않고 :*(콜론)으로 끝나는 가장 긴 단어 시퀀스를 키워드 메세지라고 합니다.<BR>
문자 [, ],과 콜론으로 몇몇 단어들이 둘러싸일 때,<br>
[, ], 문자가 :(콜론)이 붙은 단어를 둘러 쌓았다면, <BR>
이러한 단어들은 정의된 영역에 로컬인 키워드 메시지에 함께하게 됩니다. (키워드 메시지가 됩니다:역주)
이 단어는 해당 영역 한정으로 정의된 키워드 메시지가 됩니다.
}}</center>
}}</center>




'''HINT.''' 만약 여러분이 이 우선순위 규칙에 어려움을 느낀다면, 동일한 우선순위를 가진 두 개의 메시지를 구별하기 원할 때마다 여러분 스스로 간단히 괄호를 넣어 시작할 수 있습니다.  
'''HINT.''' 만약 이러한 우선순위 규칙이 어렵다면, 동일한 우선순위를 가진 두 개의 메시지를 구별하고 싶을때마다 사용자가 스스로 언제든지 괄호룰 사용하면 됩니다.




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


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 41: Line 40:




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


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 49: Line 49:
</syntaxhighlight>
</syntaxhighlight>


괄호 없는 알려지지 않은 메시지 includes:ifTrue:는 컬렉션에 보낼 것입니다.
괄호가 없다면 includes:ifTrue: 라는 정의되지 않은 메시지는 곧바로 ord라는 컬렉션으로 보내지게 됩니다.
 
 


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


여러분께서는 또한 괄호보다는 꺽쇠괄호를 사용할 때를 몰라 어려움을 겪고 계실 수 있습니다. 여러분이 [ ]를 사용해야 할 때를 아는 기본 원리는, 어쩌면 0번일 수도 있지만 얼마나 많이 표현식이 평가 되어야만 하는지를 모를 때 입니다. [수식(expression)]은 문맥에 기초하여 몇 번이라도 처리할 수 있는(0번도 가능) 블록 구분자<sup>block closure</sup>를 만들 것입니다. (예, 오브젝트) 표현식은 메시지 보내기, 변수, 리터럴, 할당 또는 블록들 중 어떤 것도 될 수 있습니다.
당신은 괄호보다 꺽쇠괄호를 사용할 때를 더 어렵게 느낄수도 있습니다. 0순위로 구문을 처리하고싶은경우 [ ] 를 사용하면 되고, 이것이 바로 [ ] 괄호 사용의 기본 원칙입니다. [ expression ] 구문으로 상황에 따라 반복처리(0번도 가능)가 가능한 블록(즉 블록객체)을 만들 수 있습니다. 참고로 안에 들어갈 구문은 메시지전송식, 변수, 리터럴, 할당문 또는 어떤 것이든 가능합니다.


그러므로, ifTrue: 또는 ifTrue:ifFalse:의 브랜치는 블록을 요구합니다. whileTrue: 메시지의 수신자와 인자 이 둘의 동일한 원리를 따르는 것들은 꺽쇠괄호 사용을 요구합니다. 그 이유는 우리가 수신자 또는 인수가 얼마나 많은 횟수만큼 평가되어야 하는지를 모르기 때문입니다.
이런 이유때문에, ifTrue: 또는 ifTrue:ifFalse:의 상태분기문에서는 블록을 요구합니다. 같은 이유로 수신자와 whileTrue: 메시지의 인자는 이것(수신자와 인자)들의 반복처리 횟수를 모르는경우 꺽쇠 괄호를 사용해야 합니다.


다시 말해, 괄호는 단지 메시지 발송 순서에만 영향을 미칩니다. 그러므로, 항상 정확히 한 번만 표현식을 처리할 것입니다.  
꺽쇠괄호와 달리, 괄호는 메시지를 보내는 순서에만 영향을 미칩니다. 따라서 ( expression ) 의 상황에서 expression은 반복없이 한번만 처리됩니다.


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
[ x isReady ] whileTrue: [ y doSomething ] "수신자와 인자는 반드시 블록이 되어야 합니다"
[ x isReady ] whileTrue: [ y doSomething ] "수신자와 인자 둘 다 블록이어야 합니다"
4 timesRepeat: [ Beeper beep ]            "인자는 한 번 이상 처리되므로, 블록이 되어야 합니다"
4 timesRepeat: [ Beeper beep ]            "인자를 반복적으로 처리해야 하기 때문에 블록이어야 합니다"
(x isReady) ifTrue: [ y doSomething ]      "수신자는 한번만 처리되므로, 블록이 아닙니다"
(x isReady) ifTrue: [ y doSomething ]      "수신자(이경우 ifTrue:)는 한번만 처리되므로, 블록이 필요 없습니다"
</syntaxhighlight>
</syntaxhighlight>


==Notes==
==Notes==

Latest revision as of 02:27, 17 September 2013

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

종종, 초보자들은 언제 괄호를 넣어야 할지 판단하는걸 어려워합니다. 이제, 컴파일러가 어떻게 키워드 메시지를 인식하는지 살펴보겠습니다.


괄호를 넣을지에 대한 여부

[, ], 문자는 범위를 뚜렷하게 구분해줍니다. 구분된 각 범위 내에서, 문자 ., 또는 ; 로 잘리지 않고 :*(콜론)으로 끝나는 가장 긴 단어 시퀀스를 키워드 메세지라고 합니다. [, ], 문자가 :(콜론)이 붙은 단어를 둘러 쌓았다면, 이 단어는 해당 영역 한정으로 정의된 키워드 메시지가 됩니다.

아래의 예에는, 두 가지의 명백한 키워드 메시지가 있습니다. 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:)는 한번만 처리되므로, 블록이 필요 없습니다"


Notes