요즘 Io로 시간날 때 이것 저것 장난치며 놀고 있는데, 모든 것이 다 교체가 가능하다는 말에, 한글로 프로그래밍도 제법 가능할까 하는 생각이 들어서, 한번 쑥 바꿔봤습니다. 흐흐. 우선, 기본적으로 Io는 한글이 식별자로 쓰이지 못하기 때문에 패치를 해야하는데, IoLexer.c에서 글자 읽는 부분을 패치를 했습니다. (아직은 임시로 테스트해보기 위한 흉악한 패치입니다. =3)
그래서 이제 코드가 어떻게 보일지 무척 궁금해서 얼마 전에 코드 레이스 관객 문제를 Io로 풀었던 것을 고쳐 봤습니다. 우선, 원래의 Io코드는 이렇게 됐습니다. (창준형이 수정해 줌)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |
이제 한글로 프로그래밍하려면, 기본 객체들이나 메쏘드들 이름을 일일이 바꾸는 초기화 루틴이 필요한데, 그 부분을 이렇게 넣어 봤습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// 기본 오브젝트 메쏘드 슬롯 := 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) |
번역은 대충 일단 간단하게만.. 흐흐;; 그러면 위의 개미수열 소스가 이렇게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
연속열 같은것끼리 := 메쏘드(추가명령, 반복글자 := 자신 의(0) 반복횟수 := 0 자신 변경가능하게 추가(0) 하나씩(글자, 만약에(반복글자 != 글자, 추가명령(반복글자, 반복횟수) 반복횟수 = 0; 반복글자 = 글자) 반복횟수 = 반복횟수 + 1 ) ) 개미 := "1" (입구 인자 의(0) 숫자로 - 1) 번반복( 다음개미 := 연속열 복사 개미 같은것끼리(코드뭉치(코드, 반복횟수, 다음개미 덧붙이기(코드 글자로, 반복횟수 문자열로))) 개미 = 다음개미 ) 개미 한줄로출력 |
이히히. 아무래도 대/소문자 구분이 없다보니 약간 코드가독성이 떨어지는 것 같기도 하고.. 한데, 나름대로 교육용 언어로는 괜찮을 것 같기도 하고… 띄어써야 할 부분이 문법과 다른 게 좀 거시기하고… (애매하군요 -.-;;)