lispmode.lの解析、その3

 /lisp/lispmode.lのcalc-lisp-indent関数で
インデントを計算してるのは間違いないようです。
で、早速コードを解析。


 なんですけど、先頭でイキナリ詰まるw;

(defun calc-lisp-indent (opoint)
  (protect-match-data
  .
  .
  .)

せんせぇ〜(T△T)、protect-match-data関数ってなんですか?

 info-modokiさんが、protect-match-date関数なんて知らないって言うんだもん>A<
で、困った時のgoogleせんせぇ〜。

http://xyzzy.s53.xrea.com/wiki/index.php?%BC%C1%CC%E4%C8%A2%2F131

(setq string "abc123cdef");=>"abc123cdef"
(setq replacement "\\1 in \\&");=>"\\1 in \\&"



(string-match "\\([0-9]+\\)" string)                                 ;=>3
(string-replace-match string
		      (substitute-string replacement "\\\\&" string) ;=>"\\1 in abc123cdef"
		      )                                              ;=>" in abc123cdef"



(string-match "\\([0-9]+\\)" string)                                    ;=>3
(string-replace-match string
		      (ed::protect-match-data
			(substitute-string replacement "\\\\&" string)) ;=>"\\1 in abc123cdef"
		      )                                                 ;=>"123 in abc123cdef"

 なるほど、(゚ー゚)
ed::protect-match-data関数内での正規表現の結果が、外部に影響しない*1のね。


 そりゃ、インデント毎に正規表現の後方参照破壊されたら、タマリマセンわなw;
逆説的に言えば、内部で正規表現使ってるのかな?

内部変数を覗いてみよう*w*

 ってことで、覗いてみます。
昔の記事xyzzyでmode作成に挑戦。printfデバッグについて - 会者定離で以降を参考。
以下、デバッグ出力用のコードをいれて、ハイ実行。

(defun calc-lisp-indent (opoint)
  (with-output-to-buffer ((if (find-buffer "*Output*")
			      (find-buffer "*Output*")
			    (switch-to-buffer "*Output*")));;;with-で全体を包んでやる
    (format t "~D~%" opoint)
  (protect-match-data
  .
  .
  .)


 一先ず、大丈夫かな?
ん〜、解析ってこんなので良いのかな?
拡張モードの解析方法等を絶賛募集中です。教えて、エライ人m(_ _)m

*1:schemeの環境フレームみたいなのかな?