요즘 Io로 시간날 때 이것 저것 장난치며 놀고 있는데, 모든 것이 다 교체가 가능하다는 말에, 한글로 프로그래밍도 제법 가능할까 하는 생각이 들어서, 한번 쑥 바꿔봤습니다. 흐흐. 우선, 기본적으로 Io는 한글이 식별자로 쓰이지 못하기 때문에 패치를 해야하는데, IoLexer.c에서 글자 읽는 부분을 패치를 했습니다. (아직은 임시로 테스트해보기 위한 흉악한 패치입니다. =3)
그래서 이제 코드가 어떻게 보일지 무척 궁금해서 얼마 전에 코드 레이스 관객 문제를 Io로 풀었던 것을 고쳐 봤습니다. 우선, 원래의 Io코드는 이렇게 됐습니다. (창준형이 수정해 줌)
Sequence applyByGroup := method(msg,
rechar := self at(0)
repeats := 0
self asMutable append(0) foreach(ch,
if(rechar != ch,
msg(rechar, repeats)
repeats = 0; rechar = ch)
repeats = repeats + 1
)
)
current := "1"
(Lobby args at(0) asNumber - 1) repeatTimes(
next := Sequence clone
current applyByGroup(block(ch, repeats,
next appendSeq(ch asCharacter, repeats asString)))
current = next
)
current linePrint
이제 한글로 프로그래밍하려면, 기본 객체들이나 메쏘드들 이름을 일일이 바꾸는 초기화 루틴이 필요한데, 그 부분을 이렇게 넣어 봤습니다.
// 기본 오브젝트 메쏘드
슬롯 := getSlot("getSlot")
만약에 := 슬롯("if")
메쏘드 := 슬롯("method")
복사 := 슬롯("clone")
코드뭉치 := 슬롯("block")
// 오브젝트
연속열 := Sequence do(
의 := 슬롯("at")
추가 := 슬롯("append")
하나씩 := 슬롯("foreach")
숫자로 := 슬롯("asNumber")
덧붙이기 := 슬롯("appendSeq")
한줄로출력 := 슬롯("linePrint")
변경가능하게 := 슬롯("asMutable")
)
입구 := Lobby do(
인자 := 슬롯("args")
)
숫자 := Number do(
번반복 := 슬롯("repeatTimes")
글자로 := 슬롯("asCharacter")
문자열로 := 슬롯("asString")
)
목록 := List do(
의 := 슬롯("at")
)
// 지역객체
Locals 자신 := 메쏘드(self)
번역은 대충 일단 간단하게만.. 흐흐;; 그러면 위의 개미수열 소스가 이렇게 됩니다.
연속열 같은것끼리 := 메쏘드(추가명령,
반복글자 := 자신 의(0)
반복횟수 := 0
자신 변경가능하게 추가(0) 하나씩(글자,
만약에(반복글자 != 글자,
추가명령(반복글자, 반복횟수)
반복횟수 = 0; 반복글자 = 글자)
반복횟수 = 반복횟수 + 1
)
)
개미 := "1"
(입구 인자 의(0) 숫자로 - 1) 번반복(
다음개미 := 연속열 복사
개미 같은것끼리(코드뭉치(코드, 반복횟수,
다음개미 덧붙이기(코드 글자로, 반복횟수 문자열로)))
개미 = 다음개미
)
개미 한줄로출력
이히히. 아무래도 대/소문자 구분이 없다보니 약간 코드가독성이 떨어지는 것 같기도 하고.. 한데, 나름대로 교육용 언어로는 괜찮을 것 같기도 하고… 띄어써야 할 부분이 문법과 다른 게 좀 거시기하고… (애매하군요 -.-;;)