workspace가 궁금해졌습니다.

타이틀을 바꾸고 싶어졌어요.

그래서 삽질을 했는데…………… 반만성공

object surfing
object surfing

요즘따라 이전에 승범님이 말했던 찾고 뒤져보기에 슬슬 재미가 들리는듯도 합니다.

대략 다음과같은 과정으로 가봤습니다만… (뭐 결과는 아래쪽에)

1. 현재 열린 workspace의 타이틀을 바꾸고 싶어졌습니다.

2. self label: ‘abcd’. do it 해도 이딴건 안되네요?

3. 그럼 workspace는 어떻게 여는지 궁금해졌습니다. 그래서 worldmenu를 까서 뭘로 실행하는지를 봤죠.

4. 실행은 Smalltalk tools openWorkspace. 이야 설마?

5. 위의 구문을 Smalltalk tools workspace open. 으로 하니깐 잘되네요?

6. 슬슬 class를 찾기시작. SmalltalkImage > tool 이라는 셀렉터가 있군요.

7. 해당되는 셀렉터를 보니 값이 할당안되면 ToolRegistry 로 새로운 인스턴스를 생성해서 호출한쪽에 반환하는군요.

8. 여기까지의 결과로 보자면 Smalltalk tool. 이라고하면 비어있는 ToolRegistry 객체만 반환되면서 doit을 해봤자 아무것도 안일어나는 상황이 됩니다. 빈객체니깐요.

9 이제부터 실험. 그럼 빈객체를 반환받아서 장난을 쳐보면 어떨까?그래서 아래같은 장난을 쳐봤습니다

a := Smalltalk tools. <- doit 이후 a의 class는 ToolRegistry
b := a openWorkspace. <-  doit 이후 a의 class는 Workspace
b label:’abcd’. <- 일단 b의 객체포인터를 알고있기때문에 셀렉터로 메세지를 보낼수있다

이야.. 이렇게 해서 새로 띄운 Workspace의 타이틀을 abcd로 바꿀 수 있었습니다.

그런데 정작 타이핑을 하고있는 기존의 Workspace에는 결국 타이틀을 바꾸지 못했네요.

 

squeak에서 객체를 찾아가는 방법은 참 재미있는거같습니다. 이러다가.. 다른 smalltalk 쓸 수 있을까요 ㅎㅎㅎ

 

==============================================

메일링리스트에서 장윤재님이 알려주신 방법입니다.
이자리를 빌어(?) 다시한번 감사드립니다.

역시 멀은거같아요 ㅋㅋㅋ

제가 찾은 방법입니다. (아마도 가장 쉬운 방법…)

1) 바꿀 workspace에서 control + 클릭해서 메뉴를 보면 맨 아래에 Edit label… 메뉴가 있어요……

2) 이걸 힌트로 삼아서,
workspace 의 inspect 를 보니, workspace가 SystemWindow 군요.
SystemWindow 를 workspace 에 입력하고 블럭잡아 command+b 를 눌러서 코드를 보니,
label 카테고리가 있고, 여기에 setLabel: 메소드가 있네요.

다시 inspect 창에서 self setLabel:’test’. 로 do it 하니 창 이름이 변경되었어요- ㅎㅎ

smalltalk의 구분분석

http://trans.onionmixer.net/mediawiki/index.php?title=SqueakByExample:3.3

 

이 내용을 진행하다 보면 나오는 예제를 가지고 조금 분해해서 살펴보도록 하겠습니다.

 

2 raisedTo: 1 + 3 factorial

 

참 간단한 문장이죠?

2 는 SmallInteger

raisedTo: 이건 Interger Class의셀렉터

1 은 SmallInteger

+ 는 Integer Class의 셀렉터

3은 SmallInteger

factorial은 Integer Class의 셀렉터

 

일단 숫자는 숫자타입의 클래스에 대한 instance

고로 숫자타입은 factorial이라는 selector를 가지고있다는 의미.

그런데 3의 class는 SmallInteger. 여기에는 factorial이라는 selector가 없습니다.

 

그래서 factorial을 이런저런 방법으로 찾아봤더니 SmallInteger의 부모Class인 Integer에 factorial이 있습니다. 아하.. 이런거구나…!

smalltalk factorial find
smalltalk factorial find 찾는방법에 대한 스크린샷

 

 

그럼 구조를 다시한번 분해를 해보자면

3이라는 인스턴스의 factorial이라는 셀렉터를 실행한 결과를

1 이라는 인스턴스의 + 라는 셀렉터에 인수로 넣고

이 결과를 다시 2라는 인스턴스의 raisedTo: 라는 셀렉터에 인수로 넣어주는거죠

따져보면 사실 간단한 역산이기는 한거같습니다만…

여기서 주제는 어디까지가 인스턴스이고 어디까지가 셀렉터인가를 구분할 줄 알고 셀렉터가 속한 클래스를 알아낸후 해당 문장에 대한 구조를 분석하는게 주 목적이니.. 이정도로 pass 😀

 

 

squeak등의 smalltalk에서 smalltalk class는 대체 어떤 건가요?

Smalltalk class browse
Smalltalk class browse

 

이런저런 삽질을 좀 하다가 문득 궁금증이 생겼습니다.

그래서 World menu의 Transcript는 대체 어느 class에서 오는지를 찾다가보니

 

workspace에서 Smalltalk tools transcript open 이라고 치고 doit을 하면 Transcript가 열리네요.

 

그럼 여기에 등장하는 Smalltalk이라는 객체를 찾아보자고 해서 Inspect나 Browse를 해봐도….

뭔가 딱히 이거다! 라고 마음에 드는 내용이 없습니다.

 

혹시 이 부분에 대해서 명쾌한 답변을 주실 수 있는 분이 있으신가요?

 

==============================

감사하게도 smalltalk KR의 김승범님이 답변을 주셨습니다.

 

Smalltalk는 글로벌 딕셔너리라 보시면 됩니다.
원래 Squeak에서는 SystemDictionary의 인스턴스였는데요, Pharo는 SmalltalkImage라는 클래스를 따로 빼서 기존의 globals와 다른 이미지 관리에 필요한 기능들을 모아놨습니다.
Smalltalk inspect해보시면 모든 클래스의 이름들을 확인할 수 있습니다.
==============================
그래서 확인해봤더니 System-Support package에 SystemDictionary라는 클래스가 있네요.
이제부터는 이런식으로 좀 더 뒤져볼 생각입니다.
재미있네요 😀