2020年5月18日月曜日

mapcarとloop

 elispを独習しはじめたころ、おおっ、と感動したのは「mapcar」の存在だった。
 何を感動したのか、というと、それがループ処理だった、ということ。よくあるバグにループの脱出条件のミスって永久ループしてしまう、というのがあるけれど、これならかならず、終了するじゃないか。なので最初のころ書いたコードは「mapcar」だらけになってしまった。
 ところがある日、そのコードを読み返していて気づいた。
 ——読みづらい。
 「mapcar」の引数は

(mapcar 処理 リストを生成する処理)

 となっているので、処理の順番という意味ではうしろから読み解かなくていけないのだ。
 それが脳みそに余計な負荷をかけている。
 もちろんすぐにloopマクロの存在に気づいて、今ではloopマクロを使いまくりなのだけど。

( loop for x in リストを生成する処理
      collect 処理)

 こちらの方が「リストを生成する処理」「処理」と読んでいけるのでものすごく楽。
 今や「mapcar」はワンラインで書けるサイズでないと、書く気がしない、という。