[scheme] Andrew Wright の match を移植する
Gauche の util.match となっている Andrew Wright 氏の match を移植しました。
自前の処理系に他人の書いた大きめのコードを投入すると処理系の良くないところや性質が見えてきます。
以下移植メモです。
- 移植対象は match-slib.scm 。ちなみに処理系はまだ SLIB に対応していません
- (and) は #t という仕様が抜けていたので修正
- (cond (3)) は 3 という前提のコードがあった。
仕様上はそんなことはないと思ううそでした。仕様にありました。shiroさんご指摘ありがとうございます。 - cddddr など4段の car/cdr 組み合わせの手続きが必要
- defmacro という伝統的マクロが必要。define-macro と微妙に形が違うので修正
- quasiquote の中の quasiquote にある unquote-splicing の展開に想定動作との違いが見られた。 append でごまかした
- gentemp が必要なので gensym で代用
- let で filter-map-with-index などのローカル手続きを定義し、それがマクロ展開の結果に含まれるようなコードは自前処理系では動かないので手続きの外側に追い出した。
まだ
(print (match '(the answer is 42) (`(the answer is ,value) value) (else #f)))
が動いていない。