ComputerProgrammingwithGNUSmalltalk:4.1
블록
블록은 나중에 실행될 수식 표현을 담고 있는 객체입니다. 그저 대괄호 안에 작성한 코드일 뿐입니다. 블록의 예입니다.
['Hello World!' printNl.
(3 + 7) printNl]
기억해야 할 점은 작성한 블록도 객체이며, 블록 안의 코드도 바로 실행하는 것이 아니라는 점입니다. 블록에 value 라고 이름붙인 메시지를 전달해보면 다음과 같습니다.
['Hello World!' printNl.
(3 + 7) printNl] value
10
10
객체 10이 두 번 출력되었는데, 블록의 소스코드 중 마지막 수식표현의 값으로 객체 10을 반환하였기 때문입니다. 다시 말하지만, 이것은 터미널에서 인터렉티브 모드로 코드를 수행하였을 때의 얘기입니다.
제어 표현에서 보겠지만, 블록은 매우 유용한 객체 구조입니다. 제어 표현으로 들어가기 전에, 블록의 요소 중 하나인, 블록의 인자에 대해 말해보겠습니다.
때때로 블록은 안의 코드에서 처리해야 할 추가 자료를 필요로 하는 경우가 있습니다. 그 때에는 추가적인 자료를 하나 이상의 블록 인자로 만들어서 전달하면 됩니다. 보통 인자를 갖는 블록의 구조는 다음과 같습니다.
[:blockArgument1 :blockArgument2 | block-expression-1. block-expression-2]
블록 인자들은 블록의 시작 부분에 위치하며, 모든 인자들은 앞에 콜론을 붙이도록 되어 있습니다. 블록의 인자부분은 파이프 문자로 블록의 주요 내용과 구분합니다.
앞으로 대부분 이러한 종류의 블록을 특수한 메시지와 함께 사용할 것입니다. 그러나 여러분이 이러한 블록을 직접 사용하길 원한다면, 여러분은 인자 갯수만큼의 value: 메시지를 포함한 선택자를 갖춘 메시지를 보내야 할 것입니다. 예를 들어, 블록이 세 개의 인자를 필요로 한다면, 여러분은 value:value:value: 선택자를 사용해야 할 것입니다.
예제로 이 주제를 마무리하겠습니다.
"blocks.st"
"A program which involves a block with an argument."
| greetings |
greetings := [:platesOfCornFlakes | 'I have eaten ', platesOfCornFlakes printString, ' plates of corn flakes this morning!'].
('Hello ma! ', (greetings value: 3)) printNl.
여기서 가장 먼저 앞으로 만들게 될 블록을 가리킬 greetings라는 변수를 만들었습니다. 그리고 인자가 있는 블록을 생성하여 변수에 지정했습니다. 주의할 점은 표현식 안에서 인자를 쓸 때에는 인자 앞에 콜론을 붙이지 않았다는 것입니다. 인자를 선언할 때에만 콜론을 쓰고, 이후에는 생략합니다. 마지막으로 greeting value: 3 이라는 표현과 함께 이 블록을 실행하였습니다. 우선순위를 고려하여 괄호로 묶어주는 것을 잊지 마십시오.
이제 제어 표현으로 진행할 준비가 되었습니다.