Code Metaphor

Programming, Writing, Reading, Thoughts…

이 블로그는 더이상 운영되고 있지 않습니다. 단지 예전 URL을 유지하는 용도로만 남아 있습니다. 새 블로그의 주소는 blog.dahlia.kr입니다.

Archive for January, 2007

Phunctional: Binding—함수 인자 고정시키기

Tuesday, January 30th, 2007

디토 님의 댓글을 보고 생각나서…….

PhunctionalBinding을 사용하면 C++의 bindNth나 Python의 functools.partial 같은 효과를 낼 수 있다.

$a = map(bind2nd(new Operator('+'), 2), array(1, 2, 3, 4));
$b = array(2, 4, 6, 8);
assert($a == $b);

bind1st(), bind2nd(), bind3rd() 함수는 축약형으로, 이렇게 작성되어 있다.

function bind1st($functor, $binding_arg) {
    return new Binding($functor, array($binding_arg));
}

function bind2nd($functor, $binding_arg) {
    return new Binding($functor, array(1 => $binding_arg));
}

function bind3rd($functor, $binding_arg) {
    return new Binding($functor, array(2 => $binding_arg));
}

Binding 클래스를 직접 이용하면 좀 더 유연한 바인딩이 가능하다. 생성자는 첫번째 인자로 함수자(functor)—유사 함수 객체(function-like object)—를 받고, 두번째 인자로 바인딩할 인자의 순서와 값을 연관 배열로 받는다.

$hex2bin = new Binding('base_convert', array(1 => 16, 2 => 2));
# equals: function hex2bin($_) { return base_convert($_, 16, 2); }

덧. Phunctional 안에서 함수자는 호출 가능한 함수명 문자열이거나 Callable 인터페이스를 구현한 클래스의 인스턴스들을 말한다.

이르니아 연대기 튜토리얼 완성

Saturday, January 27th, 2007

블로그에서 이르니아 연대기에 대해 언급하는 것은 처음이다. 이르니아 연대기 튜토리얼을 탈고했다. 그런데 이르니아 연대기가 뭐냐고?

이르니아는 가상의 세계이다. 내 주변 사람들은 이것을 픽션 프레임워크(fiction framework)라고 부른다. 소설, 만화, 영화, 게임 등 픽션을 중심으로 하는 컨텐츠에게 세계를 제공해준다. 반대로 그로부터 창조된 모든 내용들이 이르니아 세계의 일부가 된다. 이렇게 말하면 감이 잘 오지 않을 수도 있지만, 자세한 것은 튜토리얼 마지막 장인 이르니아 위원회 부분을 읽으면 알 수 있다.

이르니아 연대기는 아마 최초의 계획적인 표준 픽션 프레임워크 제작 시도일 것이다. 이것은 오픈 프로젝트이기 때문에 누구나 열람 가능하고, 누구나 수정 가능하다. 게다가 무엇보다—완벽하게 표준화하고 문서화하는 것을 목적으로 하기 때문에, 픽션들 사이의 불일치를 최소화할 수 있다.

사실 이미 존재하는 픽션 프레임워크는 여러 가지가 있다. 예를 들면 무협지에서의 “무림(武林)”은 분명 하나의 픽션 프레임워크다. 하지만 그것은 어느 정도 표준적인 부분—정사(正邪), 구파일방(九派一幫)—이 있기는 하지만 그렇지 않은 부분이 더 크다. 게다가 계획적으로 만들어진 체계라고 할 수도 없다. 톨킨중간계(middle-earth)는 무척 훌륭한 픽션 프레임워크지만 엄연히 저작권 제약이 있는 닫힌 내용이다. 그 외에도 스타워즈의 세계 역시 Lucas Arts에 의해 엄격하게 표준화 및 관리되는 고품질의 프레임워크지만 아무나 가져다 쓸 수 있는 것은 아니다. D&D와 같이 표준화 및 문서화가 잘된 TRPG용 프레임워크들도 상당수 있으나, 그것들은 역사적인 부분은 대체로 공백이고, 특정 회사에 저작권이 묶여 있다. 마지막으로 그나마 가장 이르니아 연대기에 가까운 모델로 러브크래프트로부터 시작된 크툴루 신화(Cthulhu Mythos)가 있긴 하지만, 이것은 별도의 문서화가 되어 있지 않으며, 저작권 역시 애초에 열려있던 것이 아니라 작가가 사망하고 시간이 지나서야 후배 작가들이 세계를 발전시켜 나갔다. 결정적으로 이 모든 프레임워크들은 다른 누군가가 수정하거나 덧붙일 수 없는 읽기 전용(read-only) 모델이라는 점에서 이르니아 연대기와 완전히 다르다고 할 수 있다.

