Tuesday, August 6, 2013

Scheme의 define 키워드

SICP (structure and interpretation of computer programs)를 다시 읽어보고 있는데 define이란 키워드에 문제가 좀 있는 것 같다. 또 C류에 익숙한 사람에게는 이 책이 설명하는 방식(또는 순서)이 오해를 부를 수 있을 것 같다.
(define x 1)
이건 C로 따지면
int x=1;
이라 할 수 있을 것 같은데,
(define (square x)
    (* x x))
와 같이 함수프로시저 선언을 하는 경우 define의 기능이 너무 다양한 게 아닌가 생각하게 된다. 하나는 인스턴스화된 객체고 다른 하나는 그냥 선언인데 말이지...
물론 이라 할 수도 있고
(define x 1)을
   int x() { return 1; }
에 가깝다고 해석할 여지도 있긴 하지만 그런 경우 lambda를 쓰는 게 더 정확한 거 아닌지.
책에서, substitution model에서 environment model로 evaluation model을 바꿀 때가 되어서야 (필요에 의해서) formal parameter가 포함된 define은 syntactic sugar일뿐이라는 것을 밝히는데, 처음부터 그런 syntactic sugar를 자제했으면 앞부분에 나오는 make-xxx류의 이해가 더 쉬웠을 것이다.
예를 들어
(define make-withdraw
    (lambda (balance)
        (lambda (amount)
            (set! balance (- balance amount))
            balance)))
이렇게 쓰는 것이 lambda가 두 번 등장하기 때문에 아래처럼 쓰는 것보다 의도가 더 명확해진다.
(define (make-withdraw balance)
    (lambda (amount)
        (set! balance (- balance amount))
    balance))

프로시저, 묶인다(binding), referentially transparent 등 좋은 개념들이 많이 나오지만 스크립트 언어를 자작하지 않는 한 대부분의 사람에게 읽고자 하는 의욕이 안 생기게 하는 책일 것 같다. ㅋ

지금 알고 있는 걸 그때도 알았더라면...

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...