2009/02/14

[scheme][Gauche]lambda記法⇒MIT記法

プログラミングGauche」P.75~76 構文の拡張とマクロ

 

 

取り合えず「quate」がまだ正式に出てきてない段階なので「quate」「'」があまりよくわからないので少し試し書き。

evalとか試してみた。引数が2つ必要みたいだけど、何を渡したらいいのか調べず、取り合えず'()を渡したら動いたので続行。

;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x))
(define exp '(define double (lambda (x)(* x x))))

 

exp
;; => (define double (lambda (x)(* x x)))

 

(eval exp '())
;; => double

 

double
;; => #<closure double>

 

(double 5)
;; => 25

 

(define double 1)
double
;; => 1

 

exp
;; => (define double (lambda (x)(* x x)))


(eval exp '())
;; => double


(double 5)
;; => 25

 

'(define double (lambda (x)(* x x)))に対してのcarとcdrの動作を確認してみる。

;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x))
(define exp '(define double (lambda (x)(* x x))))


(car exp)
;; => define


(car (cdr exp))
;; => double


(car (cdr (car (cdr (cdr exp)))))
;; => (x)


(cdr (cdr (car (cdr (cdr exp)))))
;; => ((* x x))

 

ようやく本題。lambda記法をmit記法に変換。コメントのために少しインデントを崩してます。

;; (define double (lambda (x)(* x x)))
;; lambda -> mit
(define (lambda->mit exp)
  (cons (car exp) ;; -> define
        (cons (cons (car (cdr exp)) ;; => double
                    (car (cdr (car (cdr (cdr exp)))))) ;; => (x)
              (cdr (cdr (car (cdr (cdr exp))))) ;; => ((* x x))
              ) ;; => ((double x) (* x x))
        ) ;; => (define (double x) (* x x))
  );; => lambda->mit

 

(lambda->mit exp)
;; => (define (double x) (* x x))

 

(define a (lambda->mit exp))
;; => a

 

(eval a '())
;; => double

 

(double 3)
;; => 9

0 件のコメント:

コメントを投稿