Writing Emacs Primitives - Emacs に C の関数を追加する
Elisp の info 中に、
Writing Emacs Primitives という章があった。ここを読めば(そして C をちゃんと学べば)、
Emacs に C で書かれた高速な関数(=プリミティブ)を追加できる、かもしれない。
おっと。http://ja.wikipedia.org/wiki/Emacs_Lisp Wikipedia によれば、
せっかく C で関数を追加しても外部ライブラリにできない、らしい。つまり C の関数を書いたら Make しなくちゃいけない。
実質 Emacs 本体へのパッチになってしまうんだろうか。これはあまりに面倒かも。
だけどやってみた。onep という引数が1かどうか判定するプリミティブを src/data.c に追加。
zerop プリミティブをほとんどそのままで、defsubrとLisp_Objectの宣言も追加。
DEFUN ("onep", Fonep, Sonep, 1, 1, 0, doc: /* Return t if NUMBER is 1. */) (number) register Lisp_Object number; { CHECK_NUMBER_OR_FLOAT (number); if (FLOATP (number)) { if (XFLOAT_DATA (number) == 1.0) return Qt; return Qnil; } if (XINT(number) == 1) return Qt; return Qnil; }
そして Makeし、新しくできた emacs 実行コマンドを起動。おお、ちゃんと追加された。
F1-f onep とすると、ちゃんと built-in とみなされている。
onep is a built-in function in `src/data.c'.
(onep number)
Return t if number is 1.
[back]
(onep -1)
nil
(onep 1)
t
文字列を渡したりするとちゃんと捕捉される。
現実逃避一時終了。