[Date Prev][Date Next][Thread Prev][][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 )