プログラミングGauche mit-formとprimitive-formの変換

最近、「プログラミングGauche」を読み直しています。SICPを読んでいて行き詰まってしまったのと、実践で使えるSchemeを修得したいという考えからです。

今日はSchemeにおける関数の記法の変換をやってみました。

(define (mit-form->primitive-form expr)
  (list 'define (caadr expr)
        (list 'lambda (cdadr expr) (caddr expr))))

(define (primitive-form->mit-form expr)
  (list 'define (cons (cadr expr) (cadr (caddr expr)))
        (caddr (caddr expr))))

util.matchを使うと、もっと簡単に書けます。

(use util.match)

(define (mit-form->primitive-form expr)
  (match expr
         [('define (func . args) . body)
          (list 'define func (list* 'lambda args body))]))

(define (primitive-form->mit-form expr)
  (match expr
         [('define func ('lambda args . body))
          (list* 'define (cons func args) body)]))

list*っていう関数は、はじめて使いました。(list* a b c)は(cons a (cons b c))になります。cがリストのときに便利ですね。