## Tcl9.0.3/Tk9.0.3 Documentation > Tcl C API > ObjectType

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType, Tcl_FreeInternalRep, Tcl_InitStringRep, Tcl_HasStringRep, Tcl_StoreInternalRep, Tcl_FetchInternalRep — Tcl 値の型を操作する　 manipulate Tcl value types
  SYNOPSIS
    #include <tcl.h>
    Tcl_RegisterObjType(typePtr)
    const Tcl_ObjType *
    Tcl_GetObjType(typeName)
    int
    Tcl_AppendAllObjTypes(interp, objPtr)
    int
    Tcl_ConvertToType(interp, objPtr, typePtr)
    void
    Tcl_FreeInternalRep(objPtr)
    char *
    Tcl_InitStringRep(objPtr, bytes, numBytes)
    int
    Tcl_HasStringRep(objPtr)
    void
    Tcl_StoreInternalRep(objPtr, typePtr, irPtr)
    Tcl_ObjInternalRep *
    Tcl_FetchInternalRep(objPtr, typePtr)
  引数 ARGUMENTS
    const Tcl_ObjType *typePtr (入力in)
    const char *typeName (入力in)
    Tcl_Interp *interp (in)
    Tcl_Obj *objPtr (入力in)
    const char* bytes (入力in)
    unsigned int numBytes (入力in)
    const Tcl_ObjInternalRep* irPtr (入力in)
    const Tcl_ObjType* typePtr (入力in)
  説明 DESCRIPTION
  tcl対象型構造 THE TCL_OBJTYPE STRUCTURE
  THE NAME FIELD
  THE SETFROMANYPROC FIELD
  THE UPDATESTRINGPROC FIELD
  THE DUPINTREPPROC FIELD
  THE FREEINTREPPROC FIELD
  版番号欄 THE VERSION FIELD
  リスト型の要約 ABSTRACT LIST TYPES
  スカラー値型 SCALAR VALUE TYPES
  第二版:リスト要約 VERSION 2: ABSTRACT LISTS
  THE LENGTHPROC FIELD
  THE INDEXPROC FIELD
  THE SLICEPROC FIELD
  THE REVERSEPROC FIELD
  THE GETELEMENTS FIELD
  THE SETELEMENT FIELD
  REPLACEPROC FIELD
  THE INOPERPROC FIELD
  参照回数管理 REFERENCE COUNT MANAGEMENT
  SEE ALSO
  KEYWORDS

### NAME

Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType, Tcl_FreeInternalRep, Tcl_InitStringRep, Tcl_HasStringRep, Tcl_StoreInternalRep, Tcl_FetchInternalRep — Tcl 値の型を操作する　 manipulate Tcl value types

### SYNOPSIS

#include <tcl.h>
Tcl_RegisterObjType(typePtr)
const Tcl_ObjType *
Tcl_GetObjType(typeName)
int
Tcl_AppendAllObjTypes(interp, objPtr)
int
Tcl_ConvertToType(interp, objPtr, typePtr)
void
Tcl_FreeInternalRep(objPtr)
char *
Tcl_InitStringRep(objPtr, bytes, numBytes)
int
Tcl_HasStringRep(objPtr)
void
Tcl_StoreInternalRep(objPtr, typePtr, irPtr)
Tcl_ObjInternalRep *
Tcl_FetchInternalRep(objPtr, typePtr)

### 引数 ARGUMENTS

const Tcl_ObjType *typePtr (入力in)
  Tcl 値の型に関する情報を含む構造を指す｡この貯蔵は永遠に生きる､典型的には静的に割当てられる｡　 Points to the structure containing information about the Tcl value type. This storage must live forever, typically by being statically allocated.

const char *typeName (入力in)
  Tcl_GetObjType が捜索すべきTcl 値の型｡　 The name of a Tcl value type that Tcl_GetObjType should look up.

Tcl_Interp *interp (in)
  不都合を報告する為に使用する解釈実行機能｡　 Interpreter to use for error reporting.

Tcl_Obj *objPtr (入力in)
  Tcl_AppendAllObjTypes については､これは､そこに各値の型をリスト要素として追記すべき値を指す｡Tcl_ConvertToType については､これは Tcl_NewObj への事前の呼出しの結果でなければならない｡　 For Tcl_AppendAllObjTypes, this points to the value onto which it appends the name of each value type as a list element. For Tcl_ConvertToType, this points to a value that must have been the result of a previous call to Tcl_NewObj.

