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