이르니아 연대기는 2003년부터 시작된 프로젝트인데, 사실 아직까지도 제대로 시작하지 못했다. 다만 조만간 약 20명을 모아 1박 2일 날을 잡아서 축제를 벌일 생각인데, 그것을 부트스트랩(bootstrap)으로 여기며 프로젝트를 본격적으로 시작할 생각이다. 관심 있는 분들은 임시 포럼에 들러주시라!

Phunctional: PHP에서 함수형 프로그래밍을?

Wednesday, January 24th, 2007

내가 PHP에 가지는 불만들 가운데 하나는 함수가 항상 전역적인 이름을 가져야만 한다는 것이다. 표준 함수라고 기껏 존재하는 create_function()lambda_1, lambda_2와 같이 역시나 이름을 가지는 함수를 리턴한다.

게다가 함수가 값이 아니고, 나아가 그것을 가리키는 적절한 타입조차 따로 존재하지 않는다. 대신 함수 이름의 문자열에 호출 연산자—()—가 붙으면 해당 이름의 함수를 찾아 호출한다. 뒤에 OO가 붙으며 인스턴스 메서드나 클래스 메서드에 대한 콜백도 필요해지면서 아래와 같은 웃긴 편법이 사용되기 시작했다.

$instance_method = array($instance, 'method_name');
$instance_method();

$class_method = array('ClassName', 'method_name');
$class_method();

평소 PHP에서 함수를 사용하며 느꼈던 불편들과, 바램들을 종합하여 Phunctional이라는 라이브러리를 작성해 보았다. 이번에 처음으로 공개하는 것인데, 앞으로도 계속 발전시킬 생각이다.

라이브러리 안에는 Functor, Lambda, Range, iterator-tools 등이 들어있는데, 그 중에서 가장 공들인 부분은 Lambda였다. 라이브러리를 공개한 이유도 일단 돌아가는 Lambda를 뽑아내서이다. 본래는 진정한 익명 함수를 지원하기 위해 내부적으로 PHP에서의 최소 단위 인스트럭션을 모두 분리 제공하는 방식으로 구현했는데, 디자인 자체는 썩 만족스러웠지만, 그놈의 속도가 절대 써먹지 못할 정도여서 포기했다. 다시 작성한 버전에는 렉시컬 클로징(lexical closing)을 어설프나마 추가하고—객체의 경우에는 참조가 되기 때문에 자동으로 클로즈가 되지만, 프리미티브 타입(primitive types)의 경우에는 참조 연산자를 명시적으로 붙여야 클로즈가 된다—내부적으로 표현식 코드 스트링을 생성하여 create_function()으로 넘기는 방식으로 구현을 했다. 때문에 속도는 그럭저럭 봐줄만 하지만, 엄밀한 의미에서의 익명 함수는 아니다.

현재는 아래에 설명하는 Lambda 구현을 대체하는 새로운 구현이 Phunctional에 도입되었다. 사용법도 전혀 다르고, 새로운 구현이 훨씬 깔끔하고 직관적이니 참고 바란다. PHP에서 람다 구현, Phunctional Lambda, 함수 내에서 지역 변수 클로즈하기, Phunctional Lambda: 이제 고차 함수 된다

operator 확장을 설치한 경우에는 아래와 같이 제법 깔끔하게 사용할 수 있다. (S(0) 대신 $_0을 사용해도 된다.)

assert(map(S(0) + 0.12, array(1, 2, 3, 4))
    == array(1.12, 2.12, 3.12, 4.12));

하지만, 설치 안했으면 추악한 코드가 나온다는 것! (어쩔 수 없는 한계…….)

assert(map(S(0)->__sub(1), array(1, 2, 3, 4))
    == array(0, 1, 2, 3));

대신 간단한 곳에서는 RawLambda를 사용하는 것으로 그럭저럭 타협 가능하다. PHP의 변수명이 달러 바로 뒤에 숫자가 오지 못한다는 것에 착안하여, 그것을 인자 표현식으로 사용하게 만들었다.

assert(map(lambda('$0 * 2'), array(1, 2, 3, 4))
    == array(2, 4, 6, 8));

