星田さんの記事に対するコメント。
と言うより今回は、テストデータがハッキリしたんで、ひっそりと件の問題になってる関数2つの解答例を記述しておこう。
まずはmatch-letを用いた再帰版のsaitan_wo_bunri関数から。
結果が分離されてねーじゃねーか、と言った趣もあるが、ロジック上は分離されている。
一見分離されてないように見えるのはLispのリストの性質のせいだ。
つまり、
ではあるが、
であり、
だからだ。
いずれにせよ、返り値のproper listの先頭が最短距離にはなっている。
次はmatch-lambda系を用いたfold-rightを用いた解答例だ。
やっぱデータが無いとミスるよなぁ(苦笑)。
match-lambdaは実は引数を一つしか受け取らない。従って、リスト引数を一つしか取らないGaucheのユーザーリファレンスの例だと問題がなかったが、fold系関数は最低でも引数を2つ持つラムダ式を受け取らないといけない、と言う縛りがある。
従って、ラムダリスト(※1)が複数のパターンの引数を取る場合にはmatch-lambda*を使わないとならない。言い換えると、fold系関数に与えるmatch系ラムダ式としてはmatch-lambda*を必ず使わないとならない、ってこった。
機能的にはmatch-lambdaもmatch-lambda*も同じだが、後者の方は与えられた複数の引数を一つのリストとして解釈し、それを分解しようとする。
※1: ANSI Common Lisp辺りでの呼称だが、ラムダ式の引数の集合や、関数の引数の集合をラムダリスト、と呼称したりする。意味は「ラムダ式用の引数群のまとまり」。