## Tcl8.6.17/Tk8.6.17 Documentation > Tcl C API > Interp

### 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_Interp — 解釈実行機能構造の依頼者-可視欄　　client-visible fields of interpreter structures
  SYNOPSIS
    #include <tcl.h>
    typedef struct {
    char *result;
    Tcl_FreeProc *freeProc;
    int errorLine;
    } Tcl_Interp;
    typedef void Tcl_FreeProc(
    char *blockPtr);
  説明 DESCRIPTION
  KEYWORDS

### NAME

Tcl_Interp — 解釈実行機能構造の依頼者-可視欄　　client-visible fields of interpreter structures

### SYNOPSIS

#include <tcl.h>
typedef struct {
`` char *result;
`` Tcl_FreeProc *freeProc;
`` int errorLine;
} Tcl_Interp;
typedef void Tcl_FreeProc(
`` char *blockPtr);

### 説明 DESCRIPTION

Tcl_CreateInterp 手続函数は Tcl_Interp 構造へのポインターを返す｡ Tcl_CreateInterp の呼出し側はこのポインターを不透明な字句として使うべきである､ Tcl 対話機能内の他の業務譜に戻す以外にはなにも適切でない｡直接ポインターを通す利用欄は下に記述した様に最早運営されていない｡運営されている公共の機能譜 Tcl_SetResult と Tcl_GetResult と Tcl_SetErrorLine と Tcl_GetErrorLine を代りに使うべきである｡ 　　　 The Tcl_CreateInterp procedure returns a pointer to a Tcl_Interp structure. Callers of Tcl_CreateInterp should use this pointer as an opaque token, suitable for nothing other than passing back to other routines in the Tcl interface. Accessing fields directly through the pointer as described below is no longer supported. The supported public routines Tcl_SetResult, Tcl_GetResult, Tcl_SetErrorLine, Tcl_GetErrorLine must be used instead.

最早維持管理されていない遺産的算譜と拡張譜については Tcl 8.6 冒頭ファイルに対する機械語翻訳が唯一可能な機械語翻訳指示文である 　　　 For legacy programs and extensions no longer being maintained, compiles against the Tcl 8.6 header files are only possible with the compiler directives

    #define USE_INTERP_RESULT

及び/若しくは　　 and/or

    #define USE_INTERP_ERRORLINE

Tcl_Interp 構造のどの欄が利用できるかに依存する｡これ等の指示は符号命令に埋込みされるか翻訳指示項目経由で提供される｡ 　　　 depending on which fields of the Tcl_Interp struct are accessed. These directives may be embedded in code or supplied via compiler options.

result と freeProc 欄は命令から結果か不都合伝言文を返す為に使われる｡この情報は命令手続函数から Tcl_Eval に返され､ Tcl_Eval は呼出し側に返す｡ result 欄は結果か不都合伝言文を表す文字列を指す､又 freeProc 欄はそれ以上必要でなくなった時に文字列の為の記憶域を如何に遺棄するかを告げる｡これ等の欄を操作する為の命令手続函数の為の容易な方法は Tcl_SetResult or Tcl_AppendResult のような手続函数を呼ぶことである; それらは欄管理の詳細をすべて隠す｡これ等の手続に関する下の記述はこの欄を直接操作する｡ 　　　　 The result and freeProc fields are used to return results or error messages from commands. This information is returned by command procedures back to Tcl_Eval, and by Tcl_Eval back to its callers. The result field points to the string that represents the result or error message, and the freeProc field tells how to dispose of the storage for the string when it is not needed anymore. The easiest way for command procedures to manipulate these fields is to call procedures like Tcl_SetResult or Tcl_AppendResult; they will hide all the details of managing the fields. The description below is for those procedures that manipulate the fields directly.

何時であれ､命令手続函数が帰るとき､解釈実行機能の result 欄は命令が返す結果の文字列を指す｡もし命令が結果を返すことを望まない場合､ interp->result は空文字列を指すであろう｡通常､結果は静的に割当られていると仮定される､それは内容が次に Tcl_Eval が呼ばれるか､他の命令手続函数が起動されるかの前には変化することはないことを意味する｡この場合､ freeProc は零でなければならない｡代りに､命令手続函数は動的にその返り値を割付けて(譬えば Tcl_Alloc を使って)､ interp->result のポインターに保存しても好い｡この場合､命令手続函数は interp->freeProc を､値の解放が可能になるように､手続函数の番地に設定するか､記憶域が Tcl か Tcl_Alloc 呼出しによって割当てられる場合は､ TCL_DYNAMIC に設定しなければならない｡もし interp->freeProc が非零の場合､次の命令を起動する前に､ Tcl は interp->result によって指されている区域を回付する為に freeProc を呼出す｡もし依頼側の手続函数が interp->freeProc が非零の時に interp->result を上書きすると､古い interp->result を解放する為に freeProc を呼ぶ責務を負う(この目的には Tcl_FreeResult マクロが使われるべきである)｡ 　　 Whenever a command procedure returns, it must ensure that the result field of its interpreter points to the string being returned by the command. The result field must always point to a valid string. If a command wishes to return no result then interp->result should point to an empty string. Normally, results are assumed to be statically allocated, which means that the contents will not change before the next time Tcl_Eval is called or some other command procedure is invoked. In this case, the freeProc field must be zero. Alternatively, a command procedure may dynamically allocate its return value (e.g. using Tcl_Alloc) and store a pointer to it in interp->result. In this case, the command procedure must also set interp->freeProc to the address of a procedure that can free the value, or TCL_DYNAMIC if the storage was allocated directly by Tcl or by a call to Tcl_Alloc. If interp->freeProc is non-zero, then Tcl will call freeProc to free the space pointed to by interp->result before it invokes the next command. If a client procedure overwrites interp->result when interp->freeProc is non-zero, then it is responsible for calling freeProc to free the old interp->result (the Tcl_FreeResult macro should be used for this purpose).

