Skip to content

eval-after-loadの呼び出し順について

2015/03/25

同じファイルに対して eval-after-load を複数呼び出した場合、 先に登録されたものから評価されると思っていたのですが少し違うようですね。

結論としては、 eval-after-loadfile 引数を文字列で指定したものが 登録した順に一通り評価され、その後でシンボルで file を指定したものが 登録した順に評価されるようです。

これに気付かずしばらくハマってしまいました。

検証用のコード

(defun my-test-a ())
(defun my-test-b ())
(defun my-test-c ())
(defun my-test-d ())

(with-eval-after-load 'foo  (my-test-a))
(with-eval-after-load "foo" (my-test-b))
(with-eval-after-load 'foo  (my-test-c))
(with-eval-after-load "foo" (my-test-d))

(trace-function #'my-test-a)
(trace-function #'my-test-b)
(trace-function #'my-test-c)
(trace-function #'my-test-d)

(add-to-list 'load-path "/tmp")

(require 'foo)
  • /tmp/foo.el
    (provide 'foo)
    

結果

======================================================================
1 -> (my-test-b)
1 <- my-test-b: nil
======================================================================
1 -> (my-test-d)
1 <- my-test-d: nil
======================================================================
1 -> (my-test-a)
1 <- my-test-a: nil
======================================================================
1 -> (my-test-c)
1 <- my-test-c: nil

my-test-a が後に、 my-test-d が先に呼び出されているのが分かると思います。

広告

From → Emacs

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。