GnuSmalltalkUsersGuide:BaseChapter 011

From 흡혈양파의 번역工房
Jump to navigation Jump to search
BlockClosure

BlockClosure

네임스페이스 Smalltalk에 정의됨

슈퍼클래스: Object

범주: 언어-구현


나는 만능 클래스이다. 나의 인스턴스들은 스몰토크 블록, 즉 자신이 선언된 환경으로 접근성을 가진 실행 가능 코드의 일부를 표현하고, 매개변수를 취하며, 현재 클래스 외부에서 메서드에 의해 실행될 객체로서 이리저리 전달 가능하다. block closure에는 값을 계산하고 새로운 실행 컨텍스트를 생성하기 위해 메시지가 전송된다; 제어흐름(control flow) 메서드의 구성에 이러한 프로퍼티를 이용할 수 있다. 뿐만 아니라 블록으로부터 Processes의 생성에 사용되는 메서드도 일부 제공한다.


BlockClosure 클래스: 인스턴스 생성

block: aCompiledBlock

전달된 CompiledBlock을 활성화하는 BlockClosure를 응답하라.

block: aCompiledBlock receiver: anObject

주어진 수신자를 이용해 전달된 CompiledBlock을 활성화하는 BlockClosure를 응답하라.

block: aCompiledBlock receiver: anObject outerContext: aContext

주어진 수신자를 이용해 전달된 CompiledBlock을 활성화하는 BlockClosure를 응답하라.

numArgs: args numTemps: temps bytecodes: bytecodes depth: depth literals: literalArray

주어진 수신자를 이용해 생성된 새로운 CompiledBlock에 대한 BlockClosure를 응답하라. 이것이 작동하려면 BlockClosure를 CompiledMethod의 리터럴에 넣어야 한다.


BlockClosure 클래스: 검사하기

isImmediate

x가 수신자의 인스턴스일 경우 x copy ==x의 여부를 응답하라.


BlockClosure: 접근하기

argumentCount

수신자에게 전달된 인자의 수를 응답하라.

block

수신자의 바이트코드를 포함하는 CompiledBlock를 응답하라.

block: aCompiledBlock

수신자의 바이트코드를 포함하는 CompiledBlock를 설정하라.

finalIP

수신자에 의해 실행 가능한 마지막 명령어(instruction)를 응답하라.

fixTemps

이는 블록 내에서 사용되는 임시 변수의 값을 고정하는데, 이러한 값은 주로 블록이 정의된 메서드와 공유된다. 아직 정의되진 않았으나 해가 될 것은 없다. 수신자를 응답하라.

initialIP

수신자에게 첫 명령어 포인터를 응답하라.

method

수신자가 위치한 CompiledMethod를 응답하라.

numArgs

수신자에게 전달된 인자 수를 응답하라.

numTemps

수신자가 사용하는 임시 변수의 수를 응답하라.

outerContext

수신자의 직접적 외부(immediate outer)에 해당하는 메서드/블록 컨텍스트를 응답하라.

outerContext: containingContext

수신자의 직접적 외부(immediate outer)에 해당하는 메서드/블록 컨텍스트를 설정하라.

receiver

수신자를 실행할 때 'self'로서 사용되는 객체를 응답하라 (nil인 경우 수신자가 유효하지 않음을 의미할 수도 있다...)

receiver: anObject

수신자를 실행할 때 'self'로서 사용되는 객체를 설정하라.

stackDepth

수신자에게 필요한 스택 슬록의 수를 응답하라.


BlockClosure: 빌드된 ins

cull: arg1

수신자를 평가하고, 수신자가 매개변수를 갖고 있다면 arg1를 유일한 매개변수로서 전달하라.

cull: arg1 cull: arg2

수신자를 평가하고, 수신자가 매개변수를 수락한다면 arg1와 arg2를 매개변수로서 전달하라.

cull: arg1 cull: arg2 cull: arg3

수신자를 평가하고, 수신자가 매개변수를 수락한다면 arg1, arg2, arg3을 매개변수로서 전달하라.

value

어떤 매개변수도 전달하지 않는 수신자를 평가하라.

value: arg1

arg1를 유일한 매개변수로서 전달하는 수신자를 평가하라.

value: arg1 value: arg2

arg1, arg2를 매개변수로서 전달하는 수신자를 평가하라.

value: arg1 value: arg2 value: arg3

arg1, arg2, arg3을 매개변수로서 전달하는 수신자를 평가하라.

valueWithArguments: argumentsArray

argArray의 요소를 매개변수로서 전달하는 수신자를 평가하라.


BlockClosure: 제어 구조

repeat

수신자를 '영원히' 평가하라 (사실 리턴이 실행되거나 프로세스가 종료될 때까지)

whileFalse

수신자가 true를 리턴할 때까지 수신자를 평가하라.

whileFalse: aBlock

수신자를 평가하라. false를 리턴할 경우 aBlock 를 평가하고 재시작하라.

whileTrue

수신자가 false를 리턴할 때까지 수신자를 평가하라.

whileTrue: aBlock

수신자를 평가하라. true를 리턴할 경우 aBlock 를 평가하고 재시작하라.


BlockClosure: 예외 처리

ifError: aBlock

