kikkiiのブログ

ひきこもり

コメントをしまうマクロ

 common lispで遊んでいるとき、型があった方が流れがわかりやすくなるから、いつの間にか、Haskellの記法を真似て関数の上にコメントとして書いていたりする。

;; Number -> Number -> Number
(defun add-xy (x y) (+ x y))

 「Numberは数値の型で、これはNumberを2つ取り、Numberを返す関数」という意味でコメントをしたつもり。xが数値かどうかを判定する述語関数(numberp x)の名前を踏襲してNumberと名前付けしてみた。common lispではHaskellのような型推論はできないが、コメントを付記することは、自分の意図を明確にするのに役立つのでやっているのだと思う。


 マクロ初心者なので「はじめて書くマクロ的」な気持ちで、マクロ練習をしてみる。

(defmacro -- (name str)
  `(defparameter ,name
     (concatenate 'string (symbol-name ',name) " :: " ,str)))

 comon lispでは、シンボルに紐付けられる関数の名前空間と変数の名前空間が分かれて、このようなlisplisp-2と呼ばれているようだ。schemeclojureのような、関数の名前空間と変数の名前空間が分かれていないlisplisp-1と呼ばれている。名前空間が2つあるlisp-2は、ゴチャゴチャして嫌な印象、活用方法ないものか...

 上で私はcommon lispのマクロを書いた。lisp-2で関数の定義をしたとき変数の名前空間が余っているなら、文字列でも入れておこうかな、という感じで、書いたマクロだ。次のような感じで使う。

(-- add-xy "Number -> Number -> Number")
(defun add-xy (x y) (+ x y))

;;関数として使う
> (add-xy 11 22)
33

;;変数として使う
> add-xy
"ADD-XY :: Number -> Number -> Numbe"

 文字列から意味推論(読書)するのに少しは役立つかな、という思い。文字列でする意味推論は、読み書きをする人が誕生して以来、太古からのアナログな人間の機能と言える。人間は生活文化の中で、意味ネットワークを生涯学習する。

 私はしばしば意味を求めるので、電子機器をどんなに使っていたとしても、結局は、意味ベースなアナログ人間であり続けるであろう。