const char* bytes (入力in)
  文字列表現｡ String representation.

unsigned int numBytes (入力in)
  文字列のバイト単位の長さ｡ Length of the string representation in bytes.

const Tcl_ObjInternalRep* irPtr (入力in)
  内部対象の表現｡ Internal object representation.

const Tcl_ObjType* typePtr (入力in)
  要求された内部表現型｡ Requested internal representation type.

### 説明 DESCRIPTION

この取扱説明書の頁の手続函数は Tcl 値型を管理する(歴史的理由で､時には､対象型として､又は Tcl_ObjType として参照される)｡それは新しい値型の登録､型の調査､一つの型と他との強制変換に使われる｡ The procedures in this man page manage Tcl value types (sometimes referred to as object types or Tcl_ObjTypes for historical reasons). They are used to register new value types, look up types, and force conversions from one type to another.

Tcl_RegisterObjType は Tcl_GetObjType が名前によって調査可能な全ての値型の表内に新しい Tcl 値型を登録する｡他に Tcl によって同じく運営され Tcl が登録しないと選択した値型がある｡拡張は同じく値型を製作したか､しないかを登録することができる｡ typePtr 引数は､その名前を与えられ､且つ､型を実装する四つの手続函数を指すポインターを提供されて新しい型を記述する Tcl_ObjType 構造を指す｡もし型表が typePtr と同じ名前の型が既に含まれていると､新しい型と置換える｡ Tcl_ObjType 構造は下の THE TCL_OBJTYPE STRUCTURE の節に記述されている｡ Tcl_RegisterObjType registers a new Tcl value type in the table of all value types that Tcl_GetObjType can look up by name. There are other value types supported by Tcl as well, which Tcl chooses not to register. Extensions can likewise choose to register the value types they create or not. The argument typePtr points to a Tcl_ObjType structure that describes the new type by giving its name and by supplying pointers to four procedures that implement the type. If the type table already contains a type with the same name as in typePtr, it is replaced with the new type. The Tcl_ObjType structure is described in the section THE TCL_OBJTYPE STRUCTURE below.

Tcl_GetObjType は登録された Tcl_ObjType へのポインターを名前 typeName に返す｡もしその名前の型が登録されていない場合 NULL が返される｡ Tcl_GetObjType returns a pointer to the registered Tcl_ObjType with name typeName. It returns NULL if no type with that name is registered.

Tcl_AppendAllObjTypes はリスト要素として登録された値型を objPtr によって参照される Tcl 値の上に追記する｡ objPtr からリスト値に変換する間に不都合がない限り返り値は TCL_OK である; そのときは TCL_ERROR が返される｡ Tcl_AppendAllObjTypes appends the name of each registered value type as a list element onto the Tcl value referenced by objPtr. The return value is TCL_OK unless there was an error converting objPtr to a list value; in that case TCL_ERROR is returned.

Tcl_ConvertToType は可能な場合は､一つの型から他に値を変換する｡それは目的の型 typePtr に適切な objPtr の新しい内部表現を作成する､そして typePtr->setFromAnyProc 機能譜の呼出により決定されたとしてその要員 typePtr を設定する｡どの objPtr の古い型の内部表現も解放する｡もし変換中に不都合が生じると TCL_ERROR を返し解釈実行機能が NULL でない限り､不都合伝言文を解釈実行機能の結果に残す｡そうでない場合､ TCL_OK を返す｡ NULL を渡して､解釈実行機能はこの手続函数が変換ができるかの試験に使うことを許容する(実際できる)｡ Tcl_ConvertToType converts a value from one type to another if possible. It creates a new internal representation for objPtr appropriate for the target type typePtr and sets its typePtr member as determined by calling the typePtr->setFromAnyProc routine. Any internal representation for objPtr's old type is freed. If an error occurs during conversion, it returns TCL_ERROR and leaves an error message in the result value for interp unless interp is NULL. Otherwise, it returns TCL_OK. Passing a NULL interp allows this procedure to be used as a test whether the conversion can be done (and in fact was done).