수신자를 평가하라; #error:가 호출되면 aBlock으로 수신자와 매개변수를 전달하고, aBlock을 평가한 결과를 응답하라. 또 다른 예외가 발생할 경우 이는 외부 처리기로 전달된다; 어떤 예외도 발생하지 않을 경우 수신자를 평가한 결과가 리턴된다.

on: anException do: aBlock

수신자를 평가하라; anException이 시그널링되면 aBlock을 평가하고 예외를 설명하는 Signal을 전달하라. 수신자의 평가 결과 또는 Signal>>#return: 의 매개변수를 응답하라.

on: e1 do: b1 on: e2 do: b2

수신자를 평가하라; e1 또는 e2가 시그널링되면 각각 b1 또는 b2를 평가하고 예외를 설명하는 Signal을 전달하라. 수신자의 평가 결과 또는 Signal>>#return: 의 인자를 응답하라.

on: e1 do: b1 on: e2 do: b2 on: e3 do: b3

수신자를 평가하라; e1, e2 또는 e3 가 시그널링되면 각각 b1, b2 또는 b3를 평가하고 예외를 설명하는 Signal을 전달하라. 수신자의 평가 결과 또는 Signal>>#return: 의 인자를 응답하라.

on: e1 do: b1 on: e2 do: b2 on: e3 do: b3 on: e4 do: b4

수신자를 평가하라; e1, e2, e3, 또는 e4가 시그널링되면 각각 b1, b2, b3 또는 b4를 평가하고 예외를 설명하는 Signal을 전달하라. 수신자의 평가 결과 또는 Signal>>#return: 의 매개변수를 응답하라.

on: e1 do: b1 on: e2 do: b2 on: e3 do: b3 on: e4 do: b4 on: e5 do: b5

수신자를 평가하라; e1, e2, e3, e4 또는 e5가 시그널링되면 각각 b1, b2, b3, b4 또는 b5를 평가하고 예외를 설명하는 Signal을 전달하라. 수신자의 평가 결과 또는 Signal>>#return: 의 매개변수를 응답하라.


BlockClosure: 다중 프로세스

fork

수신자를 실행하는 새 프로세스를 생성하고 시작하라.

forkAt: priority

주어진 우선순위로 수신자를 실행하는 새 프로세스를 생성하고 시작하라.

forkWithoutPreemption

선점(preempted)될 수 없는 프로세스에서 수신자를 평가하라. 수신자가 매개변수를 기대할 수 없는 경우 현재 프로세스를 전달하라.

newProcess

중지된(suspended) 상태에서 수신자를 실행하는 새 프로세스를 생성하라. 우선순위는 호출 프로세스(calling process)와 동일하다. 수신자는 리턴(returns)을 포함해선 안 된다.

newProcessWith: anArray

주어진 인자로 수신자를 실행하는 새 프로세스를 생성하고 중지된 상태로 남겨두어라. 우선순위는 호출 프로세스와 동일하다. 수신자는 리턴을 포함해선 안 된다.

valueWithoutInterrupts

aBlock을 평가하고, 실행 중에 활성 프로세스로 요청된 모든 인터럽트는 aBlock 리턴 이후로 지연시켜라.

valueWithoutPreemption

외부 인터럽트가 비활성화된 수신자를 평가하라. 블록이 제어를 명시적으로 넘겨주고 세마포어(semaphore)와 같은 것을 기다리지 않는 이상 이는 선점(preemption)을 효과적으로 비활성화시킨다.


BlockClosure: 오버라이드하기

copy

수신자를 응답하라.

deepCopy

얕은 복사(shallow copy)를 응답하라.


BlockClosure: 검사하기

hasMethodReturn

블록해당 메서드 리턴을 포함하는지 여부를 응답하라.


BlockClosure: 언와인드 보호

ensure: aBlock

수신자를 평가하라; 어떤 예외든 신호가 보내지면 aBlock의 평가 결과를 리턴하면서 종료하라; 어떤 예외도 발생하지 않을 경우 수신자가 종료될 때 aBlock을 평가한 결과를 리턴하라.

ifCurtailed: aBlock

수신자를 평가하라; 그 실행이 언와인드를 트리거하여 블록의 실행을 절단(truncate)하는 경우 (블록을 '축소'), aBlock을 평가하라. 수신자의 실행을 축소시킬 수 있는 세 가지 사례는 다음과 같다: 수신자 내 non-local 리턴, 수신자 자체를 리턴하는 수신자가 평가한 블록 내 non-local 리턴, 수신자의 실행 도중에 발생하여 재개되지 않은 예외.

valueWithUnwind

수신자를 평가하라. 블록에 의해 야기된 오류는 추적(backtrace)을 야기할 것이지만, 실행은 #valueWithUnwind를 전송한 메서드에서 호출 이후에도 계속될 것이다. 예제: [1 / 0] valueWithUnwind. 'unwind works!' printNl.


주의: 해당 메서드는 public이지만 매우 특수한 사례에서 사용되도록 의도한 것이다 (경험으로 보면, 이에 상응하는 C 코드가 gst_prepare_execution_environment 와 gst_finish_execution_environment 함수를 사용할 때에만 사용해야 한다). 주로 #ensure:과 #on:do: 에 의존하도록 하라.


Notes