obarray とか symbol とかメモ

ふと, labelsとかfletを使わずに関数内関数を定義するにはどのようにしたらいいだろうとか
考えて色々試行錯誤してみたけどよくわかんね.
簡単にするにはやはりclマクロを使うのが一番やね.



Emacs Lisp では変数, 関数の両方の定義は全部, obarray という配列にあるみたい.
(describe-variable 'obarray)とかするととんでもない量が格納されてるのが見えてビックリした.


んで, 変数, 関数をどうみわけてるかというと, obarrayに格納されているシンボルそれぞれに
4つのセル?という領域が設定されているみたい.


例えば, (aref obarray 10)とかやって, obarrayの10番目に格納されているシンボルについて
それぞれのセルの値がどうなっているか調べるには以下のようにすればいいみたい.

(aref obarray 10)
(symbol-name (aref obarray 10))         ; 名前
(symbol-value (aref obarray 10))        ; 変数の値
(symbol-function (aref obarray 10))     ; 関数の定義(コンパイルされてないと文字がみえる)
(symbol-plist (aref obarray 10))        ; プロパティリスト

うちの環境だと(aref obarray 10)は, "tramp-gw-process-filter"と関数だったから,
symbol-valueを実行しても値が設定されていないのでエラーが出た.
変数ならsymbol-valueが, 関数ならsymbol-functionが設定されているみたい.


あとは, このセルの値をletみたいな感じで一時的に設定してやれれば・・・と思ったけど,
そこで詰んだ. どうやってセルの値を定義するか?letみたいに定義するにはどうするか?がよくわかんね.
もうちょっと粘ればなんとかなったのかなあ.


駄目駄目な解決法.

(let ((my-test (lambda (x) (message "%s" x))))
  (funcall my-test "test"))

letとfuncallで無理矢理関数内関数.
とりあえず問題なく使える. 大域的にmy-testが定義されたりしない
・・・やっぱりclマクロ使った方が楽だなあ. わかりきったことだけど.
でも, もうちょっとclなしで頑張ってみるか.
Common Lispを理解してるわけでもないから不用意に使うのも怖いし.



他には, 関数内でdefunあたりを使って関数を定義して, fmakunbound を使って定義した関数を最後に削除する.
そんなマクロを作れば楽できていいかもと思ってやろうとしたけど,
どうにも上手く作れない.
かといって, clマクロのlabelsとかの定義を読んじゃうのは負けな気がするし・・・.
・・・On Lisp でもまた読むか. つか今読んでる最中なんだけどな.実践すると違うなやっぱり.


こういうのをやってるとやっぱりマニュアルを一通り読んどいた方がいいなあと思う.
関数が出てこない. どんな機能があるかわからない.
でも, Emacs Lisp のマニュアル量多いんだよなあ. ちょいちょい読んでやめて・・・を繰り返してるからなあ.
またやってみるかなあ.

更新時刻

2007年, 11月28日, 2:46