[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Variable binding depth exceeds max-specpdl-size
>> On Tue, 23 Oct 2001 12:18:48 +0900
>> 「山」== yamaoka@namazu.org (Katsumi Yamaoka) said as follows:
山> ふうむ、インライン関数の再帰呼び出しですか。E21 と XEmacs では使え
山> るというのは、逆に収穫だったかもしれませんね。
山> ;; でも、どんな byte-code になっているんだろ? 興味深々...
disassemble して観察してみたところ、再帰呼び出しの場合はインライン展開
しない、という処理が行われているようです。
(defsubst inline-recursive-call (arg)
(when (> (length arg) 0)
(message arg)
(inline-recursive-call (substring arg 1))))
(disassemble
(byte-compile
(lambda ()
(inline-recursive-call "TEST"))))
それで、単にある関数をインライン展開中だ、という情報しか持っていないな
ら、次のような意地悪なコードは破綻するかな? と思ったのですが、
(defsubst inline-recursive-call-a (arg)
(when (> (length arg) 0)
(message arg)
(inline-recursive-call-b (substring arg 1))))
(defsubst inline-recursive-call-b (arg)
(when (> (length arg) 0)
(message arg)
(inline-recursive-call-a (substring arg 1))))
(disassemble
(byte-compile
(lambda ()
(inline-recursive-call-a "TEST"))))
破綻しませんでした。というわけで、再帰呼び出しに限らず、インライン関数
の中ではインライン展開しない、という規則になっているようです。
したがって、単純に展開して欲しいようなインライン関数は、逆にうまく展開
されないようです。
(defsubst inline-a (arg)
(inline-b arg))
(defsubst inline-b (arg)
(message arg))
(disassemble
(byte-compile
(lambda ()
(inline-a "TEST"))))
この例は、Emacs20 では inline-a() / inline-b() がなくなったのですが…。
--
土屋 雅稔 ( TSUCHIYA Masatoshi )