プログラミング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がリストのときに便利ですね。