見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2022/09/29〜

星田さんの記事に対するコメント。
と言うより今回は、テストデータがハッキリしたんで、ひっそりと件の問題になってる関数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-lambdamatch-lambda*も同じだが、後者の方は与えられた複数の引数を一つのリストとして解釈し、それを分解しようとする。

※1: ANSI Common Lisp辺りでの呼称だが、ラムダ式の引数の集合や、関数の引数の集合をラムダリスト、と呼称したりする。意味は「ラムダ式用の引数群のまとまり」。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング学習日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事