
前記事 mapcan, mapc に引き続き Land of Lisp から。
遅延評価(必要になったタイミングで評価される)関数、もしくは引数なしの関数呼び出しを thunk と呼ぶらしい。なんでかは知らない(suspension とも言うらしい)。
エイリアン本の実例がすごくわかりやすかったのでまとめておく。
thunk は「後でなんとでもなる」っていうのを頭の片隅に置いといてプログラミングしようっていう、いわば「考え方」だ。
;; ここから、
(defun princ-str-with-newline (&rest strs)
(mapc
(lambda (str)
(progn
(princ str)
(princ #\newline)))
strs))
(defun make-template ()
(princ-str-with-newline
"aaa"
"bbb"
"ccc"))
;; ここまでは、
;; コンソール(REPL)上に印字する体で
;; コードが書かれてる。
;; = princ のストリームは省略されてる
;; = *standard-output* が出力ストリーム
;; スペシャル変数(*standard-output*)を
;; let で再束縛されてる間だけ、
;; ファイルストリームにすり替える
;; (let を抜けると元の #<IO SYNONYM-STREAM *TERMINAL-IO*> に戻る)
(defun thunk-to-file (file-name thunk)
(with-open-file (*standard-output*
file-name
:direction :output
:if-exists :supersede)
(funcall thunk)))
;; 呼び出し
(thunk-to-file "./my-file.txt" #'make-template)
この例で言えば、書き始め(処理の中身を書いてる時)は結果の出力先を気にせず、単にコンソールで確認しながら書いていく。
で、最後に出力するファイル名を指定して出力先をすり替えちゃうってこと。
僕みたいにズボラで、気軽に仕事することが最優先の人間にはとっても有用なテクニックである。
