Schemeにおけるリファクタリングのパターン

TwitterでCommon Lispのアンチパターンの話があって、Schemeでもリファクタリングの際のパターン(というほど大げさものでもないけど)があるんじゃないかと思ったので、思いつくまま挙げてみる。

  • 再帰に一時変数を導入して末尾再帰にする(基本)
    • consを使った場合には順番が逆になるので最後にreverseをかける
  • 再帰(末尾再帰)からmapã‚„applyを使う形に書き換える
    • 実際には、mapã‚„applyが適したケースは最初から自明なことも多いけど
  • 同じ計算を繰り返している部分をletでまとめる
  • 長いlambdaに内部defineで名前を付ける
  • 多値の受け渡しの方法を変更する
    • ペア(またはリスト)にして渡す
    • CPSを使う
    • values/receiveを使う(Gauche等)
      • R5RSのcall-with-valuesって使ってるの見たことないなあ
  • SRFIを使う
    • 目的に合ったシンプルな関数を自作した方がSRFIの関数より高速な場合もある。ケースバイケース


【20:15追記】

  • 複数のmap等でリストを走査している場合、処理をまとめることでリストの走査回数をなるべく少なく抑える