2009/02/14

[scheme][Gauche]MIT記法をlambda式による定義に変換する

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

 

こうして考えるとLisp自身を使って構文を追加できそうに思えてきませんか。

思えてきます!

 

ほぼ写経ですが。手続きの名前は好みで変えました。本ではmit-form->primitive-form。

「'(define (double x)(* x x))」を「(define double (lambda (x) (* x x))」に変換するmit->lambda手続き。

(define (mit->lambda exp)
  (cons (car exp)
        (cons (car (car (cdr exp)))
              (cons (cons 'lambda
                          (cons (cdr (car (cdr exp)))
                                (cdr (cdr exp))))
                    ()))))

 

コメント付けてみた。MeadowでM-;が便利。

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

 

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

 

「すべてがリスト」ってのはホンマですね。

0 件のコメント:

コメントを投稿