Hatena::ブログ(Diary)

My Emaps

2011-03-04

ddskk 14.2 をインストールする際の注意点

概要

ddskk 14.2 (14.1) を起動した際に

  skk-setup-j-mode-map-options: Symbol's chain of function indirections contains a loop: char-valid-p

というエラーが吐かれて困っている人のためのメモ.

上記のエラーが出るのはおそらく emacs 23 を使っている場合.

参考サイト

解決策

上記のエラーは emacs 22 以前のバージョンでバイトコンパイルした ddskk (14.1以降) を emacs 23 で使った場合に起こる.

なので, emacs 23 で ddskk をバイトコンイルし直せば直る.

原因

cyclic-function-indirection

上述のエラーが出る際に skk のロードを backtrace すると, skk-setup-j-mode-map-options 内の characterp で cyclic-function-indirection のエラーシグナルが吐かれていることがわかる.

このエラーシグナルはシンボルの関数が相互参照することにより無限ループができていることを意味する.

例えば,

  (fset 'foo 'bar)
  (fset 'bar 'foo)
  (foo)

とすれば, cyclic-function-indirection が吐かれる.

characterp, char-valid-p

emacs文字列型判定の関数emacs 22 以前では, char-valid-p が使われているが, emacs 23 から新しく characterp が文字型の判定関数として導入され, char-valid-p は互換性を保つための alias となっている. つまり,

  • emacs 22 では char-valid-p が c で書かれた build in 関数で, characterp は存在しない.
  • emacs 23 では characterp が c で書かれた build in 関数で, char-valid-p は charcterp への defalias.

このため, skk 14.1 以降では

  (when (eval-when-compile (and skk-running-gnu-emacs
  			      (<= emacs-major-version 22)))
    (defalias 'characterp 'char-valid-p))

のように, バイトコンパイル時に emacs 22 以下に対しては, characterp を char-valic-p への defalias として定義することで, 互換性を保っている.

しかし, このことが原因で emacs 22 以前のバージョンでバイトコンパイルした ddskk を emacs 23 で使用すると, characterp から char-valid-p への alias と char-valid-p から characterp への alias が両方貼られてしまい, cyclic-function-indirection が吐かれてしまう.

ddskk を .emacs.d に入れて複数のバージョンで使ったりすることを考えると, バイトコンパイル時にバージョンチェックするのは少し困りもの. eval-when-compile を外しておいてもよいかもしれない.

tokgtokg 2011/03/10 11:03 こまっていました.
たすかりました.

tama_shtama_sh 2011/03/10 21:09 私も自分でインストールしたときエラーが出て結構困りました.
お役に立てて良かったです.

tsukamototsukamoto 2011/06/09 17:34 現状では、異なる Emacs バージョンで生成された
byte code の動作は保証しないですかねえ...

tama_shtama_sh 2011/06/10 00:48 今回の場合は単純に skk-macs.el の上記の箇所から eval-when-compile を省いて,
実行時にバージョンチェックを行うようにすれば,
以前のバージョンでコンパイルした場合も正しく動作するように思うのですが、どうなんでしょう。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close