데이터 구조 안 쓰고 cons, car, cdr 정의하기 (SICP 118쪽) 학술

이렇게 괴상할 수가 !! ㅠㅠ
데이터 자체를 프로시저로 표현했다.
실제로 이런 기교를 부린 코드를 보니 너무 충격적이다.
(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Argument not 0 or 1 -- CONS" m))))
  dispatch)

(define (car z) (z 0))
(define (cdr z) (z 1))
Message Passing 이라고 부른단다.

또, 변형된 다른 방법으로..
(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

이제 (car (cons 1 2)) 를 호출하면 아래와 같이 치환해서 생각해보자.
((lambda (m) (m x y)) (lambda (p q) p)))
(((lambda (p q) p) x y)
x
으아 이런게 풀어 써보지 않고 1초만에 바로 보이면 업계 사람하고는 거리가 먼 괴물일 것이다 (..);;
다  봤으니 연습문제 2.4는 아래와 같이 간단하게 끝내자.
(define (cdr z)
  (z (lambda (p q) q)))

> (car (cdr (cons 1 (cons 2 3))))
2
어지럽지만 연습문제 2.6도 한 번 해보자. 0과 1을 프로시저 연산으로 나타낸다고?
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n) (lambda (f) (f ((n f) x))))
(add-1 zero)를 풀어보자.
(lambda (f) (f (((lambda (z) (lambda (x) x)) f) x)))
(lambda (f) (f ((lambda (x) x) x)))
(lambda (f) (f x))
잘 모르겠으니 add-1을 한 번 더 해보자.
(lambda (f) (f (((lambda (f) (f x)) f) x)))
(lambda (f) (f ((f x) x)))
Church Encoding
내가 뭔가 전개를 잘못했나..
전개로 알아보려고 한게 잘못인가 음..
뭔가 알듯말듯한데 알쏭달쏭 므겡므겡 음음음

더하기 하는 방법이 개념적으로는 생각났는데 확인할 방법이 없어서 음음
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
(define (plus a b) (lambda (f) (lambda (x) ((a f) ((b f) x)))))
이거일거란 생각은 드는데 답이 없어서 확인을 못 하겠다 (...)

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://www.xeraph.com/tb/4029897 [도움말]

덧글

  • holies 2007/12/24 02:30 # 삭제 답글

    항상 xeraph 님의 lisp 포스팅에서 많은 것을 배웁니다. ACL 사서 공부하고 싶었는데 구하기가 어려워서 엄두가 안 나네요. 그럼 다시 조용히 눈팅하러... :)
  • xeraph 2007/12/24 08:35 # 답글

    그냥 아마존 주문하면 되긴 하지만 역시 비싸죠 ^^;
  • xeraph 2007/12/24 09:11 # 답글

    주소랑 전화번호랑 성함 비밀글로 남겨주시면 제가 크리스마스 선물로 ANSI Common LISP 하나 주문 넣어드릴게요~
  • holies 2007/12/24 11:35 # 삭제 답글

    정말요?!? 그런데 이런 거 덥석 받아도 될란가 모르겠네요... =_=
  • xeraph 2007/12/24 11:36 # 답글

    그럼요ㅋ 저도 누가 책 안 사주나 할 때 많았는데 지금은 직장인이라 원 없이 사서 보고 있으니까 하나쯤은 ^^
댓글 입력 영역