なんだこれは

はてなダイアリーから移転しました。

デザインパターンのテンプレートメソッドって with系マクロ + サンク?

モダンC言語プログラミング 統合開発環境、デザインパターン、エクストリーム・プログラミング、テスト駆動開発、リファクタリング、継続的インテグレーションの活用モダンC言語プログラミングをパラパラと読んでいたが、デザインパターンというものがでてきた。名前だけは聞いたことがあったんだがどういうものだろう?

まずは、テンプレートメソッド。前後に定型処理が必要なコードにつかうのが テンプレートメソッド。リソースの管理などで使用する。

間の処理をくくりだして、関数ポインタで与えるのか。なるほどなるほど。

signed int readFile(const char * fname, signed int (*process)(File *fp)){
  File *fp = fopen(fname, "r");
  if (fp == NULL) return -1;

  int res = process(fp);
  
  fclose(fp);

  return res;
}

これを common lispにしてみよう、あっ process が サンクに見えてくる。こうかな?

(defun read-file (fname thunk)
  (let* ((fp (open fname)) ;;本当はストリーム
         (res (funcall thunk fp)))
     (close fp)
     res))

というか、with-open-fileが強力すぎてこんな書きかたする人いない。

(defun read-file (fname thunk)
  (with-open-file (fp fname) 
    (funcall thunk fp)))

そうか、with系+サンクなのかも?