多くの場合 typePtr->setFromAnyProc 機能譜は objPtr->typePtr を引数値 typePtr に設定するが､これは最早保証されない｡もしそれが適切に見える場合､ setFromAnyProc は objPtr が他の関連する Tcl_ObjType を利用する内部表現の設定には関係ない｡ In many cases, the typePtr->setFromAnyProc routine will set objPtr->typePtr to the argument value typePtr, but that is no longer guaranteed. The setFromAnyProc is free to set the internal representation for objPtr to make use of another related Tcl_ObjType, if it sees fit.

Tcl_FreeInternalRepは､既存の内部マクロTclInitStringRepの機能を遂行する､但し､文字列表現への指示子を返し､バイトの値としてNULLを受取る､様に拡張されている｡バイトがNULLであり､且つ､objPtrに文字列表現が無い時､numBytesバイトの､初期化されない緩衝域が､呼出側による充填の為に､生成される｡バイトがNULLであり､且つ､objPtrに文字列表現がある時､その文字列表現は､numBytesバイトの長さに切詰められる｡ numBytesが零より大きく､且つ､返された指示子がNULLの時､それは文字列表現の為の記憶域割当てが失敗したことを指し示す｡呼出側は不都合か混乱かが生じたかを選択する｡ Tcl_FreeInternalRep performs the function of the existing internal macro TclInitStringRep, but is extended to return a pointer to the string rep, and to accept NULL as a value for bytes. When bytes is NULL and objPtr has no string rep, an uninitialzed buffer of numBytes bytes is created for filling by the caller. When bytes is NULL and objPtr has a string rep, the string rep will be truncated to a length of numBytes bytes. When numBytes is greater than zero, and the returned pointer is NULL, that indicates a failure to allocate memory for the string representation. The caller may then choose whether to raise an error or panic.

Tcl_InitStringRepは既存の内部マクロTclInitStringRepの機能を遂行するが､文字列表現への指示子を返し､バイトの値としてNULLを受取る様に拡張されている｡ バイトがNULLであり､且つ､objPtrに文字列表現が無い時､numBytesバイトの､初期化されない緩衝域が､呼出側による充填の為に､生成される｡ バイトがNULLであり､且つ､objPtrに文字列表現がある時､その文字列表現は､numBytesバイトの長さに切詰められる｡ numBytesが零より大きく､且つ､返された指示子がNULLの時､それは文字列表現の為の記憶域割当てが失敗したことを指し示す｡呼出側は不都合か混乱かが生じたかを選択する｡ Tcl_InitStringRep performs the function of the existing internal macro TclInitStringRep, but is extended to return a pointer to the string rep, and to accept NULL as a value for bytes. When bytes is NULL and objPtr has no string rep, an uninitialzed buffer of numBytes bytes is created for filling by the caller. When bytes is NULL and objPtr has a string rep, the string rep will be truncated to a length of numBytes bytes. When numBytes is greater than zero, and the returned pointer is NULL, that indicates a failure to allocate memory for the string representation. The caller may then choose whether to raise an error or panic.

Tcl_HasStringRepは文字列表現が現在objPtr内に保存されているか否かを示す論理値を返す｡ これは､呼出側が､それが別に純粋値であるか否かに依存するobjPtrに働きかけることを望む時に､使われる｡ objPtrは拡張によって管理されている内部型を保持していることが､ 既に知られている場合､通常は､これは拡張内のみで意味がある｡ Tcl_HasStringRep returns a boolean indicating whether or not a string rep is currently stored in objPtr. This is used when the caller wants to act on objPtr differently depending on whether or not it is a pure value. Typically this only makes sense in an extension if it is already known that objPtr possesses an internal type that is managed by the extension.

Tcl_StoreInternalRepは irPtrによって指された内部表現の複写をobjPtr内に保存し､且つ､その型をtypePtrに設定する｡ irPtr が NULLの時､これは､型typePtrの為の表現なしに､objPtrを解放する｡ Tcl_StoreInternalRep stores in objPtr a copy of the internal representation pointed to by irPtr and sets its type to typePtr. When irPtr is NULL, this leaves objPtr without a representation for type typePtr.

Tcl_FetchInternalRepは､ 要求された型typePtrに合致し､ objPtrに保存されている､内部表現への指示子､を返す｡ objPtr内にその様な内部表現が無い場合､NULLを返す｡ Tcl_FetchInternalRep returns a pointer to the internal representation stored in objPtr that matches the requested type typePtr. If no such internal representation is in objPtr, return NULL.

