次: , 前: Eval During Compile, 上: Byte Compilation


15.6 バイトコード関数オブジェクト

バイトコンパイルした関数は、特別なデータ型、 バイトコード関数オブジェクト(byte-code function objects)です。

内部的には、バイトコード関数オブジェクトはベクトルによく似ています。 しかし、評価時にこのデータ型が呼び出すべき関数として現れると、 特別に扱います。 バイトコード関数オブジェクトの表示表現はベクトルに似ていますが、 開き角括弧`['のまえに余分に`#'が付きます。

バイトコード関数オブジェクトには、少なくとも4つの要素が必要です。 最大個数に制限はありませんが、最初の6つ個の要素にだけ 普通の用途があります。 つぎのとおりです。

引数リスト
引数シンボルのリスト。
バイトコード
バイトコード命令を収めた文字列。
定数群
バイトコードが参照するLispオブジェクトのベクトル。 関数名や変数名として使われるシンボルを含む。
スタックサイズ
この関数に必要なスタックサイズの最大値。
説明文字列
(あれば)説明文字列。 さもなければnil。 説明文字列がファイルに収めてあれば、値は数かリストである。 実際の説明文字列を取得するには関数documentationを使う (see Accessing Documentation)。
対話指定
(あれば)対話指定。 これは文字列かLisp式。 対話的でない関数ではnil

バイトコード関数オブジェクトの例を表示表現でつぎに示します。

     #[(&optional arg)
       "^H\204^F^@\301^P\302^H[!\207"
       [arg 1 forward-sexp]
       2
       254435
       "p"]

バイトコードオブジェクトを作る基本的な方法は、 make-byte-codeを使うことです。

— 機能: make-byte-code &rest elements

この関数は、elementsを要素とする バイトコード関数オブジェクトを作成し返す。

バイトコード関数の要素を自分で作ったりしないでください。 それらに整合性がないと、 その関数を呼び出すとEmacsがクラッシュすることもあります。 これらのオブジェクトの作成は、バイトコンパイラに任せるべきです。 バイトコンパイラは整合した要素を作成します(と期待する)。

バイトコードオブジェクトの要素はarefで参照できます。 同じ要素群のベクトルをvconcatで作ることもできます。