GnuSmalltalkUsersGuide:BasicChapter 04

From 흡혈양파의 번역工房
Jump to navigation Jump to search
제 4 장. GNU Emacs를 위한 스몰토크 인터페이스

GNU Emacs를 위한 스몰토크 인터페이스

GNU Smalltalk에는 스몰토크 코드의 해킹을 위한 고유의 Emacs 모드가 포함되어 있다. 뿐만 아니라 실행 중인 스몰토크 시스템을 Emacs 하위창에서 상호작용할 수 있는 툴도 제공한다.

GNU Smalltalk 모드 자동 로딩하기

Smalltalk 파일을 (확장자가 .st인 파일) 편집할 때 Emacs가 자동으로 Smalltalk 모드가 되도록 만들기 위해서는 아래 행을 자신의 .emacs 파일로 추가할 필요가 있다:

(setq auto-mode-alist
    (append '(("\\.st\\'" . smalltalk-mode))
        auto-mode-alist))
(autoload 'smalltalk-mode "path/smalltalk-mode.elc" "" t)


여기서 path란 GNU Smalltalk에 포함된 두 개의 Emacs Lisp 파일이 설치되어 있는 경로를 의미한다 (기본적으로 /usr/local/share/emacs/site-lips과 비슷하다).


스몰토크 편집 모드

GNU Smalltalk 편집 모드는 스몰토크 코드를 편집하도록 돕기 위해 만들어졌다. 해당 모드는 들여쓰기(indentation)를 시도하고, 키스트로크(keystroke)를 저장하도록 조작된 템플릿 몇 가지를 제공한다.


스몰토크 구문은 매우 컨텍스트에 민감하기 때문에 메서드 정의부 대신 표현식을 편집 시 스몰토크 편집 모드는 종종 혼동에 빠지곤 한다. 특히 지역 변수를 사용 시:

| foo |
    foo := 3.
        ^foo squared !


스몰토크 편집 모드를 혼란스럽게 만드는데, 이진 연산자 | 와 'foo'라고 불리는 두 번째 인자 또한 정의부가 될지도 모르기 때문이다. 이러한 유형의 표현식을 편집 시 혼동된다면 표현식 시작 전에 더미 메서드명(dummy method name)을 넣고 편집이 끝난 후 끄집어내도록 하라:

x
| foo |
    foo := 3.
        ^foo squared!


스몰토크 상호작용자 모드

Emacs Smalltalk에서 흥미로운 기능으로 스몰토크 상호작용자(Smalltalk interactor)라는 기능이 있는데, 기본적으로 이는 스몰토크 파일을 이용해 하나의 창에서 GNU Emacs을 실행하도록 해주고, 다른 창에서 스몰토크를 실행하도록 해준다. 단일 명령으로 당신은 라이브 스몰토크 시스템에서 메서드 정의부를 편집 및 변경하고, 표현식을 평가하며, 시스템의 이미지 스냅숏을 만들기 때문에 앞서 남겨둔 것이 있다면 검색하여 전체 스몰토크 파일에서 file in할 수 있다. GNU Smalltalk를 사용한다면 이로 인해 발생하는 생산성과 기쁨은 훨씬 더 커질 것이다.


스몰토크 상호작용자를 시작하기 위해서는 GNU Emacs와 스몰토크 모드로 된 버퍼를 실행해야 한다. 이후 C-c m을 입력하면 GNU Smalltalk가 실행 중인 두 번째 창이 나타날 것이다.


이러한 창은 모든 면에서 Shell 모드 창과 같다. 스몰토크 표현식을 곧바로 입력하고, 재실행을 원하는 표현식을 포함하는 행으로 커서를 이동하여 리턴을 입력함으로써 창에서 이전에 실행한 내용을 재실행할 수 있다.


모드 행에 있는 상태를 주목하라 (예: 'starting-up', 'idle' 등). 이 상태는 스몰토크 모드로부터 다양한 명령 행을 발행 시 변경될 것이다.


스몰토크 상호작용자를 처음으로 시작하면 스몰토크는 당신을 실행 중인 창으로 데려갈 것이다. 자신의 파일이 놓인 창으로 되돌아가 나머지 상호작용자 모드 부분을 살펴보고 싶다면 그렇게 하라.


코드 범위를 실행하기 위해서는 영역(region) 주변을 표시하고 C-c e를 입력하라. 영역 안의 표현식은 스몰토크로 전송되어 평가된다. 상태는 표현식이 실행되고 있음을 표시하도록 변경될 것이다. 이는 당신이 생성하는 어떤 영역에서든 작동할 것이다. 영역이 (스몰토크에서 구문적으로 요구하는) 느낌표로 끝나지 않은 경우 자동으로 추가될 것이다.


C-c d 라는 단축키도 있는데, 이는 (M-x smalltalk-doit 으로도 호출 가능) 표현식의 시작과 끝을 알아내기 위해 단순한 휴리스틱(heuristic)을 사용한다: 즉, 느낌표로 시작되는 행을 전방향으로 찾고 스페이스, 탭 또는 주석 문자로 시작되지 않은 행을 후방향으로 찾으면서 그 사이에 있는 모든 텍스트를 스몰토크로 전송한다. 전위 인자(prefix argument)를 제공할 경우 (예: C-u C-c d를 입력하여), 휴리스틱을 건너뛰고 영역을 대신 사용할 것이다 (C-c e 와 같이).


C-c c는 메서드를 컴파일할 것이다; 이는 메서드 정의부의 한계값(bound)을 결정하는 데 유사한 휴리스틱을 사용한다. 일반적으로 당신은 메서드 정의부를 변경하고, C-c c를 입력하여 그 다음에 있는 대상으로 이동할 것이다. 메서드 정의부 전체를 컴파일하고 싶다면 메서드 정의부 전체 집합을 (methodsFor: 행에서 ! !로) 영역으로 표시한 후 C-c e를 사용해야 할 것이다.


일부 표현식을 컴파일 및 실행했다면, 다음에 스몰토크를 작동시켰을 때 작업을 다시 실행하지 않아도 되도록 작업의 스냅숏을 찍고자 할 수도 있다. 이를 위해선 ObjectMemory snapshot을 호출하는 C-c s 명령을 사용한다. 전위 인자(prefix argument)로 해당 명령을 호출 시 이미지 파일에 다른 이름을 명시 가능하며, 스몰토크를 호출할 때 명령 행에 –I 플래그를 사용함으로써 기본 이미지 파일 대신 해당 이미지 파일을 로딩시킬 수 있다.


표현식을 평가한 후 C-c p 명령을 이용해 평가 결과를 인쇄할 수도 있다. 영역을 표시하고 명령을 사용하라.


전체 파일을 (당신이 현재 작업 중인 버퍼에 있는 파일일 것이다) file in하기 위해서는 C-c f를 입력하라. 로드할 파일명을 프롬프트에 입력하거나, 리턴을 입력하면 현재 버퍼와 관련된 파일이 스몰토크로 로딩될 것이다.


GNU Smalltalk 사용을 중단할 준비가 되었다면 C-c q 명령을 이용해 깨끗하게 종료할 수 있다. 스몰토크를 다시 작동시키고 싶다거나 (그런 일이 없겠지만) 스몰토크가 이유 없이 멈춰버릴 경우, C-c m 명령을 이용하면 스몰토크는 다시 살아날 것이다. 스몰토크가 실행 중인데도 스몰토크 창이 보이지 않는다면 C-c m 를 이용해 올바로 표시되도록 한다.


해당 모드를 사용하면서 현재 창이 아닌데도 불구하고 스몰토크 창이 스크롤되어 버퍼의 하단 부위에 포커스를 유지하려는 모습을 목격할 것이다. 이는 필자가 선택한 디자인이다. 대체로는 만족스럽지만 이 문제와 관련해 여러분들의 의견을 듣고 싶다.


Notes