デザインパターンのテンプレートメソッドって with系マクロ + サンク?
モダン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系+サンクなのかも?