18 * ringvm_cfunctionslist()
19 * ringvm_functionslist()
20 * ringvm_classeslist()
21 * ringvm_packageslist()
29 * ringvm_scopescount()
30 * ringvm_evalinscope()
32 * ringvm_hideerrorMsg()
44 この関数は、関数実行中に代入操作では解放されない一時作業用変数を用いるループで強制的にガベージコレクター呼び出すために使用します。
46 この関数が必要になることは非常に稀なことですが、ゲームエンジンでイベントループなどを作成して、
47 関数を呼び出して即席でリストの作成を開始するときに便利です。
56 # 一時作業領域による関数の呼び出し。 myfunc(["temp list"]) などのリストです。
62 .. tip:: Ring のガベージコレクターは関数の実行終了後または、
63 代入ステートメントを使用したときに自動的に動作します。
71 varptr() 関数は C / C++ 関数へポインタを渡します。
77 varptr(cVariableName, cPointerType) ---> 低水準オブジェクト (C ポインタ)
101 .. note:: 低水準オブジェクトのリストには三つの項目 (ポインタ、型、ステータス) を有しています。
110 space() 関数は指定されたバイト数のメモリ領域を確保します。
116 Space(nBytesCount) ---> 文字列
122 mystring = space(200)
123 See "String Size : " + len(mystring) + nl
124 See "String : " + mystring + nl
125 See "String Pointer : "
126 See varptr("mystring","char *")
134 String Pointer : 00FF8FE8
138 .. note:: C 関数へバッファを渡すは space() と VarPtr() 関数が必要です。
141 pair: 低水準関数; nullpointer()
146 仮引数でポインタを扱うことを想定しており、オプション扱いの仮引数に NULL ポインタを受け入れる場合は C 関数へ NULL ポインタを必ず渡してください。
150 この用例は LibSDL ライブラリから RingSDL にある SDL_BlitSurface() 関数を使用しています。
151 この関数は第二仮引数、および最後の仮引数で SDL_Rect ポインタを受け入れます。
152 また、関数は NULL ポインタを受け入れるために、 NULLPointer() 関数で NULL ポインタを渡せます。
156 SDL_BlitSurface(text, nullpointer(), surface, nullpointer())
158 .. note:: 前述のコードは単体では動作しません。最初に RingSDL の用法を学ぶ必要があります。
160 .. tip:: NULLPointer() 関数の代わりに NULL を仮引数として渡せます。
163 pair: 低水準関数; object2pointer()
166 =====================
168 この関数は Ring リスト用の C ポインタとオブジェクトを取得します。
174 object2pointer(リスト|オブジェクト) --> 低水準オブジェクト (C ポインタ)
177 pair: 低水準関数; pointer2object()
180 =====================
182 この関数は低水準オブジェクト (C ポインタ) から Ring のリスト、および / またはオブジェクトを取得します。
188 pointer2object(Low Level Object) ---> リスト|オブジェクト
199 x = object2pointer(mylist)
208 y = pointer2object(x)
226 .. note:: Ring の代入演算子は値によりリストとオブジェクトをコピーします。
227 参照によりコピーするには object2pointer() および pointer2object() 関数を使用します。
229 .. tip:: object2pointer() および pointer2object() は stdlib で使用されています。
230 Tree クラスの実装では子ノード (別オブジェクト) は親ノード (オブジェクト) を参照して作成します。
233 pair: 低水準関数; ispointer()
238 仮引数がポインタ (C オブジェクト) であるか検査します。
244 IsPointer(vPara) ---> True|False
250 fp = fopen(filename(),"r")
264 pair: 低水準関数; ptrcmp()
269 ptrcmp() 関数は二つのポインタ (C オブジェクト) 間で比較します。
275 ptrcmp(oObject1,oObject2) ---> oObject1 と oObject2 が等しいならば値は 1
276 oObject1 と oObject2 が等しくないならば値は 0
282 fp = fopen("ptrcmp.ring","r")
284 fp3 = fopen("ptrcmp.ring","r")
286 see ptrcmp(fp,fp2) + nl
287 see ptrcmp(fp,fp3) + nl
300 pair: 低水準関数; RingVM_CFunctionsList()
302 ringvm_cfunctionslist() 関数
303 ============================
305 C で記述された関数のリストを返す Ring 低水準関数です。
311 RingVM_CFunctionsList() ---> リスト
317 See RingVM_CFunctionsList()
320 pair: 低水準関数; RingVM_FunctionsList()
322 ringvm_functionslist() 関数
323 ===========================
325 Ring で記述された関数のリストを返す関数です。
327 各リストメンバは次の項目のリストを有しています。
330 * プログラムカウンタ (PC) - バイトコードによる関数の位置
332 * プライベートフラグ (クラスにあるプライベートメソッドならば)
338 RingVM_FunctionsList() ---> リスト
347 see ringvm_functionslist()
355 B:/ring/tests/scripts/functionslist.ring
359 pair: 低水準関数; RingVM_ClassesList()
361 ringvm_classeslist() 関数
362 =========================
366 各リストメンバは次の項目のリストを有しています。
369 * プログラムカウンタ (PC) - バイトコードによるクラスの位置
373 * パッケージへのポインタ (または未使用のパッケージならば NULL)
379 RingVM_ClassesList() ---> リスト
385 see ringvm_classeslist()
389 class class2 from class1
390 class class3 from class1
401 B:/ring/tests/scripts/classeslist.ring
417 pair: 低水準関数; RingVM_PackagesList()
419 ringvm_packageslist() 関数
420 ==========================
424 各リストメンバは次の項目のリストを有しています。
433 RingVM_PackagesList() ---> リスト
439 see ringvm_packageslist()
474 pair: 低水準関数; RingVM_MemoryList()
476 ringvm_memorylist() 関数
477 ========================
479 メモリのスコープと変数のリストを返す関数です。
481 各リストメンバには、次の異なるスコープにある変数のリストを有しています。
483 スコープリストにある各項目のリストには次の項目があります。
488 * 値がリストの場合はポインタの型 (リスト/項目)
489 * プライベートフラグ (変数がクラスの属性ならば)
495 RingVM_MemoryList() ---> リスト
505 see ringvm_memorylist()
581 B:/ring/tests/scripts/memorylist.ring
596 pair: 低水準関数; RingVM_CallList()
599 ======================
601 関数呼び出しリストのリストを返す関数です。
603 各リストメンバは次の項目のリストを有しています。
611 * 呼び出し元のプログラムカウンタ (PC)
622 RingVM_CallList() ---> リスト
633 mylist = ringvm_calllist()
634 for t in mylist see t[2] + nl next
640 function hello() in file B:/ring/tests/scripts/calllist.ring
642 function test() in file B:/ring/tests/scripts/calllist.ring
648 pair: 低水準関数; RingVM_FilesList()
650 ringvm_fileslist() 関数
651 =======================
653 Ring ファイルのリストを返す関数です。
659 RingVM_FilesList() ---> リスト
666 see ringvm_fileslist()
672 B:/ring/tests/scripts/fileslist.ring
673 B:\ring\bin\stdlib.ring
699 pair: 低水準関数; ringvm_settrace()
702 ======================
704 ringvm_settrace() はトレース関数名を決定する関数です。
713 RingVM_SetTrace(cCode)
716 pair: 低水準関数; ringvm_tracedata()
718 ringvm_tracedata() 関数
719 =======================
723 ringvm_tracedata() 関数はイベントデータを取得します。
725 イベントデータのリストには次の項目があります。
730 * メソッドまたは関数 (Bool : True=メソッド、 False=関数またはファイル)
736 RingVM_TraceData() ---> aDataList
739 pair: 低水準関数; ringvm_traceevent()
741 ringvm_traceevent() 関数
742 ========================
746 ringvm_traceevent() 関数はイベントの種類を検出します。
759 RingVM_TraceEvent() ---> nTraceEvent
762 pair: 低水準関数; ringvm_tracefunc()
764 ringvm_tracefunc() 関数
765 =======================
767 この関数はイベントのトレースで使用する関数名を返します。
773 RingVM_TraceEvent() ---> cCode
776 pair: 低水準関数; ringvm_scopescount()
778 ringvm_scopescount() 関数
779 =========================
781 RingVM_ScopesCount() 関数は、
782 アプリケーションで使用されているスコープの本数を検出します。
784 プログラムの開始時において、スコープは存在します (グローバルスコープのみ)。
786 関数の呼び出し時に、新しいスコープが作成されます。
788 関数実行終了後は、関数のスコープは削除されます。
794 RingVM_ScopesCount() ---> nScopes
797 pair: 低水準関数; ringvm_evalinscope()
799 ringvm_evalinscope() 関数
800 =========================
802 ringvm_evalinscope() は eval() 関数と類似する関数です。
804 eval() とは異なり、現在のスコープにあるコードを実行します。
806 RingVM_EvalInScope() は指定されたスコープにあるスコープを実行します。
812 RingVM_EvalInScope(nScope,cCode)
815 pair: 低水準関数; ringvm_passerror()
817 ringvm_passerror() 関数
818 =======================
820 ランタイムエラーが発生した時はエラーメッセージを表示後に
821 Ring はプログラムの実行を終了します。
823 ringvm_passerror() 関数を使うと、
824 前述の動作を回避してプログラムの実行を継続できます。
833 pair: 低水準関数; ringvm_hideerrorMsg()
835 ringvm_hideerrormsg() 関数
836 ==========================
838 RingVM_HideErrorMsg() 関数は、
839 ランタイムエラーメッセージの表示を有効または無効化します。
845 RingVM_HideErrorMsg(lStatus)
848 pair: 低水準関数; ringvm_callfunc()
851 ======================
853 eval() 関数ではなく ringvm_callfunc() 関数を使うと、
860 RingVM_CallFunc(cFuncName)
864 pair: 低水準関数; 用例 - トレース関数の用法
867 =============================
869 この用例では、プログラムのイベントをトレースするためにトレース関数を使用しています!
871 トレースライブラリは低水準関数よりも実用的です!
877 ringvm_settrace("mytrace()")
879 see "Hello, world!" + nl
881 see "How are you?" +nl
883 new myclass { mymethod() }
886 see "Message from mytest" + nl
889 see "====== The Trace function is Active ======" + nl +
890 "Trace Function Name : " + ringvm_TraceFunc() + nl +
892 switch ringvm_TraceEvent()
893 on TRACEEVENT_NEWLINE see "New Line"
894 on TRACEEVENT_NEWFUNC see "New Function"
895 on TRACEEVENT_RETURN see "Return"
896 on TRACEEVENT_ERROR see "Error"
897 on TRACEEVENT_BEFORECFUNC see "Before C Function"
898 on TRACEEVENT_AFTERCFUNC see "After C Function"
901 "Line Number : " + ringvm_tracedata()[TRACEDATA_LINENUMBER] + nl +
902 "File Name : " + ringvm_tracedata()[TRACEDATA_FILENAME] + nl +
903 "Function Name : " + ringvm_tracedata()[TRACEDATA_FUNCNAME] + nl +
904 "Method or Function : "
905 if ringvm_tracedata()[TRACEDATA_METHODORFUNC] =
906 TRACEDATA_METHODORFUNC_METHOD
909 if ringvm_tracedata()[TRACEDATA_FUNCNAME] = NULL
915 see nl + Copy("=",42) + nl
919 see "Message from mymethod" + nl
925 ====== The Trace function is Active ======
926 Trace Function Name : mytrace()
927 Trace Event : After C Function
929 File Name : test1.ring
930 Function Name : ringvm_settrace
931 Method or Function : Function
932 ==========================================
933 ====== The Trace function is Active ======
934 Trace Function Name : mytrace()
935 Trace Event : New Line
937 File Name : test1.ring
939 Method or Function : Command
940 ==========================================
942 ====== The Trace function is Active ======
943 Trace Function Name : mytrace()
944 Trace Event : New Line
946 File Name : test1.ring
948 Method or Function : Command
949 ==========================================
951 ====== The Trace function is Active ======
952 Trace Function Name : mytrace()
953 Trace Event : New Line
955 File Name : test1.ring
957 Method or Function : Command
958 ==========================================
960 ====== The Trace function is Active ======
961 Trace Function Name : mytrace()
962 Trace Event : New Line
964 File Name : test1.ring
966 Method or Function : Command
967 ==========================================
968 ====== The Trace function is Active ======
969 Trace Function Name : mytrace()
970 Trace Event : New Function
972 File Name : test1.ring
973 Function Name : mytest
974 Method or Function : Function
975 ==========================================
976 ====== The Trace function is Active ======
977 Trace Function Name : mytrace()
978 Trace Event : New Line
980 File Name : test1.ring
981 Function Name : mytest
982 Method or Function : Function
983 ==========================================
985 ====== The Trace function is Active ======
986 Trace Function Name : mytrace()
987 Trace Event : New Line
989 File Name : test1.ring
990 Function Name : mytest
991 Method or Function : Function
992 ==========================================
993 ====== The Trace function is Active ======
994 Trace Function Name : mytrace()
997 File Name : test1.ring
999 Method or Function : Command
1000 ==========================================
1001 ====== The Trace function is Active ======
1002 Trace Function Name : mytrace()
1003 Trace Event : New Line
1005 File Name : test1.ring
1007 Method or Function : Command
1008 ==========================================
1009 ====== The Trace function is Active ======
1010 Trace Function Name : mytrace()
1011 Trace Event : New Line
1013 File Name : test1.ring
1015 Method or Function : Command
1016 ==========================================
1017 ====== The Trace function is Active ======
1018 Trace Function Name : mytrace()
1019 Trace Event : Before C Function
1021 File Name : test1.ring
1022 Function Name : ismethod
1023 Method or Function : Function
1024 ==========================================
1025 ====== The Trace function is Active ======
1026 Trace Function Name : mytrace()
1027 Trace Event : After C Function
1029 File Name : test1.ring
1030 Function Name : ismethod
1031 Method or Function : Function
1032 ==========================================
1033 ====== The Trace function is Active ======
1034 Trace Function Name : mytrace()
1035 Trace Event : New Function
1037 File Name : test1.ring
1038 Function Name : mymethod
1039 Method or Function : Method
1040 ==========================================
1041 ====== The Trace function is Active ======
1042 Trace Function Name : mytrace()
1043 Trace Event : New Line
1045 File Name : test1.ring
1046 Function Name : mymethod
1047 Method or Function : Method
1048 ==========================================
1049 Message from mymethod
1050 ====== The Trace function is Active ======
1051 Trace Function Name : mytrace()
1052 Trace Event : Return
1054 File Name : test1.ring
1056 Method or Function : Command
1057 ==========================================
1058 ====== The Trace function is Active ======
1059 Trace Function Name : mytrace()
1060 Trace Event : Before C Function
1062 File Name : test1.ring
1063 Function Name : ismethod
1064 Method or Function : Function
1065 ==========================================
1066 ====== The Trace function is Active ======
1067 Trace Function Name : mytrace()
1068 Trace Event : After C Function
1070 File Name : test1.ring
1071 Function Name : ismethod
1072 Method or Function : Function
1073 ==========================================
1074 ====== The Trace function is Active ======
1075 Trace Function Name : mytrace()
1076 Trace Event : Before C Function
1078 File Name : test1.ring
1079 Function Name : ismethod
1080 Method or Function : Function
1081 ==========================================
1082 ====== The Trace function is Active ======
1083 Trace Function Name : mytrace()
1084 Trace Event : After C Function
1086 File Name : test1.ring
1087 Function Name : ismethod
1088 Method or Function : Function
1089 ==========================================
1090 ====== The Trace function is Active ======
1091 Trace Function Name : mytrace()
1092 Trace Event : New Line
1094 File Name : test1.ring
1096 Method or Function : Command
1097 ==========================================
1101 pair: 低水準関数; 用例 - トレースライブラリ
1104 ===========================
1106 この用例では、トレースライブラリ作成用のトレース関数を使用します。
1109 すばらしいトレースツールとインタラクティブデバッガを利用できます。
1111 .. code-block:: ring
1114 TRACEEVENT_NEWLINE = 1
1115 TRACEEVENT_NEWFUNC = 2
1116 TRACEEVENT_RETURN = 3
1117 TRACEEVENT_ERROR = 4
1118 TRACEEVENT_BEFORECFUNC = 5
1119 TRACEEVENT_AFTERCFUNC = 6
1122 TRACEDATA_LINENUMBER = 1
1123 TRACEDATA_FILENAME = 2
1124 TRACEDATA_FUNCNAME = 3
1125 TRACEDATA_METHODORFUNC = 4
1128 TRACEDATA_METHODORFUNC_METHOD = TRUE
1129 TRACEDATA_METHODORFUNC_NOTMETHOD = FALSE
1131 TRACE_BREAKPOINTS = TRUE
1136 switch trim(lower(cType))
1138 ringvm_settrace("TraceLib_AllEvents()")
1140 ringvm_settrace("TraceLib_Functions()")
1142 ringvm_settrace("TraceLib_PassError()")
1144 ringvm_settrace("TraceLib_Debugger()")
1146 ringvm_settrace("TraceLib_LineByLine()")
1149 func TraceLib_AllEvents
1150 if right(ringvm_tracedata()[TRACEDATA_FILENAME],13) = "tracelib.ring"
1153 see "====== The Trace function is Active ======" + nl +
1154 "Trace Function Name : " + ringvm_TraceFunc() + nl +
1156 switch ringvm_TraceEvent()
1157 on TRACEEVENT_NEWLINE see "New Line"
1158 on TRACEEVENT_NEWFUNC see "New Function"
1159 on TRACEEVENT_RETURN see "Return"
1160 on TRACEEVENT_ERROR see "Error"
1161 on TRACEEVENT_BEFORECFUNC see "Before C Function"
1162 on TRACEEVENT_AFTERCFUNC see "After C Function"
1165 "Line Number : " + ringvm_tracedata()[TRACEDATA_LINENUMBER] + nl +
1166 "File Name : " + ringvm_tracedata()[TRACEDATA_FILENAME] + nl +
1167 "Function Name : " + ringvm_tracedata()[TRACEDATA_FUNCNAME] + nl +
1168 "Method or Function : "
1169 if ringvm_tracedata()[TRACEDATA_METHODORFUNC] =
1170 TRACEDATA_METHODORFUNC_METHOD
1173 if ringvm_tracedata()[TRACEDATA_FUNCNAME] = NULL
1179 see nl + Copy("=",42) + nl
1181 func TraceLib_Functions
1182 if right(ringvm_tracedata()[TRACEDATA_FILENAME],13) = "tracelib.ring"
1185 switch ringvm_TraceEvent()
1186 on TRACEEVENT_NEWFUNC
1187 see "Open Func : " +
1188 ringvm_TraceData()[TRACEDATA_FUNCNAME] + nl
1189 on TRACEEVENT_RETURN
1190 see "Return to Func : " +
1191 ringvm_TraceData()[TRACEDATA_FUNCNAME] + nl
1194 func TraceLib_PassError
1195 if right(ringvm_tracedata()[TRACEDATA_FILENAME],13) = "tracelib.ring"
1198 switch ringvm_TraceEvent()
1201 see "TraceLib : After Error !" + nl
1205 func TraceLib_Debugger
1206 if right(ringvm_tracedata()[TRACEDATA_FILENAME],13) = "tracelib.ring"
1209 switch ringvm_TraceEvent()
1214 func TraceLib_LineByLine
1215 if right(ringvm_tracedata()[TRACEDATA_FILENAME],13) = "tracelib.ring" or
1216 ringvm_TraceEvent() != TRACEEVENT_NEWLINE
1219 aList = ringvm_tracedata()
1220 see "Before Line : " + aList[TRACEDATA_LINENUMBER] + nl
1224 if not TRACE_BREAKPOINTS
1230 see nl+nl+Copy("=",60) + nl +
1231 Copy(" ",20)+"Interactive Debugger" + nl +
1233 "Command (Exit) : End Program" + nl +
1234 "Command (Cont) : Continue Execution" + nl +
1235 "Command (Locals) : Print local variables names" + nl +
1236 "Command (LocalsData) : Print local variables data" + nl +
1237 "Command (Globals) : Print global variables names" + nl +
1238 "We can execute Ring code" + nl +
1243 cmd = trim(lower(cCode))
1244 if cmd = "exit" or cmd = "bye"
1247 nScope = ringvm_scopescount()-2
1250 ringvm_EvalInScope(nScope,"see locals() callgc()")
1253 PrintLocalsData(nScope)
1256 ringvm_EvalInScope(nScope,"see globals() callgc()")
1263 ringvm_EvalInScope(nScope,cCode)
1270 TRACE_BREAKPOINTS = FALSE
1273 func PrintLocalsData nScope
1274 if nScope = 1 # グローバル
1275 ringvm_Evalinscope(nScope,'TRACE_TEMPLIST = globals()')
1277 ringvm_Evalinscope(nScope,'TRACE_TEMPLIST = locals() callgc()')
1280 aTempList = TRACE_TEMPLIST
1283 for TRACE_ITEM in aTempList
1284 if len(TRACE_ITEM) + 5 > nSpaces
1285 nSpaces = len(TRACE_ITEM) + 5
1288 for TRACE_ITEM in aTempList
1289 see "Variable : " + TRACE_ITEM
1290 cVarName = TRACE_ITEM
1291 see copy(" ",nSpaces-len(cVarName)) + " Type : "
1292 ringvm_Evalinscope(nScope,"see type(" + TRACE_ITEM +")")
1293 ringvm_Evalinscope(nScope,"see Copy(' ',fabs(15-len(type(" +
1296 ringvm_Evalinscope(nScope,"see " + TRACE_ITEM)
1302 pair: 低水準関数; ringvm_see()
1307 ringvm_see() 関数は See 命令の挙動を変更します。
1309 また ring_see() 関数は元の挙動を使用します。
1313 .. code-block:: ring
1315 see "Hello world" + nl
1317 see ["one","two","three"]
1318 see new point {x=10 y=20 z=30}
1321 ring_see("We want to print: ")
1328 .. code-block:: none
1330 We want to print: Hello world
1331 We want to print: 123
1332 We want to print: one
1335 We want to print: x: 10.000000
1340 pair: 低水準関数; ringvm_give()
1345 ringvm_give() 関数は Give 命令の挙動を変更します。
1347 また ring_give() 関数は元の挙動を使用します。
1351 .. code-block:: ring
1353 see "Name: " give name
1362 .. code-block:: ring
1368 pair: 低水準関数; ringvm_info()
1373 ringvm_info () は Ring VM 構造体に関する情報をリストとして返す内部関数です。
1375 この関数は Ring チームが VM の状態を調査するための高度な検証に限り使用されています。
1379 .. code-block:: ring
1381 ringvm_info() ---> VM 構造体に関する情報のリスト