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

文字列を渡したりするとちゃんと捕捉される。


現実逃避一時終了。