Shammer's Philosophy

My private adversaria

let による情報のカプセル化

以下の記事とかでカプセル化を色々やってきたけれども、

もっとうまい書き方はないか、ということで、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 スタイルでソースを書くことができる。