これは､公的型を返す 　 This returns a public type

    typedef union Tcl_ObjInternalRep {...} Tcl_ObjInternalRep

そこでは､ 内容物は正確に､Tcl_Obj構造のinternalRep欄内の連携の既存内容である｡ この決定は､内部表現と､それへの指示子を､公的機能譜の引数と結果として､渡すことを我々に許容する｡ where the contents are exactly the existing contents of the union in the internalRep field of the Tcl_Obj struct. This definition permits us to pass internal representations and pointers to them as arguments and results in public routines.

### tcl対象型構造 THE TCL_OBJTYPE STRUCTURE

拡張の著者は､４個から１２個の手続函数の定義と型を記述する為の Tcl_ObjType 構造を初期化することにより､新しい値型を定義できる｡拡張の著者は又､他の拡張がその Tcl_ObjType を名前で Tcl_GetObjType 機能譜により捜索することを許容したい場合､その Tcl_ObjType 構造へのポインターを Tcl_RegisterObjType に渡しても好い｡ Tcl_ObjType 構造は次の様に定義される: 　　　　　　 Extension writers can define new value types by defining four to twelve procedures and initializing a Tcl_ObjType structure to describe the type. Extension writers may also pass a pointer to their Tcl_ObjType structure to Tcl_RegisterObjType if they wish to permit other extensions to look up their Tcl_ObjType by name with the Tcl_GetObjType routine. The Tcl_ObjType structure is defined as follows:

    typedef struct {
        const char *name;
        Tcl_FreeInternalRepProc *freeIntRepProc;
        Tcl_DupInternalRepProc *dupIntRepProc;
        Tcl_UpdateStringProc *updateStringProc;
        Tcl_SetFromAnyProc *setFromAnyProc;
        size_t version;
        /* List emulation functions - ObjType Version 1 & 2 */
        Tcl_ObjTypeLengthProc *lengthProc;
        /* List emulation functions - ObjType Version 2 */
        Tcl_ObjTypeIndexProc *indexProc;
        Tcl_ObjTypeSliceProc *sliceProc;
        Tcl_ObjTypeReverseProc *reverseProc;
        Tcl_ObjTypeGetElements *getElementsProc;
        Tcl_ObjTypeSetElement *setElementProc;
        Tcl_ObjTypeReplaceProc *replaceProc;
        Tcl_ObjTypeInOperatorProc *inOperProc;
    } Tcl_ObjType;

#### THE NAME FIELD

構成員 name は型の名前を記述する､譬えば int 型が登録された時､これは型を調査する為に Tcl_GetObjType の呼出し側により使われる名前である｡非登録型に就いて､ name 欄は不具合修正に関して最重要欄である｡残りの４つの要員は一般的 Tcl 値符号により呼出される手続函数へのポインターである: The name member describes the name of the type, e.g. int. When a type is registered, this is the name used by callers of Tcl_GetObjType to lookup the type. For unregistered types, the name field is primarily of value for debugging. The remaining four members are pointers to procedures called by the generic Tcl value code:

#### THE SETFROMANYPROC FIELD

構成員 setFromAnyProc は値の文字列表現から適正な内部表現を作る為に呼出される函数の番地を含む｡ The setFromAnyProc member contains the address of a function called to create a valid internal representation from a value's string representation.

    typedef int Tcl_SetFromAnyProc(
            Tcl_Interp *interp,
            Tcl_Obj *objPtr);

もし内部表現が文字列から作成できない場合､ TCL_ERROR を返し､解釈実行機能が NULL でない限り解釈実行機能の為の結果の値の中に不都合を記述する伝言文を入れる｡もし setFromAnyProc が成功すると､新しい内部表現を保存し､新しい内部表現に相当する Tcl_ObjType 構造を指す objPtr の typePtr 要員を設定し､ TCL_OK を返す｡新しい内部表現を設定する前に､ setFromAnyProc は objPtr の古い型のどの内部表現も解放しなければならない; それが NULL でない場合､古い型の freeIntRepProc を呼出してそれを達成する｡ 　　　　 If an internal representation cannot be created from the string, it returns TCL_ERROR and puts a message describing the error in the result value for interp unless interp is NULL. If setFromAnyProc is successful, it stores the new internal representation, sets objPtr's typePtr member to point to the Tcl_ObjType struct corresponding to the new internal representation, and returns TCL_OK. Before setting the new internal representation, the setFromAnyProc must free any internal representation of objPtr's old type; it does this by calling the old type's freeIntRepProc if it is not NULL.

