Langphilia! / KL1 / KLIC-C / Data Objects, 2001-10-22

Data Objects


Usage in KLIC-KL1 Language

generic:GuardMehod( +Object, +Arg .. ): -Arg ..
Object の GuardMethod を呼び出す。 ガードメソッドの出力引数は、表記が変わっていることに注意せよ。
generic:BodyMethod( +Object, ?Arg .. )
Object の BodyMethod を呼び出す。
generic:generic( +Object, +BodyMethod( ?Arg .. ))
Object の BodyMethod を呼び出す。 BodyMethod(Arg ..) をファンクタとして表記する → 呼び出すメソッドを動的に選択することができる。

float

sign digits `.' digits ( `e' sign digits )?
定数表記 sign = `+' | `-' | `', digits = ( `0' | `1' | `2' | `3' | `4' | `5' | `6' | `7' | `8' | `9' )+
new +Init
整数 Init に数学的に等しい float オブジェクトを作る。
-X $:= +Expression
float 式 Expression の結果を変数 X に束縛する。 式の中で使える演算子は +/2, -/2, */2, `/'/2, pow/2, sin/1, cos/1, tan/1, asin/1, acos/1, atan/1, sinh/1, cosh/1, tanh/1, exp/1, log/1, sqrt/1, ceil/1, floor/1, float/1。対応するボディメソッドは add/3, subtract/3, multiply/3, divide/3, OtherOPs/+1。+1は計算結果。
$<, $=<, $>=, $>, $=:=, $=\= +X +Y
float オブジェクト X,Y を比較する。対応するガードメソッドは less_than, not_greater_than, not_less_than, greater_than, equal, not_equal 全て /2。

vector

`{' ( Term ( `,' Term )* )? `}'
定数表記
new +Init
整数 Init 個の 0 を要素に持つ vector オブジェクトを作る。 またはリスト Init の要素を要素に持つ vector オブジェクトを作る。
vector, size -Size
vector はガードメソッド、size はボディメソッド。要素数 Size を返す。
element +Index -Element
Index [0,*) 番目の要素 Element を返す。
set_element +Index (?Element) ?NewElement -NewVector
Index 番目の要素 Element を NewElement に換えた NewVector を返す。
split +Index -Vector1 -Vector2
[0,Index) 番目の要素を要素に持つ Vector1 と [Index,*) 番目の要素を要素に持つ Vector2 を返す。
join +Vector -JoinedVector
Vector を末尾に連結した JoinedVector を返す。

string

`"' (Char | EscapeSequence)* `"'
定数表記
new +Init +ElemSize
整数 Init 個の `\0' 文字を要素に持つ string オブジェクトを作る。 または文字のリスト Init の要素を要素に持つ string オブジェクトを作る。 ElemSize は 8。
string -Size -ElemSize
文字数 Size と ElemSize = 8 を返す。
size -Size
文字数 Size を返す。
element_size -ElemSize
ElemSize = 8 を返す。
element +Index -Element
Index [0,*) 番目の要素 Element を返す。
less_than, not_less_than +String
辞書順で String より前か否かを返す。
set_element +Index +Element -NewString
Index 番目の要素を Element に換えた NewString を返す。
split +Index -String1 -String2
[0,Index) 番目の要素を要素に持つ String1 と [Index,*) 番目の要素を要素に持つ String2 を返す。
join +String -JoinedString
String を末尾に連結した JoinedString を返す。
search_character +Start +End +Char -Index
Start 番目から End 番目までの要素を走査し、 Char に等しい要素が見つかれば何番目か Index を返す。 見つからなければ Index = -1 を返す。

module

new +NameAtom
NameAtom によって指定された module オブジェクトを作る。 指定されたモジュールが未定義ならば NameAtom を返す。
module
モジュールか否かを判定する。
name -NameAtom
モジュール名 NameAtom を返す。

predicate

`predicate#(' ModuleAtom `:' NameAtom `/' Arity `)'
定数表記
new +Module +NameAtom +Arity
述語オブジェクト predicate#(Module:NameAtom/Arity) を作る。
predicate
述語か否かを判定する。
arity -Arity
述語の引数の個数 Arity を返す。
apply +ArgVector
引数 ArgVector に述語を適用する。
call ?Arg ..
述語を呼び出す。
module -Module
述語を有する Module を返す。
name -NameAtom
述語名 NameAtom を返す。

pointer

new ?X
pointer オブジェクトを作る。

termarray

new ?Arg ..
Arg .. を要素に持つ termarray を作る。

goal

new +Predicate +ArgVector
引数 ArgVector に Predicate を適用するゴールを作る。
reduce
ゴールを実行待ち状態にする。
step Children WokenUp Failure SuspensionReason
ゴールをステップ実行待ち状態にする。
arg +Pos ?Arg
Pos [1,*] 番目の引数 Arg を返す。
setarg +Pos ?Arg ?NewArg -NewGoal
Pos 番目の引数 Arg を NewArg に換えた NewGoal を返す。
id -ID
ゴールの ID を返す。
predicate -ModuleNameAtom -NameAtom -Arity -PredID
述語 predicate#(ModuleNameAtom:NameAtom/Arity) = PredID を返す。
set_predicate +Predicate -NewGoal
述語を Predicate に換えた NewGoal を返す。

Usage in KLIC-C Language

klic/gdobject.h

副作用
klic/{ basic, struct, primitives, unify, index, gb, bb, g_basic, g_extern, g_extinl, g_methtab }.h が include される。

klic/gd_methtab.h

前提
include する前にマクロ GDUSE_MY_* を必要に応じて定義しておくこと。 GDDEF_* して GDUSE_MY_* を定義した後、GDDEF_NEW の前に include する。
変数 struct data_object_method_table GD_method_table
関数 q GD_STD_GUNIFY(), 関数 q* GD_STD_UNIFY()
関数 long GD_STD_PRINT()
関数 q* GD_STD_GC()
関数 long GD_STD_REGIST()
関数 long GD_STD_DEALLOCATE()
関数 q* GD_STD_CLOSE()
関数 q GD_STD_GGENERIC(), 関数 q* GD_STD_GENERIC()
関数 q GD_STD_COMPARE(), GD_STD_HASH()

klic/gd_macro.h

宣言 GD_USE_CLASS(class)
宣言 GDDEF_NEW(), GDDEF_GUNIFY(), GDDEF_UNIFY(), GDDEF_PRINT(), GDDEF_COMPARE(), GDDEF_HASH(), GDDEF_GC(), GDDEF_REGIST(), GDDEF_DEALLOCATE(), GDDEF_CLOSE(), GDDEF_GGENERIC(), GDDEF_GENERIC(), GDDEF_GMETHOD(ga), GDDEF_METHOD(fa), GDDEF_METHOD_NO_ARITY(fn)
q class:new (long GD_ARGC, q GD_ARGV[], q* g_allocp)
宣言 GD_STD_DECL_FOR_NEW
GD_rappend(pref), GD_guard(fa), GD_body(fa), GD_body_no_arity(fa)
型 GD_method_table, GD_method_table0(class), GD_method_table1(class)
`class'_g_data_method_table
定数 const char* GD_CLASS_NAME_STRING
定数 q GD_GCREQUEST
定数 long GD_GSUCCESS, GD_GFAILURE
関数 q eq_terms_body()
関数 (q*) GD_MAKE_GENERIC_GOAL(), G_MAKE_THE_NEW_GOAL()
関数 (q*) do_shallow_unify(), do_shallow_unify_value()
関数 q* G_SUSPEND()
関数 q GD_OBJ(long x)
関数 void GD_FAIL(const char* errmsg), GD_UNIFY_FAIL
関数 void GD_ERROR_IN_NEW, GD_ERROR_IN_UNIFY (const char* errmsg)
関数 void GD_ERROR_IN_METHOD (const char* errmsg, const char* methodname)
関数 void GD_GRETURN(q x), GD_RETURN, GD_GFAIL, GD_GUNIFY_FAIL, GD_GSUCCEED
関数 void GD_SUSPEND_NEW(q v), GD_RETURN_FROM_NEW(q v), GD_RETURN_FROM_PRINT, GD_RETURN_FROM_GC(newgobj)
関数 void GD_ALLOC_AREA, GD_ALLOC_AREA_FOR_NEW (new, type, size)
関数 void GDSET_NEWOBJ(newgobj), GDSET_NEWOBJ_IN_NEWGEN(newgobj), GDSET_NEWOBJ_FOR_NEW(newgobj, size)
関数 void GDset_myself_for_new
関数 void GDSET_INTARG, GDSET_INTARG_FOR_NEW (var, argv_i)
関数 void GDSET_SYMARG, GDSET_SYMARG_FOR_NEW (var, arg)
関数 void GDSET_GINTARG_WITHIN_RANGE(var, x, from, to), GDSET_INTARG_WITHIN_RANGE(var, argv_i, llim, ulim)
関数 void GD_GDEREF, GD_DEREF, GD_DEREF_FOR_NEW (q& x)
関数 void GD_DEREF_AND_HOOK(obj, method_functor, argv)
関数 GD_GUNIFY, GD_UNIFY, GD_UNIFY_VALUE (x, y)
関数 GD_PUTC(x), GD_PRINT(x), GD_PRINTF(s, arg), GD_PRINT_KL1_TERM(x), GD_PRINT_KL1_TERMS(x, b, s)
関数 GD_COPY_KL1_TERM_TO_NEWGEN(from, to)
関数 int GD_IS_CLASS(class, obj)
関数 q GD_CALL_GMETHOD, q* GD_CALL_METHOD (obj, method, argv)
関数 q GD_NEW(class, argc, argv)
GD_SWITCH_ON_GMETHOD, GD_SWITCH_ON_METHOD, GD_SWITCH_ON_ARITY, GD_SWITCH_ON_GMETHOD_NAME, GD_GMETHOD_CASE(fa), GD_METHOD_CASE(fa), GD_GMETHOD_CASE_DIRECT, GD_METHOD_CASE_DIRECT(fa), GD_GMETHOD_CASE_DEFAULT, GD_METHOD_CASE_DEFAULT, GD_METHOD_NAME_CASE(sym), GD_METHOD_NAME_CASE_DEFAULT

Making in KLIC-C Language

byte_string

klic/g_float.h

型 struct float_object
import struct data_object_method_table
型 float_structure_type
不要。
初期設定子 struct float_object declare_float_constant(double value)
関数 q makefloat(q* x)
import makefunctor
関数 struct float_object* float_value(q x)
import functorp

klic/g_pointer.h

型 struct pointer_object
import struct data_object_method_table

klic/g_string.h

型 struct byte_string_object
import struct data_object_method_table
定数 const q STRING_SHALLOW_MARK
import makeint
関数 int IS_SHALLOW_STRING(struct byte_string_object s)
import STRING_SHALLOW_MARK
型 string_structure_type_8
import struct byte_string_object
初期設定子 struct byte_string_object declare_string_constant_8 (unsigned char* body, unsigned length)
import byte_string_g_data_method_table, STRING_SHALLOW_MARK

klic/g_termarray.h

型 struct termarray_object
import struct data_object_method_table

klic/g_vector.h

型 struct vector_object
import struct data_object_method_table
型 vector_structure_type
不要。
定数 const q VECTOR_SHALLOW_MARK
import makeint
関数 int IS_SHALLOW_VECTOR(struct vector_object v)
import VECTOR_SHALLOW_MARK
初期設定子 struct vector_object declare_vector_constant (q* body, int length)
import vector_g_data_method_table, VECTOR_SHALLOW_MARK
関数 q create_vector()

klic/gmodule.h

klic/goalobj.h

runtime/gcode.c

runtime/gfloat.c

runtime/ggoal.c

runtime/gmodule.c

runtime/gmvv.c

runtime/gpointer.c

runtime/gstring.c

runtime/gtermarray.c

runtime/farith.kl1

module floating_arithmetics
述語 floating_point_* +X +Y -Z
add, subtract, multiply, divide, power
述語 floating_point_* +X -Z
sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, exp, log, sqrt, ceil, floor, to_integer

Copyright 2001, TAKAGI Yusuke.