FreeProc は上記の Tcl_FreeProc 宣言に合致する引数と結果を有すべきである: それは一つの引数を受取る､それは解放すべき返り値へのポインターである｡大部分の応用譜内で TCL_DYNAMIC は freeProc にかつて使用された唯一の非零値である｡しかし､応用譜は､別の記憶域割当譜を使用する為か結果の記憶域が解放された時に他の刷新をする為か freeProc 内に異なる手続函数の番地を保存するかもしれない｡ FreeProc should have arguments and result that match the Tcl_FreeProc declaration above: it receives a single argument which is a pointer to the result value to free. In most applications TCL_DYNAMIC is the only non-zero value ever used for freeProc. However, an application may store a different procedure address in freeProc in order to use an alternate memory allocator or in order to do other cleanup when the result memory is freed.

それぞれの命令処理の一部として､ Tcl_Eval はその命令に関する命令手続函数を呼ぶ直前に interp->result と interp->freeProc を初期化する｡ freeProc 欄は零に初期化され､ interp->result は空文字列を指すようになる｡何も値を返さない命令は単純に欄の見残される｡更に､ result に指される空文字列は実際は TCL_RESULT_SIZE 文字の配列の一部である(約 200)｡もし命令が短い文字列を返すことを望む場合､単純に interp->result に指される領域を複写する｡又は､ interp->result によって指される場所に､短い文字列を生成する為に sprintf 手続函数を使うこともできる｡ As part of processing each command, Tcl_Eval initializes interp->result and interp->freeProc just before calling the command procedure for the command. The freeProc field will be initialized to zero, and interp->result will point to an empty string. Commands that do not return any value can simply leave the fields alone. Furthermore, the empty string pointed to by result is actually part of an array of TCL_RESULT_SIZE characters (approximately 200). If a command wishes to return a short string, it can simply copy it to the area pointed to by interp->result. Or, it can use the sprintf procedure to generate a short result string at the location pointed to by interp->result.

Tcl-に基いた応用譜の一般的慣習として､通常の解釈実行機能の結果は通常､前の段落で記述された初期化状態にある｡解釈実行機能の結果(譬えば､不都合を返す)を操作する手続函数は､手続函数が呼ばれた時に結果が初期化されることを一般に仮定している｡もし結果が変化した後でこの様な手続函数が呼ばれた場合､ Tcl_ResetResult は結果を初期状態に刷新する為に最初に呼出されるべきである｡直接の interp->result の使用は強く批判される( Tcl_SetResult を参照されたい)｡ 　　　 It is a general convention in Tcl-based applications that the result of an interpreter is normally in the initialized state described in the previous paragraph. Procedures that manipulate an interpreter's result (e.g. by returning an error) will generally assume that the result has been initialized when the procedure is called. If such a procedure is to be called after the result has been changed, then Tcl_ResetResult should be called first to reset the result to its initialized state. The direct use of interp->result is strongly deprecated (see Tcl_SetResult).

errorLine 欄は Tcl_Eval が TCL_ERROR 符号を返した後のみ適正である｡この状態ては errorLine 欄は不都合が生じた時に実行されていた行番号を識別する｡行番号は実行されていた命令に相対的である: 1 は Tcl_Eval,に渡された命令の最初の行を意味する､ 2 は第２行､以下同様である｡ errorLine 欄は典型的には､ Tcl_AddErrorInfo と一緒に不都合が生じた場所を報告する｡ errorLine は通常 Tcl_Eval.により修正されないことが期待されている｡ 　　 The errorLine field is valid only after Tcl_Eval returns a TCL_ERROR return code. In this situation the errorLine field identifies the line number of the command being executed when the error occurred. The line numbers are relative to the command being executed: 1 means the first line of the command passed to Tcl_Eval, 2 means the second line, and so on. The errorLine field is typically used in conjunction with Tcl_AddErrorInfo to report information about where an error occurred. ErrorLine should not normally be modified except by Tcl_Eval.

### KEYWORDS

free, initialized, interpreter, malloc, result
Copyright © 1989-1993 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.