例として､組込み Tcl リスト型の為の setFromAnyProc は Tcl_GetStringFromObj を呼出すことにより objPtr の為の最新の文字列表現を得る｡それは妥当なリスト形式であることの検証の為に､解析し､リスト内にそれぞれの要素を得､もしこれが続くなら､リスト要素を objPtr の内部表現に保存し objPtr の typePtr 要員をリスト型の Tcl_ObjType 構造への点に保存する｡ As an example, the setFromAnyProc for the built-in Tcl list type gets an up-to-date string representation for objPtr by calling Tcl_GetStringFromObj. It parses the string to verify it is in a valid list format and to obtain each element value in the list, and, if this succeeds, stores the list elements in objPtr's internal representation and sets objPtr's typePtr member to point to the list type's Tcl_ObjType structure.

objPtr の古い内部表現は､それを新しいものに置換えるか､ typePtr 要員の残りを NULL に刷新するかしない限り､解放してはならない｡ Do not release objPtr's old internal representation unless you replace it with a new one or reset the typePtr member to NULL.

内部表現を利用する機能譜が､任意の文字列値からあの内部表現を駆動する必要がない場合､ setFromAnyProc 要員は､ NULL に設定されてもよい｡しかしこの場合､型へのポインターを Tcl_ConvertToType に渡すことは混乱に至るので､この可能性を避けるために型は登録されるべきではない｡ The setFromAnyProc member may be set to NULL, if the routines making use of the internal representation have no need to derive that internal representation from an arbitrary string value. However, in this case, passing a pointer to the type to Tcl_ConvertToType will lead to a panic, so to avoid this possibility, the type should not be registered.

#### THE UPDATESTRINGPROC FIELD

構成員 updateStringProc は値の文字列表現から適正な内部表現を作る為に呼出される函数の番地を含む｡ The updateStringProc member contains the address of a function called to create a valid string representation from a value's internal representation.

    typedef void Tcl_UpdateStringProc(
            Tcl_Obj *objPtr);

それが呼出される時は objPtr のバイト要員は常に NULL である｡実行する前に常に bytes を非-NULL に設定しなければならない｡文字列表現のバイト配列が最後のバイトの後の length の偏寄の位置に零を有し､それより前には零のバイトがないことが要求される; これは文字列表現が慣習的な零終端 C 文字列として扱われる事を許容する｡この制限に容易に合格するには文字列表現の為に内部 Tcl の内部 UTF 符号系を使うことであり､引数としてのもじれる値として受入れられる他の Tcl 機能譜の為に行うことと同じである｡バイト配列の為の記憶域は Tcl_Alloc により事前確保域を割当なければならない｡註意すべきは､ updateStringProc は文字列バイトと零終末の為に充分な領域を割当なければならない｡ objPtr's bytes member is always NULL when it is called. It must always set bytes non-NULL before returning. We require the string representation's byte array to have a null after the last byte, at offset length, and to have no null bytes before that; this allows string representations to be treated as conventional null character-terminated C strings. These restrictions are easily met by using Tcl's internal UTF encoding for the string representation, same as one would do for other Tcl routines accepting string values as arguments. Storage for the byte array must be allocated in the heap by Tcl_Alloc. Note that updateStringProcs must allocate enough storage for the string's bytes and the terminating null byte.

Tcl の組込み二倍型に関する updateStringProc は譬えば､ TCL_DOUBLE_SPACE,寸法の緩衝域に書く為に Tcl_PrintDouble を呼出すと､文字列表現の割当と複写は充分な空間を保有する｡割当てられた空間へのポインターは bytes 要員に保存される｡ The updateStringProc for Tcl's built-in double type, for example, calls Tcl_PrintDouble to write to a buffer of size TCL_DOUBLE_SPACE, then allocates and copies the string representation to just enough space to hold it. A pointer to the allocated space is stored in the bytes member.

