Next: 3 例題:Xwindow操作機能の追加
Up: ソフトウェア第三 講義資料 Lisp, リスト処理,集合
Previous: 1.8 ロボットプログラミング用のlisp: Euslisp
2 Xlispの組込み関数の追加法
組込み関数を追加する場合には,
組込み関数の本体を記述し,それを
xlftab.cに登録して,全体を
リンクする.
#include "xlisp.h"
extern LVAL cvflonum();
float logistic (x)
float x;
{
double exp ();
#ifdef MSDOS
if (x > 11.5129) return(.99999);
else if (x < -11.5129) return(.00001);
#else
if (x > 15.935773) return(.99999988);
else if (x < -15.935773) return(.00000012);
#endif
else
return(1.0/
(1.0+
(float)exp((double)((-1.0)*x))));
}
float getflt(arg)
LVAL arg;
{
if (floatp(arg))
return (float) getflonum(arg);
else if (fixp(arg))
return (float) getfixnum(arg);
else xlbadtype(arg);
}
LVAL xlogistic()
{
LVAL arg1;
FLOTYPE v;
arg1 = xlgetarg(); xllastarg();
return(cvflonum((FLOTYPE)
logistic(getflt(arg1))));
}
LVAL xvdot()
{
LVAL arg1,arg2;
float sum;
int i;
arg1 = xlgavector();
arg2 =xlgavector(); xllastarg();
sum = 0.0;
for (i = 0; i< getsize(arg1); i++)
sum += getflt(getelement(arg1,i)) *
getflt(getelement(arg2,i));
return (cvflonum(sum));
}
Xlispでは,ユーザが関数を増やす場合に2つのヘッダファイルosdefs.h, osptrs.hに
その増やした関数を登録します.この二つは,xlftab.cの中でincludeされてい
る.
- osptrs.h
osptrs.hは,Cの関数とLispでの呼び名との対応を付けるための配列(funtab)
の中でincludeされる形で,以下のように配列の途中に3つの要素からなる構
造体の配列要素を定義します.
{"LOGISTIC", S, xlogistic},
{"V.", S,xvdot},
- osdefs.h
osdefs.hは,以下のようにCの関数をextern宣言するためのファイルです.
extern LVAL xlogistic();
extern LVAL xvdot();
generated through LaTeX2HTML. M.Inaba 平成18年5月7日