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 を外しておいてもよいかもしれない.