もし文字列表現が不適になることがない様に内部表現を利用する機能譜が書かれる場合､ updateStringProc 要員は､ NULL に設定されてもよい｡ Tcl_GetStringFromObj や他の類似の機能譜が文字列表現を要求した時､この義務が失敗すると混乱や崩壊に至る｡ The updateStringProc member may be set to NULL, if the routines making use of the internal representation are written so that the string representation is never invalidated. Failure to meet this obligation will lead to panics or crashes when Tcl_GetStringFromObj or other similar routines ask for the string representation.

#### THE DUPINTREPPROC FIELD

dupIntRepProc 要員は内部表現を一つの値から他に複写する時に呼出される函数の番地を含む｡ The dupIntRepProc member contains the address of a function called to copy an internal representation from one value to another.

    typedef void Tcl_DupInternalRepProc(
            Tcl_Obj *srcPtr,
            Tcl_Obj *dupPtr);

dupPtr の内部表現は srcPtr の内部表現の複写を作成する｡ srcPtr の内部表現は呼出す前に適正であるが､ dupPtr のものはそうではない｡ srcPtr の値型はその内部表現の複写が何を意味するかを定める｡ dupPtr's internal representation is made a copy of srcPtr's internal representation. Before the call, srcPtr's internal representation is valid and dupPtr's is not. srcPtr's value type determines what copying its internal representation means.

譬えば Tcl 整数型の為の dupIntRepProc は単純に整数を複写する｡組込みリストの型の dupIntRepProc は合理的に可能な限り記憶域共有を継続する為に更に洗練された計画を使う For example, the dupIntRepProc for the Tcl integer type simply copies an integer. The built-in list type's dupIntRepProc uses a far more sophisticated scheme to continue sharing storage as much as it reasonably can.

#### THE FREEINTREPPROC FIELD

freeIntRepProc 要員は値が解放された時に呼出される函数の番地を含む｡ The freeIntRepProc member contains the address of a function that is called when a value is freed.

    typedef void Tcl_FreeInternalRepProc(
            Tcl_Obj *objPtr);

freeIntRepProc 函数は値の内部表現の為の記憶域を割当解除することができ､値が解放された時に他の型固有の必要とされる処理を行う｡ The freeIntRepProc function can deallocate the storage for the value's internal representation and do other type-specific processing necessary when a value is freed.

譬えば､リスト型の freeIntRepProc は dupIntRepProc によって確立された記憶域の共有計画を考慮するので､最後の共有されている値が解放された時にのみ記憶域を開放する｡ For example, the list type's freeIntRepProc respects the storage sharing scheme established by the dupIntRepProc so that it only frees storage when the last value sharing it is being freed.

freeIntRepProc 要員は内部表現は解放を要求していないことを指し示す NULL を設定することが可能である｡ freeIntRepProc 実装は bytes 値の要員を利用してはならない､理由は Tcl は値を削除する間､それを自己の欄の内部使用にするから｡ freeIntRepProc の為の定義された仕事は bytes 要員を消費する必要がない｡ The freeIntRepProc member can be set to NULL to indicate that the internal representation does not require freeing. The freeIntRepProc implementation must not access the bytes member of the value, since Tcl makes its own internal uses of that field during value deletion. The defined tasks for the freeIntRepProc have no need to consult the bytes member.

註意すべきは､freeIntRepProc実行中に､子供の値がその参照回数を零に減らさせると､棚使用を限定する為に､その値は直ぐには解放されない｡ しかし､最も外側の､現在のTcl_DecrRefCountが帰る前に､値は解放される｡ Note that if a subsidiary value has its reference count reduced to zero during the running of a freeIntRepProc, that value may be not freed immediately, in order to limit stack usage. However, the value will be freed before the outermost current Tcl_DecrRefCount returns.

#### 版番号欄 THE VERSION FIELD

version構成員は構造の将来拡張性の為に提供され､版9.0に先立つObjTypeの両立性の為にTCL_OBJTYPE_V0に設定が好ましい｡版に関する指定は更に下に記述される｡ The version member provides for future extensibility of the structure and should be set to TCL_OBJTYPE_V0 for compatibility of ObjType definitions prior to version 9.0. Specifics about versions will be described further in the sections below.

### リスト型の要約 ABSTRACT LIST TYPES

