このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

.Primitive vs. .Internal

.Primitiveは名前のとおり、もっともプリミティブで、引数で指定された名前のC関数へのポインタを意味する。R側ではもちろん生ポインタは扱えないので、対応するラッパ関数オブジェクトを返す。

プリミティブ関数の関数ボディはCコードだが、便宜上、.Primitive("名前") になっている。これは、C関数のアドレスを示す のような形のほうが良かったと思う。現状だと奇妙なサーキュレーションに見える。


> c
function (..., recursive = FALSE) .Primitive("c")
> .Primitive("c")
function (..., recursive = FALSE) .Primitive("c")
> .Primitive("c")(1, 2)
[1] 1 2
>
> .Primitive
function (name) .Primitive(".Primitive")
>

.Internalは、内部に呼び出し型式をそのまま書く。.Internal関数が、引数の式を解析してから、C関数を呼ぶのだろう。解析・翻訳のレイヤーが挟まるので、その分遅いだろう。


> .Internal(getNamespaceRegistry())

>
> .Internal
function (call) .Primitive(".Internal")
>