Io를 넘어서, Metaphor
내 주변 사람들은 알겠지만, 내가 고안하고 있는 프로그래밍 언어가 하나 있다. 시작한지 거의 1년이 지나서야 내가 생각한 언어가 이미 있는 Io 언어와 상당히 비슷하다는 것을 알았다. (이 언어는 여러모로 재미있는데, 그 가운데 가장 나를 충격에 빠뜨렸던 것은, 이 언어의 창시자인 Steve Dekorte—이 사람 성씨는 어떻게 읽어야 하나?—가 디자인에 조예가 있다는 것이다. 원래 디자이너인지, 디자인은 단지 취미인지, 프로그래밍이 취미인지는 나도 잘 모르겠다.)
굉장히 말랑말랑한 것이, 이 언어는 LISP과 많이 닮아 있다. 컨텍스트(context)를 해킹하여 클로져(closure)를 만들어 쓴다거나, 구문 확장을 통해 리터럴을 추가할 수도 있다. 내 취향에 꼭 맞는 언어라고 할 수 있다(그런데 난 Python을 아직 더 좋아한다. 순수하지는 않지만, 강력하기 때문이다).
그런 Io에도 부족한 느낌이 몇 있다.
컨텍스트를 해킹하여 클로져를 완전히 흉내낼 수 있지만, 그것이 명시적으로 드러나지 못한다. 메세지 인자에서 그것이 즉시 평가(evaluation)되어 전달될지, 아니면 소극적으로 평가(lazy-evaluation)될지는 미지수다.
i = 1 list(1, 2, 3) foreach(i, (i + 1) println)내가 Io의 표준 라이브러리에 아무 짓도 하지 않았다면 저것은 Python의
for i in [1, 2, 3]: print i + 1와 같은 의미의 코드였을 것이다. 하지만 내가 아래와 같이 해킹을 해두었다면,
List foreach = method(i, j, writeln(i, j))원하는대로 작동하지 않을 것이다. (정말 원하는대로 작동하지 않는다. 무슨 이유에서인지
v에 응답할 수 없다고 하는데, 대체 저v는 어디서 나오는 식별자인가? 표준 API를 건드려서 저런 에러가 나는 것 같다.)차라리 아래와 같이 작성하는 편이 훨씬 더 귀여울 것이다.
list(1, 2, 3) foreach("i", method("(i + 1) println"))한층 더 성숙하고 섹시하게 구문을 수정한다면, 심볼과 메서드를 위한 리터럴을 추가하면 되겠다.
list(1, 2, 3) foreach(:i, [(i + 1) println])공식 소개 웹 페이지에서는 키워드가 하나도 없다고 해놓았지만, 내 눈에는 여전히 몇 가지 강제된 것들이 보인다.
:=,=는 키워드와 다를 것이 없다.+,-,*,/,%,..등의 기본적인 연산자는 분명 정해져 있다. 평가 우선순위를 예외적으로 가진다는 것이 그 증거이다.yield,call과 같은 경우도 역시 강제된 식별자다. (저것이 언어 안쪽에서 해킹 가능하다면, 이 목록에서 빼도 좋다. 확실하지 않아서 추가했다. 그럼에도 저런 이름 대신 특수 기호가 더 멋진 작명이 되었을 것이다.)
굳이
setSlot()과updateSlot()을 구분할 이유가 있을까? 난 아직도a := 1와a = 1를 구분해서 써야 하는 이유를 모르겠다.최상위 컨텍스트가 사실은
Object인스턴스의 슬롯이라는 것은 멍청해 보인다. (내가 Ruby에서 느낀 실망감을 그대로 안겨주었다.)Io> type ==> Object
최소주의 디자인 목표를 가진 Io와 나의 이상적 언어 모델이 굉장히 유사하긴 하지만, 조금 다른 부분도 있는 것 같다.
나는 명시성이 상당히 중요한 부분이라고 생각한다. 그런 의미에서, 나는 덕 타입(duck type)을 더 좋아하긴 하지만, 때때로 타입 힌팅(type hinting)이 필요하다고 생각한다.
같은 기능을 하는 언어적 요소는 단 하나만 있어야 한다. 그리고 그 요소의 실체들은 반드시 동등해야 한다. 연산자와 메서드를 구분할 필요가 있을까? 동사적 요소는 메서드로 통합하고, 그것들 사이에 예외적인 평가 우선 순위가 있어서는 안 된다.
중요한 모듈(module)에 쓸데없는 찌꺼기가 껴서는 안된다. 만약, 꼭 찌꺼기를 생성해야 하고, 그것이 어딘가에 속해야만 한다면, 쓰레기통 하나를 만들어주는 것이 낫다. (아무리 생각해도
Object는 쓰레기통이라기에는 너무 숭고한데!)
나는 위에서 말한 원칙을 지키면서 언어를 고안하고 있다. 내 소박한 목표은—그 언어가 사용되든 말든 간에—누군가 A4 용지 하나를 주고 스펙(specification)을 적어달라고 할 때, 그 자리에서 순식간에 명세 모두를 적어줄 수 있는 언어를 완성하는 것이다. 그리고 그것이 멋지게 구현된다면 바랄 것이 없겠다. 그 언어를 나는 Metaphor라고 부른다.
덧. Io는 “아이오”[ai:o]로 읽는다.

December 9th, 2006 at 12:39 AM
감동적입니다. Metaphor 많이 기대하고 있어요! 내년 대안언어축제 땐 Metaphor 세션을 볼 수 있음 좋겠네요.