let による情報のカプセル化
以下の記事とかでカプセル化を色々やってきたけれども、
- Package を使って private 引数を擬似的に実現する - Shammerism
- unintern でカプセル化を実現 - Shammerism
- カプセル化された class を定義 - Shammerism
もっとうまい書き方はないか、ということで、let と gensym を使用することにした。直接シンボルにアクセスしたくない、させたくない、という場合はこれが最適かもしれない、と今の時点では思う。
? (let ((temp-symbol (gensym))) (defmethod get-temp-symbol () temp-symbol) (defmethod set-temp-symbol (value) (setf temp-symbol value))) #<STANDARD-METHOD SET-TEMP-SYMBOL (T)> ?
で、これを実行してみる。
? (get-temp-symbol) #:G78411 ?
しまった。。。ここは nil になるのを期待していたのだが。この場合、gensym はいらないってことか。
? (let ((temp-symbol nil)) (defmethod get-temp-symbol () temp-symbol) (defmethod set-temp-symbol (value) (setf temp-symbol value))) #<STANDARD-METHOD SET-TEMP-SYMBOL (T)> ? (get-temp-symbol) NIL ? (set-temp-symbol 100) 100 ? (get-temp-symbol) 100 ? (set-temp-symbol nil) NIL ? (get-temp-symbol) NIL ?
とりえあず、これでよし。アクセサを export してやれば、変数名を意識しないでよい。setter と getter だけで情報をやり取りする、Message Passing スタイルでソースを書くことができる。