Tcl_ObjType記述子の中の追加の欄は､リスト型への変更なしに､Tclのリスト命令を使って､誂えデータ値が如何に操作されるかを制御できるようにする｡ これは､誂えデータ表現上で与えらえた処理を遂行する機能を提供する様､誂え型に要求する｡全ての機能が要求されている訳ではない｡ 特定の機能不足は(NULLに設定)､ 操作を遂行する為に､内部リスト操作に後退が許容され､ 最も可能性が高いのは､値型に､伝統的なリストに変換されることを惹き起す｡ Additional fields in the Tcl_ObjType descriptor allow for control over how custom data values can be manipulated using Tcl's List commands without converting the value to a List type. This requires the custom type to provide functions that will perform the given operation on the custom data representation. Not all functions are required. In the absence of a particular function (set to NULL), the fallback is to allow the internal List operation to perform the operation, most likely causing the value type to be converted to a traditional list.

#### スカラー値型 SCALAR VALUE TYPES

誂えた値の型､それはスカラーか自然な基本子､即ち分割不能集積に就いて､TCL_OBJTYPE_V1版が推奨される｡この場合､リスト命令はスカラー値を恰も長さ１の如く扱い､且つ､値をリストに変換しない｡ For a custom value type that is scalar or atomic in nature, i.e., not a divisible collection, version TCL_OBJTYPE_V1 is recommended. In this case, List commands will treat the scalar value as if it where a list of length 1, and not convert the value to a List type.

#### 第二版:リスト要約 VERSION 2: ABSTRACT LISTS

第二版､TCL_OBJTYPE_V2は､ 下に記述されている函数が提供されていると､全リストへの対応を許容する｡ これは､ リストに変換されるTcl_Obj値の型を惹き起すことなく､ 記述譜水準のリスト命令の使用を許容する｡ Version 2, TCL_OBJTYPE_V2, allows full List support when the functions described below are provided. This allows for script level use of the List commands without causing the type of the Tcl_Obj value to be converted to a list.

#### THE LENGTHPROC FIELD

LengthProc函数は､Tcl_ListObjLength C APIに類似する｡ 本函数は､リスト内の要素の数を返す｡ 全てのリスト操作で使われ､全ての要約リスト実装の為に要求される｡ The LengthProc function correlates with the Tcl_ListObjLength C API. The function returns the number of elements in the list. It is used in every List operation and is required for all Abstract List implementations.

    typedef Tcl_Size
    (Tcl_ObjTypeLengthProc) (Tcl_Obj *listPtr);

#### THE INDEXPROC FIELD

IndexProc函数は､Tcl_ListObjIndex C APIに類似する｡ 本函数は指定された索引の要素の為のTcl_Obj値を返す｡ The IndexProc function correlates with with the Tcl_ListObjIndex C API. The function returns a Tcl_Obj value for the element at the specified index.

    typedef int (Tcl_ObjTypeIndexProc) (
        Tcl_Interp *interp,
        Tcl_Obj *listPtr,
        Tcl_Size index,
        Tcl_Obj** elemObj);

#### THE SLICEPROC FIELD

SliceProcはlrange命令に類似し､ 新しいリストか指定された元のリストの部分の要約リストを返す｡ The SliceProc correlates with the lrange command, returning a new List or Abstract List for the portion of the original list specified.

    typedef int (Tcl_ObjTypeSliceProc) (
        Tcl_Interp *interp,
        Tcl_Obj *listPtr,
        Tcl_Size fromIdx,
        Tcl_Size toIdx,
        Tcl_Obj **newObjPtr);

#### THE REVERSEPROC FIELD

ReverseProcはlreverse命令に類似し､ 入力要約リストと同じ要素を有し､要素が逆順の要約リストを返す｡ The ReverseProc correlates with the lreverse command, returning a List or Abstract List that has the same elements as the input Abstract List, with the elements in the reverse order.

    typedef int (Tcl_ObjTypeReverseProc) (
        Tcl_Interp *interp,
        Tcl_Obj *listPtr,
        Tcl_Obj **newObjPtr);

#### THE GETELEMENTS FIELD

