SqueakByExample:3.6: Difference between revisions
Onionmixer (talk | contribs) (SBE 간단하게살펴보는조건과루프 페이지 추가) |
Onionmixer (talk | contribs) (스타일 수정) |
||
Line 8: | Line 8: | ||
(17 * 13 > 220) | (17 * 13 > 220) | ||
ifTrue: [ 'bigger' ] | ifTrue: [ 'bigger' ] | ||
ifFalse: [ 'smaller' ] | ifFalse: [ 'smaller' ] ⇒ 'bigger' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 16: | Line 16: | ||
n := 1. | n := 1. | ||
[ n < 1000 ] whileTrue: [ n := n*2 ]. | [ n < 1000 ] whileTrue: [ n := n*2 ]. | ||
n | n ⇒ 1024 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 24: | Line 24: | ||
n := 1. | n := 1. | ||
[ n > 1000 ] whileFalse: [ n := n*2 ]. | [ n > 1000 ] whileFalse: [ n := n*2 ]. | ||
n | n ⇒ 1024 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 32: | Line 32: | ||
n := 1. | n := 1. | ||
10 timesRepeat: [ n := n*2 ]. | 10 timesRepeat: [ n := n*2 ]. | ||
n | n ⇒ 1024 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 40: | Line 40: | ||
result := String new. | result := String new. | ||
1 to: 10 do: [:n | result := result, n printString, ' ']. | 1 to: 10 do: [:n | result := result, n printString, ' ']. | ||
result | result ⇒ '1 2 3 4 5 6 7 8 9 10 ' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 52: | Line 52: | ||
result := String new. | result := String new. | ||
(1 to: 10) do: [:n | result := result, n printString, ' ']. | (1 to: 10) do: [:n | result := result, n printString, ' ']. | ||
result | result ⇒ '1 2 3 4 5 6 7 8 9 10 ' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 58: | Line 58: | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
(1 to: 10) collect: [ :each | each * each ] | (1 to: 10) collect: [ :each | each * each ] ⇒ #(1 4 9 16 25 36 49 64 81 100) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 64: | Line 64: | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
'hello there' select: [ :char | char isVowel ] | 'hello there' select: [ :char | char isVowel ] ⇒ 'eoee' | ||
'hello there' reject: [ :char | char isVowel ] | 'hello there' reject: [ :char | char isVowel ] ⇒ 'hll thr' | ||
'hello there' detect: [ :char | char isVowel ] | 'hello there' detect: [ :char | char isVowel ] ⇒ $e | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 72: | Line 72: | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
(1 to: 10) inject: 0 into: [ :sum :each | sum + each ] | (1 to: 10) inject: 0 into: [ :sum :each | sum + each ] ⇒ 55 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 12:22, 22 August 2012
간단하게 살펴보는 조건과 루프 (Conditionals and loops in a nutshell)
스몰토크는 컨트롤 구성(control constructs)을 위한 특별한 구문을 제공하지 않습니다. 대신에, 컨트롤 구성은 인수로서의 블록과 함께, 메시지를 불리언(booleans), 숫자(numbers) 그리고 컬렉션(collections)에 보냄으로서 표현됩니다.
조건들은(conditionals) 메시지 ifTrue:, ifFalse: 또는 ifTrue:ifFalse: 들중 하나를 불리언 표현식의 결과에 보냄으로서 표현됩니다. 불리언에 대해 좀더 많은 내용을 원하시면 8장을 보십시오.
(17 * 13 > 220)
ifTrue: [ 'bigger' ]
ifFalse: [ 'smaller' ] ⇒ 'bigger'
루프는 메시지를 블록, 정수 또는 컬렉션을 블록에 보냄으로써 전형적으로 표현되었습니다. 루프를 위한 나가기 조건(the exit condtion)이 반복적으로 평가되었으므로, 루프는 불리언 값 보다는 블록이 되어야만 합니다. 여기에 절차상의 루프에 대한 예가 있습니다:
n := 1.
[ n < 1000 ] whileTrue: [ n := n*2 ].
n ⇒ 1024
whileFalse: 나가기 조건을 뒤바꿉니다.
n := 1.
[ n > 1000 ] whileFalse: [ n := n*2 ].
n ⇒ 1024
timesRepeat: 고정된 반복(iteration)을 실행하기 위한 단순한 방법을 제공합니다:
n := 1.
10 timesRepeat: [ n := n*2 ].
n ⇒ 1024
우리는 메시지 to:do를 루프 카운터(a loop counter)의 초기 값(initial value)로서 기능하는 숫자에 보낼 수 있습니다. 두 개의 인수는 상한(上限)과(the upper bound)와 자신의 인수로서 루프카운터의 현재 값을 취하는 블록입니다:
result := String new.
1 to: 10 do: [:n | result := result, n printString, ' '].
result ⇒ '1 2 3 4 5 6 7 8 9 10 '
높은-자릿수 반복자(High-order lterators)
컬렉션들은 많은 숫자의 다양한 클래스로 이루어져 있으며, 그것들 중 많은 클래스는 동일한 프로토콜을 지원합니다. 이러한 컬렉션들을 위해 반복처리하는(iterating) 가장 중요한 메시지는 do:, collect:, select:, reject:, detect: 그리고 inject:into:.을 포함합니다. 이러한 메시지들은, 고도로 압축된 코드를 쓰기 위한 고급 반복처리자(high-level iterators)를 정의할 수 있도록 해줍니다.
인터벌(interval)은 시작에서 끝까지 숫자의 시퀀스를 반복처리 해주는 컬렉션입니다. 1 to:10은 1에서 10까지의 인터벌을 나타내며, 우리는 메시지 do:를 이것에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 평가되는 블록입니다.
result := String new.
(1 to: 10) do: [:n | result := result, n printString, ' '].
result ⇒ '1 2 3 4 5 6 7 8 9 10 '
collect: 각 구성요소를 변화시켜, 동일한 크기의 새로운 컬렉션을 만듭니다.
(1 to: 10) collect: [ :each | each * each ] ⇒ #(1 4 9 16 25 36 49 64 81 100)
새로운 컬렉션을 만들고, 각각의 컬렉션은 불리언 블록 조건(the Boolean block condition)을 만족시키는 구성요소의 서브세트(subset)를 포함합니다. detect:는 조건을 만족시키는 첫 번째 구성요소를 리턴 합니다. 문자열(strings) 또한 컬렉션이므로 모든 문자들을 반복처리 할수 있다는 것을 잊지 말아주십시오.
'hello there' select: [ :char | char isVowel ] ⇒ 'eoee'
'hello there' reject: [ :char | char isVowel ] ⇒ 'hll thr'
'hello there' detect: [ :char | char isVowel ] ⇒ $e
마지막으로, 여러분은 컬렉션이 inject:into: 메소드에서 functionalstyle fold operator를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)로 시작하고, 컬렉션의 각 구성요소를 주입하는 표현식을 사용하여 누적 결과를 발생시킵니다. 합계와(sum) 생산물은(products) 전형적인 예입니다.
(1 to: 10) inject: 0 into: [ :sum :each | sum + each ] ⇒ 55
이것은 0+1+2+3+4+5+6+7+8+9+10와 동등합니다.
컬렉션에 대한 좀더 많은 내용은 9장에서 보실 수 있습니다.