PHP에서 DSEL을 작성하는 등 메타프로그래밍(metaprogramming)을 해볼 때마다 느끼는 것인데, 언어 자체의 어쩔 수 없는 한계라고 느끼는 것이 있다면, 그것이 현재의 내 실력으로 작성할 수 있는 코드의 한계와 일맥상통하는 것 같다. 내가 좀더 나은 코드를 작성할 수 있게 되면, 그 순간 언어의 한계라고 생각했던 것이 어느새 보이지 않게 되며 문제들이 명쾌하게 해결되는 것을 종종 보기 때문이다.

Io에서 익명 객체 리터럴 만들기

Wednesday, January 24th, 2007

Io에서는 몇 가지 구문 확장을 지원하는데, 그것을 이용하면 JavaScript의 익명 객체 리터럴을 흉내낼 수 있다. 익명 객체 리터럴이란, 간단하게 생각해서 Object clone do(msg){ msg }와 같이 표현할 수 있으면 되는 것이다.

Object curlyBrackets := method(
    o := Object clone
    call message arguments foreach(arg,
        o doMessage(arg)
    )
    return o
)

doMessage 메소드는 인자로 받은 Message 객체를 리시버의 컨텍스트에서 평가한다. {} 연산자는 curlyBrackets로 포워드되는데, 인자로 받은 메세지를 그대로 새로 복제된 객체에서 평가하면 원하는 것을 이룰 수 있다.

아래와 같이 사용하면 된다.

Io> Object clone do(a := 1; b := 2)
==>  Object_0x317e6b0:
  b                = 2
  a                = 1

Io> { a := 1; b := 2 }
==>  Object_0x3182040:
  b                = 2
  a                = 1

Io> Object { a := 1; b := 2 }
==>  Object_0x3185c50:
  b                = 2
  a                = 1

Io> curlyBrackets(a := 1; b := 2)
==>  Object_0x3189920:
  b                = 2
  a                = 1

Io> Object curlyBrackets(a := 1; b := 2)
==>  Object_0x318d5c0:
  b                = 2
  a                = 1

OpenID 지원

Tuesday, January 23rd, 2007

OpenID WordPress Plugin을 사용하여 답글에서 OpenID를 사용할 수 있게 했다.

참고로 나의 OpenID는 아래와 같다. (셋 다 같은 아이디이다.)

  • dahlia.kr
  • dahlia.pe.kr
  • dahlia.myid.net

지금은 다시 꺼버렸다. OpenID WordPress Plugin에 문제가 있다.

데스노트에 등장한 니체

Tuesday, January 23rd, 2007

기흉에 걸려 약 2주간 병원에 입원해 있었습니다.

기흉은 흔히 농담삼아 말하는 “허파에 바람 들어간” 상태를 말합니다. 허파 꽈리들 가운데 한두 개 정도가 기형적으로 합쳐져서 큰 허파 꽈리가 존재할 수도 있는데, 그런 허파 꽈리는 표면적이 넓어서 큰 충격을 받을 경우 터질 수도 있습니다. 그 결과 허파에 구멍이 생기고 허파와 허파 외벽 사이에 공기가 차는 병입니다.

저는 자연 기흉이라고 해서, 선천적으로 그런 모양의 허파 꽈리를 가지고 있던 듯합니다. 기침을 하다가 터졌는데, 그런 모양의 꽈리가 꽤 있을테니 앞으로도 조심하지 않으면 언제 터질지 모르는 일입니다. 재발률이 50%라고 합니다. 술, 담배는 하는 것이 아니라 하는 것이 되어버렸습니다—담배는 허파에 직접적인 타격이 있으니 당연한 것이고, 술은 혈압이 올라 압력을 받아 꽈리가 터질 수 있다고 합니다. 저도 기침 살짝 했다가 발현했으니, 음주로 재발할 가능성도 무시하지 못하겠죠. 격한 운동도 역시 못한다고 합니다.

첫날 옆구리를 통해 폐를 관통하는 튜브를 박았는데, 정말 아팠습니다. 예전부터 무협 소설이나 영화를 보면 칼이 꽂혀서 심장이나 폐와 같은 내장을 관통하면 대체 어떤 느낌일지 궁금했었는데, 궁금해할만한 것이 아니였습니다. 저는 폐에는 신경이 없어서 고통이 없을 줄 알았는데, 지금까지 느껴봤던 감각적인 고통들 중에서는 제일 아팠던 것 같습니다. 그래도 자존심으로 버티며 소리 지르거나 울지는 않았습니다. 보통은 튜브를 꽂아서 공기를 밖으로 빼내는 것만으로도 치유가 되지만, 저는 그렇지 않아서 수술을 한 차례 더 했는데, 전신 마취를 해서 고통은 없었습니다. 어제 튜브를 빼고 오늘 퇴원을 했는데, 다행히 튜브를 뺄 때는 아무 느낌이 없더군요.

