smalltalk 에서 printOn: 메서드

알면 알수록 미묘한 놈입니다.

사실 다음의 주소에서 관련된 예제를 볼 수 있는데요…

http://blog.naver.com/PostView.nhn?blogId=tkandrea92&logNo=80014040636&parentCategoryNo=2&viewDate=&currentPage=1&listtype=0

안드레아님이 만드신 블로그입니다.

사실 위의 주소에서는 smalltalk 과 C 비교설명 하기위한 내용을 사용이 됐습니다만….

http://live.exept.de/doc/online/english/getstart/tut_3.html

이런 내용을 보면 뭔내용인지 당체 알 수가 없었습니다.

그래서 다음의 예제를 직접 workspace 에 입력해서 결과를 알아보기로 했습니다.

| data |
data := 'Hello'.
data printString.
data printOn: Transcript.
Transcript cr;show:'8888';cr.
Transcript clear.

결과는 다음과 같습니다.(물론 transcript에서 확인할 수 있습니다)

'Hello'
8888

흐음.. 예상했던 결과기는 합니다만.. 사실 ‘Hello’ 라는 문자열(작은따옴표 포함입니다) 이 transcript에 printOn: 메시지를 날렸을때 바로 출력되는게 아니더라구요.
웬지는 모르겠습니다만….. show를 날렸을때 한꺼번에 나와서(cr만으로는 안나오는) 조만간에 cincom 에서 다시 테스트해볼 생각입니다.

http://www.cs.washington.edu/education/courses/cse341/05au/assignments/hw4.html

이 페이지를 보면 조금은 지금 작업한 예제와 비슷…..한 것을 볼 수 있습니다…..-.-;

일단 번역검수를 진행하면서 말이 이해가 안가서 좀 살펴봤습니다만….
조만간에 해당되는 method를 좀 뜯어봐야겠네요..^.^;

SBE 6.5장 디버그 예제에 대한 Pharo 2.0에서의 해결법

이전글에 이어서 이제는 해결방법을 찾아보도록 하겠습니다.
(그런데 사실 스샷까지 찍고나니 그냥 ‘.’ 넣어도 될건데 괜히 삽질했다는 생각이 이제 드네요..-.-)

1. 일단 처음 이상한 부분을 확인한건 디버그에서부터였습니다. SBE의 예제 에서 나오는 메세지를 보면 다른곳에서 에러가 나온거거든요.

detect가 아닌 dot 에서 에러발생
detect가 아닌 dot 에서 에러발생

이야.. 웃기더라구요 이거….
저 스샷의 붉은 부분을 보시면 아시겠지만 FileDirectory의 dot 이라는 method를 불러야하는데…
FileDirectory 라는 class가 없다는겁니다.
이에 대한 자세한 내용은 이글 을 참고해주시면 되겠습니다.

여튼 그럼 대안이 없나 찾아봐야겠죠. 잘 보니 일단 저 dot 이라는게 뭐인지부터 좀 찾아봐야할거같았습니다.

2. Pharo 1.4를 따로 설치해서 해당되는 Class와 method가 있는지 찾아봤습니다.

pharo 1.4  에서의 FileDirectory>>dot method
pharo 1.4 에서의 FileDirectory>>dot method

뭘 하는지 자세히 보니까 extensionDelimiter를 asString으로 반환하는군요.
그럼 extensionDelimiter를 Pharo 2.0에서 찾으면 뭔가 방법이 보일거같았습니다.

3. Pharo 2.0의 Finder에서 extensionDelimiter를 쓰는걸 찾으면 아래와같은 결과를 볼 수 있습니다.

Pharo 2.0에서 extensionDelimiter를 사용하는곳의 검색결과
Pharo 2.0에서 extensionDelimiter를 사용하는곳의 검색결과

오호라.. 잘걸렸어요? 3개 클래스정도 되네요.
이중에서 Path라는 클래스의 extensionDelimiter를 사용하는걸로 하겠습니다.
하지만 정작 제가 원하는 동작이 되는지는 모르는거죠. 그래서 간단한 테스트를 진행하기로 했습니다.

4. workspace상에서 간단한 코드를 만들어 Path>>extensionDelimiter가 원하는 동작을 하는지 확인해보도록 하죠.

Path>>extensionDelimiter method의 테스트
Path>>extensionDelimiter method의 테스트

오호… Print it을 해보니까 ‘.’ 라는 결과가 나오는걸 workspace에서 확인할 수 있었습니다.
보자보자.. smalltalk에서 ‘(single quote)로 묶인건 String이라는 의미죠. 그럼 원하는 dot(쩜)이 제대로 얻어졌다는 얘기가 됩니다.

5. 이제 테스트된 결과를 실제 suffix method에 적용을 시켜볼까요.

변경된 코드를 suffix method에 적용한 결과
변경된 코드를 suffix method에 적용한 결과

이야.. 이제 원하는 결과가 나왔군요.
이전에 FileDirectory 클래스를 찾지못해 발생된 에러가 더이상 발생하지 않으며
원래 SBE문서에서 의도했던대로 detect:ifNone: 에 의해 발생되게 됩니다.

이제 원래 문서대로 학습을 진행해도 될거같습니다 😀

Pharo 2.0과 그 이전버전의 squeak 및 Pharo의 FileDirectory의 차이

어제의 글인 이내용에 이어지는 내용이 되겠습니다만…

SBE 또는 PBE에서 볼 수 있는 debug에 대한 예제는 현시점에서 Pharo 2.0에서는 제대로 동작되지 않습니다.

그 이유는 해당되는 Category를 system browser로 비교해 보면 명백해지는데요…..

squeak 3.9 에서의 FileDirectory 클래스
squeak 3.9 에서의 File-Directory 카테고리
Pharo 2.0 에서의 FileDirectory 클래스
Pharo 2.0 에서의 File-Directory 카테고리

….
…….
어라? Pharo 2.0에는 File-Directory 카테고리 안쪽에 FileDirectory 클래스가 아예 없네요………..
………
….
야! 어쩌라고!
저 클래스가 없으면 dot(점) 문자를 얻어낼 수가 없어서 해당되는 예제를 진행할 수가 없는데!!!!!
라지만.. 이 얘기는 다른 글에서 적도록 하고….

메일링 리스트에서 관련된 부분에 대해 오화종님이 다음과같은 얘기를 알려주셨습니다.
==================================
FileDirectory 가 삭제되고, FileSystem 클래스를 대신 사용합니다. FileSystem은 보다 직관적이고 간결한 파일접근 객체입니다.
===
FileDirectory는 아주 뼈대있는 파일접근 객체(아마 ST-80부터)인데, 그런만큼 널리 쓰이고 있죠. 널리 쓰이기 때문에 제거하기 힘들게 되고 그래서 싫지만 또 쓰게 되는 악순환이 계속 되었습니다. 그런데, 5년전쯤부터 일부 유명 스몰토커들이 FileSystem이라는 것을 자체 개발하여 사용하였습니다. (일본에서는 FileMan 이라는 것을 개발하여 자기들끼리 썼습니다) Pharo1.4에서 Pharo 2.0로 넘어가면서 FileDirectory 퇴역시키고 FileSystem을 도입하였습니다. 현재 가장 급진적으로 뜯어고치는 스몰토크 집단인 Pharo에서 큰 일을 한 거죠.
==================================

결국 요지는 “없는게 맞아요” 라는거죠.
Pharo 2.0 이상을 사용하는분은 관련된 내용을 미리 숙지하고 계셔야
문제가 없을거같습니다 😀