引数リストの変換
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

Prologの引数リストをtoolkitの引数リストに変換する場合には、IFXtSetArgs()を使って下さい。

この手続きはPrologのリストを第1引数とし、widgetを第2引数として呼び出されます。widgetがすでに存在している場合には、第3引数はNULLで第4引数はArgSetValuesになります。widgetが引数リストを使って生成される場合には、第2引数はその親で、第3引数はそのクラス、第4引数はArgCreateでなければなりません。

返される値は整数で、引数の数を表します。変換が失敗した場合には -1 になります。この場合Prologに対する例外処理はすでに生成されているので、単に失敗して終了すればそれが起動されます。

変換の結果は、グロ−バルな引数リストIFXtArgsに代入されます。

例題:xtCreateWidgetの実現のCパ−ト

static int IFXtCreateWidget() { Widget NewWidget, Parent; WidgetClass class; char *resname, *class_name; TERM pro_name; unsigned int *counter; extern int WidgetToProlog(); extern char *IFXtCvtError; extern WidgetClass IFXtPCCvtWidgetClass();

if ( !XChk(IsVar(IFArg(1))|| IsAt(IFArg(1)), "variable_or_atom_expected") || !XChk(IsVar(IFArg(2)) || IsAt(IFArg(2)), "variable_or_atom_expected") || !XChk(IsAt(IFArg(3)), IF_EXC_atom_exp) || !XChk(IsWidget(IFArg(4),&Parent),IF_EXC_widget_exp) || !XChk(IsListOrNil(IFArg(5)), IF_EXC_list_exp)) { return 0; }

class = IFXtPCCvtWidgetClass( IFArg( 3), &counter); if ( class == NULL) EXCEPTION( "illegal_widget_class"); IFXtCvtError = NULL; class_name = XtNewString( class->core_class.class_name); class_name 0 = tolower( class_name 0 ); pro_name = IFCGetNewWidgetName( IFArg( 1), class_name, counter);

XtFree( class_name); if ( IFXtCvtError) EXCEPTION( IFXtCvtError); UnifyArg( 1, pro_name); if ( !IsAt( IFArg( 2))) EXCEPTION( IF_EXC_atom_exp); resname = AtStr(IFArg(2));

if( IFXtSetArgs( IFArg(5), Parent, class, ArgCreate) < 0) return 0;

NewWidget = XtCreateWidget( resname, class, Parent, IFXtArgs, (Cardinal) IFXtnof_args); IFXtFreeArgsAfterUsage(); /* I actually call this to register the new widget */ WidgetToProlog( NewWidget, pro_name); return 1; }


Up read on...