입원해 있는 동안 너무 심심해서, 강성룡 군에게 영화를 가져다 달라고 해서 데스노트를 보게 되었습니다. 2007년 1월 현재 개봉한 그 데스노트가 아니라, 첫번째 것입니다.

데스노트에 등장한 니체—선악의 피안

보고 있는데 주인공이 니체선악의 피안(Jenseits von Gut und Böse)을 읽는 모습이 나오더군요. 대체 어떤 의도로 그런 연출을 했는지는 모르겠습니다만, 의도적이라면 잘못된 연출이라고 생각합니다.

선악의 피안은 니체 텍스트 중에서 제가 가장 좋아하는 것인데, 영화에 등장하니 반가운 한편 괜히 제가 모욕적인 느낌도 받았습니다. 니체의 말년 텍스트에서 등장하는 선악이란 시대의 최고 가치를 말하는 것인데, 데스노트에서 나오는 선악의 개념은 그런 수준이 아니지요. 무엇이 선이냐에 대해서 심심할 때마다 끄집어내긴 하지만, 니체를 끌여들일 만큼 고차원적이지도 않고(가치에 대한 재평가와는 거리가 멀죠), 작품 전체적으로 굉장히 유치한 것이 사실이지요. 니체를 얼핏 보여주는 것은 연출 상의 오바인 것 같습니다. 하긴, 일본 문화가 대체로 그런 연출이 많은 것도 같습니다. 데카당은 말할 것도 없죠. 나중에 데카당 독서법에 대해서 자세히 이야기하는 포스팅을 하겠습니다.

결론: 데스노트에서 니체 텍스트를 카메라에 비춘 것은 너무 오바였다.

WordPress로 옮겨탔다

Thursday, January 11th, 2007

Typo는 더이상 못써먹겠어서, WordPress로 옮겨탔다. 테마도 거의 동일하게 이식했고, 주소도 99% 유지된다. WordPress 기본 기능으로 태그가 없는데, 굳이 없는 기능 플러그인 추가하면서까지 태그가 절실하지도 않고, 멀티카테고리가 지원되서 그것으로 대체했다. 태그가 사라졌기 때문에 기존에 태그 목록으로의 주소도 사라져버렸다(유지하지 못한 1%의 주소).

WordPress 테마 역시 내가 직접 만들었다. 누구든지(이흥섭 빼고) 개인적으로 요청하면 보내줄 수 있다.

Typo 유감

Saturday, January 6th, 2007

어찌어찌 해서 Typo로 블로그를 만들었지만, 너무 많은 문제와 직면한 뒤로, 이제는 다른 것으로 바꿔버리고 싶어서 안달이 났다.

아래는 현재 Typo의 문제들.

  • 가끔 Markdown 필터가 알 수 없는 이유로 몇몇 포스트에만 적용되지 않는다. (캐시를 지우면 다시 제대로 동작하니 마치 Typo가 사람처럼 실수하는 듯이 느껴진다.)
  • Ruby의 Markdown 구현인 BlueCloth가 완벽하지 않다. 또, 한글과 관련해서는 제대로 작동하지 않는다. _가나다_<em>가나다</em>로 되야 하는데, 변하지 않고 그대로 남는다. (_abc_<em>abc</em>로 잘 바뀐다.)
  • 가끔 Mongrel 서버가 죽는다. 역시 원인을 못 찾겠다.
  • 프로젝트가 유지되지 않고 있다.

MetaBBS용 Markdown 플러그인

Monday, January 1st, 2007

나는 Markdown 서식자를 굉장히 좋아하는데, MetaBBS에 기본적으로 포함된 서식자는 기능이 빈약해서 Markdown 플러그인을 만들었다. 누구나 받아서 마음대로 쓸 수 있다. (PHP Markdown이 포함되어 있다.)

MetaBBS의 플러그인 시스템이 잘 되어 있어서, 쉽게 작성할 수 있었다. 그 부분이 인상적이어서, 앞으로 비슷하게 확장 가능한 시스템을 설계할 때 도움이 될 것 같았다. (WordPress의 테마 작성 방식과 대비된다.)

현재는 이 플러그인이 MetaBBS에 기본 플러그인 모음에 추가되었다. [947]

Markdown Extra 지원이 포함되었다. [1179]

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.