[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)))

が動いていない。