GetElements函数は､ 勘定と､完全な要約リストの為のTcl_Obj値の配列への指示子を返す｡ これはTcl_ListObjGetElements C API呼出しと類似する｡ The GetElements function returns a count and a pointer to an array of Tcl_Obj values for the entire Abstract List. This correlates to the Tcl_ListObjGetElements C API call.

    typedef int (Tcl_ObjTypeGetElements) (
        Tcl_Interp *interp,
        Tcl_Obj *listPtr,
        Tcl_Size *objcptr,
        Tcl_Obj ***objvptr);

#### THE SETELEMENT FIELD

SetElement函数は､与えられた索引上の 指定されたリスト内の､与えられた索引上の要素を置換える｡ この函数はlset命令と類似している｡ The SetElement function replaces the element within the specified list at the give index. This function correlates to the lset command.

    typedef Tcl_Obj *(Tcl_ObjTypeSetElement) (
        Tcl_Interp *interp,
        Tcl_Obj *listPtr,
        Tcl_Size indexCount,
        Tcl_Obj *const indexArray[],
        Tcl_Obj *valueObj);

#### REPLACEPROC FIELD

ReplaceProcは､ 削除される要素を置換え､ 挿入される要素を加えて､リストを改修した後､新しいリストを返す｡ この函数は､Tcl_ListObjReplace C APIと類似している｡ The ReplaceProc returns a new list after modifying the list replacing the elements to be deleted, and adding the elements to be inserted. This function correlates to the Tcl_ListObjReplace C API.

    typedef int (Tcl_ObjTypeReplaceProc) (
        Tcl_Interp *interp,
        Tcl_Obj *listObj,
        Tcl_Size first,
        Tcl_Size numToDelete,
        Tcl_Size numToInsert,
        Tcl_Obj *const insertObjs[]);

#### THE INOPERPROC FIELD

InOperProc函数は､要素の同等の文字列比較に従って､値が､与えられたリスト内に存するか否かを決定する｡ boolResultは､もし､値が存すると1 (真値)を設定し､存しないと0 (偽値)を設定する｡ この函数は､要約リストの為の"in"と"ni"の数学演算子を実装する｡ The InOperProc function determines whether the value is present in the given list, according to equivalent string comparison of elements. The boolResult is set to 1 (true) if the value is present, and 0 (false) if it is not present. This function implements the "in" and "ni" math operators for an abstract list.

    typedef int (Tcl_ObjTypeInOperatorProc) (
        Tcl_Interp *interp,
        Tcl_Obj *valueObj,
        Tcl_Obj *listObj,
        int *boolResult);

### 参照回数管理 REFERENCE COUNT MANAGEMENT

Tcl_AppendAllObjTypesへのobjPtr引数は､非共有にすべき; この函数は､値の参照回数を修正することはない､但し､その内容を修正する｡ もし､objPtrが(解釈可能としての)リストでないなら､この函数は解釈実行機能の結果を設定し､不都合を生成する; 非共有の空値の使用が強く推奨される｡ The objPtr argument to Tcl_AppendAllObjTypes should be an unshared value; this function will not modify the reference count of that value, but will modify its contents. If objPtr is not (interpretable as) a list, this function will set the interpreter result and produce an error; using an unshared empty value is strongly recommended.

Tcl_ConvertToTypeへのobjPtr引数は､幾つでも非-零参照回数を有し得る; この函数は参照回数を修正することはないが､不都合時に解釈実行機能の結果に書くかもしれないので､そこからの下の値がそれを呼ぶ前に追加参照を有する筈｡ The objPtr argument to Tcl_ConvertToType can have any non-zero reference count; this function will not modify the reference count, but may write to the interpreter result on error so values that originate from there should have an additional reference made before calling this.

Tcl_ObjType構造内のどの呼戻し函数もその引数の参照回数を修正することはない､但し､もし､値が子供の値を含む場合(譬えば､リストの要素､或は辞書の鍵語)､これらの子供の値はその参照回数を修正させるかもしれない｡ None of the callback functions in the Tcl_ObjType structure should modify the reference count of their arguments, but if the values contain subsidiary values (e.g., the elements of a list or the keys of a dictionary) then those subsidiary values may have their reference counts modified.

### SEE ALSO

Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount, Tcl_BounceRefCount

### KEYWORDS

internal representation, value, value type, string representation, type conversion
Copyright © 1996-1997 Sun Microsystems, Inc.