Lambdaカクテル

ソフトウェア開発者です.玉石混淆です.

全リストの全要素にprocedureを適用する関数

ついさっき、とあるプログラムを思いついたのでそのコーディングをしていた所、
便利なのに実装されていない*1関数を発見。
普通、map関数を複数リストで呼び出すと、同じインデックスのアイテム同士をprocedureで処理する。
この動作を拡張?して、「全てのリストの各単位に操作を行なう」関数を書いてみた。
実例を出せば、九九のリストを出力したいとき、(directmap * (iota 9) (iota 9))で処理できる関数。
大したコードではないけれども、メモを兼ねて。

(define directmap (lambda (proc L1 L2)
                  (map (lambda (n)
                         (map (lambda (m) (proc n m)) L2))
                       L1)))

ちなみに関数名であるdirectmapのdirectは、そもそも直積direct mapを出力させたかった(つまりprocが*だった)のが由来。
でもこれだと複数リストを処理できないので、あとでちょっと処理を追加する。

*1:大体このパターンだと、そのうちsrfiあたりから見付けてしまい、涙目になる。