OgO JavaScriptは JavaScript実行環境OgO上でのみ使えるオブジェクトと関数の説明を行います。
表示・入力 | |
print, p関数 | 文字列を表示して改行 |
putstr関数 | 文字列を表示 |
alert関数 | 警告ダイアログを表示 |
confirm関数 | 確認ダイアログを表示 |
prompt関数 | 入力ダイアログを表示 |
オブジェクト操作 | |
newGlobal関数 | 新compartment内にglobalオブジェクトを生成する. |
intern関数 | 文字列をatomテーブルに登録する |
__wrapper__関数 | 関数をラップし、ソースコードが見えないようにする。 |
実行 | |
evaluate関数 | JavaScriptのコードを評価し、実行 |
__evalWithThis__関数 | 実行コンテキスト付きでコードを評価し、実行 |
load関数 | JavaScriptコード,Moduleを読み込み実行 |
__loadDll__関数 | Dllをロードし、指定オブジェクトにプロパティをset |
compile関数 | コードを文法チェック |
__modifyCode__関数 | スクリプトコードを実行できるJavaScriptコードへ調整(修正)する. |
ファイル | |
__snarf__関数 | ファイルを読み込む(zipフォルダーもok) |
__dump__関数 | データをダンプする。 |
__debugLogger__関数 | log関数を作成する。 |
__getTempFilename__関数 | テンポラリーファイル名を作成する。 |
モード | |
__interactive__関数 | 会話処理モードの切り替え |
__silent__関数 | 最後に実行された結果を出力表示するかどうか切り替える |
終了・休止 | |
quit関数 | scriptの実行を終了 |
sleep関数 | 実行休止 |
__exit__関数 | script実行を終了 mainスクリプトでは、アプリも終了する。 |
GC | |
gc関数 | garbage collectionを起動 |
gcparam関数 | GC パフォーマンスパラメータの取得と設定 |
実行オプション | |
options関数 | オプション切り替え |
isOption関数 | オプション判定 |
setOption関数 | オプション設定のセット/解除 |
デバッグ | |
assertEq関数 | 2つの値が等しいかをチェック |
throwError関数 | エラーを投げる |
保護 | |
safeMode関数 | safeモードへの切り替え |
isSafe関数 | safeモードかどうかの判定 |
イベント | |
addListener, on関数 | イベント受信関数の登録 |
removeListener, off関数 | イベント受信関数の削除 |
__isProcessingRequest__関数 | イベント処理中であるかどうかを判断 |
__waitEvents__関数 | Eventを待機し、あればそのEventを処理する |
__cancelWaitEvents__関数 | __waitEvents__関数を終了させる。 |
プロセッサ、スレッド | |
__getNprocessor__関数 | PCのプロセッサ数を取得 |
__getNworkerthread__関数 | Worker、同時実行スレッド最大数を取得する |
__setNworkerthread__関数 | Worker、同時実行スレッド最大数を設定する |
タイマーイベント補助関数 | |
__setTimer__関数 | timerをsetする |
__killTimer__関数 | timerを解除する |
__procTimer__関数 | timerが起こったとき、OgOシステムが呼び出す関数 |
バージョンなど | |
version関数 | コンパイルversionの取得・設定する。 |
build関数 | ビルド日時を表示する. |
help関数 | 関数の使い方と説明を表示する。 |
その他 | |
__bits__定数 | CPUビット数 |
__context__文字列定数 | JavaScriptコンテキストアドレス |
__hwnd__定数 | JavaScript Windowハンドル |
__hmainWnd__定数 | アプリメイン Windowハンドル |
__dirname文字列定数 | 現在実行中スクリプトファイルのディレクトリ名 |
__filename文字列定数 | 現在実行中スクリプトのフルファイルパス名 |
__root_dir__文字列定数 | OgOルートディレクトリ |
__appFolder__文字列定数 | アプリケーションルートディレクトリ |
__appName__文字列定数 | アプリケーション名 |
__appProgname__文字列定数 | アプリケーション実行プログラム名 |
_r, _R 関数 | 生文字列作成 |
__regEndProc__ 関数 | JSスレッドの終了時に実行する関数を登録する |
__unregEndProc__ 関数 | JSスレッドの終了時に実行される関数を登録抹消する |
print("abc =", 123, "+", 321); print("abc =", 444); // abc = 123 + 321 // abc = 444
putstr("abc =", 123, "+", 321); // abc = 123 + 321
警告メッセージ
タイトル(省略時、"Warning")
alert.MB_OK, MB_OKCANCEL, ...., MB_TASKMODALなど 省略時はMB_TASKMODAL
Windowハンドル 省略時は0
style==-1のとき、返値なし style!=-1のとき、WindowsのMessageBox関数と同じ結果が返される.
確認メッセージ
[OK] ボタンを押すと真(true)が、[Cancel]ボタンを押すと偽(false)が返されます。
例1.単純な計算 TODO 例2.変数の値 TODO
例1.単純な計算 var x = 3, y = 4; alert( __evalWithThis__("Math.sqrt( x*x + y*y)") ); //5 alert( __evalWithThis__.call({x:5, y:12}, "Math.sqrt( x*x + y*y)") ); //13 例2.変数の値 var z = 1; function f() { var z = 2; alert( __evalWithThis__("z = z * 100") ); } f(); // 100 function g() { var z = 2; alert( eval("z = z * 100") ); } g(); // 200
filenameがフルパスでないとき、実行スクリプトファイルのフォルダーとlibPathに登録されたフォルダーから検索してファイルを見つけます。
ミリ秒
Javascriptの実行を指定時間、休止します。
for (var i=0; i<100000; ++i) { ・ // メモリーを消費する処理 if ((i+1)%1000==0) gc(); // 1000回に処理を繰り返したらメモリー掃除を行う }
"maxBytes" | GCのメモリ上限バイト数 | value |
"maxMallocBytes" | GCがメモリー要求で確保するバイト数 | value |
"gcBytes" | GCが確保しているメモリーバイト数 | |
"gcNumber" | GCが実行された回数 |
strict | 疑わしい部分はwarn(警告) |
werror | warning は errorにします。 |
strict_mode | strictモード(厳格モード)("use strict"行を追加したscriptを実行する。) |
CPUビット数 64ビット版 OgO.exeの場合、64. 32ビット版 OgO.exeの場合、32.
JavaScriptコンテキストアドレスを16進数で文字列化
JavaScript Windowハンドル
アプリメイン Windowハンドル
現在実行中スクリプトファイルのディレクトリ名(最後「\」なし)
現在実行中スクリプトのフルファイルパス名
OgOルートディレクトリ(最後「\」なし)
アプリケーションルートディレクトリ(最後「\」あり)
アプリケーション名
アプリケーション実行プログラム名
OgO内部で次のように定義しています。 let _r = String.raw; let _R = String.raw;
function endProc() { //ここにJSスレッドが終了すときに、後始末などの処理を行うプログラムを記述 ・・・ }
JavaScript実行環境OgOが動作する(Activeな)プロセスやスレッドを、PWorker(プロセスWorker)と呼ぶことにします。
PWorkerオブジェクトは、プロセスWorker間を通信可能にするオブジェクトです。
PWorkerオブジェクトを使ったプロセス間通信プログラムは、PWorkerを呼び出す側(クライアント側)と呼び出される側(サーバ側)のコードを決まった手順で記述します。
■ シンプルなプロセス間通信の手順
=PWorkerを呼び出す側(クライアント側)コード= [C1] 呼び出すPWorkerオブジェクトを作成(ロードしていなければロードする) [C2] サーバ側からのレスポンスを受信する関数を登録 [C3] サーバ側でリクエスト処理中に起きたエラーをキャッチする関数を登録 [C4] サーバ側にリクエストを送る =呼び出される側(サーバ側)PWorkerのコード= [S1] クライアント側からのリクエストを受信する関数を登録 [S2] クライアント側にレスポンスを返す
2つのクライアント(SimpleClient,SimpleClient2)が1つのサーバー(SimpleServer)からサービスを受ける *** SimpleClient.js ***(Start PWorker) // PWorkerを呼び出す側(クライアント側)コード var pw = new PWorker("SimpleServer", "SimpleServer.js"); // [C1] on("ansAdd", function(ans) { print("ans = " + ans); }); // [C2] on("error", function(err) { // [C3] alert("filename : " + err.filename + "\n" + "lineno : " + err.lineno + "\n" + "message : " + err.message); }); pw.post("add", 100,200); // [C4] /* 出力結果 ans = 300 */ *** SimpleClient2.js ***(Second PWorker) // PWorkerを呼び出す側(クライアント側)コード var pw = new PWorker("SimpleServer"); // [C1] すでにサーバが起動していればニックネームのみの引数でよい on("ansAdd", function(ans) { print("ans = " + ans); }); // [C2] pw.post("add", 10,20); // [C4] /* 出力結果 ans = 30 */ ---------------------------------------------------------------------- *** SimpleServer.js ***(Server PWorker) // 呼び出される側(サーバ側)PWorkerのコード on("add", function(a,b) { // [S1] this.source.post("ansAdd",a + b ); //[S2] sourceは呼び出す側(クライアント側)のPWorkerオブジェクト });
■ 精密なプロセス間通信の手順
=PWorkerを呼び出す側(クライアント側)コード= [C1] 呼び出すPWorkerオブジェクトを作成(ロードしていなければロードする) [C2] connect要求して portを取得 [C3] portオブジェクトにサーバ側からのレスポンスを受信する関数を登録 [C4] サーバ側でリクエスト処理中に起きたエラーをキャッチする関数を登録 [C5] サーバ側でportを閉じられたことをキャッチする関数((port切断時の終了処理))を登録 [C6] サーバ側にportを使ってリクエストを送る [C7] portの切断 =呼び出される側(サーバ側)PWorkerのコード= [S1] クライアント側からのconnect要求を受信する関数を登録 [S2] クライアント側からのリクエストを受信する関数を登録 [S3] クライアント側でportが閉じられたことをキャッチする関数(port切断時の終了処理)を登録 [S4] クライアント側にレスポンスを返す
2つのクライアント(ExactClient,ExactClient2)が1つのサーバー(ExactServer)からサービスを受ける *** ExactClient.js ***(Start PWorker) // PWorkerを呼び出す側(クライアント側)コード var pw = new PWorker("ExactServer", "ExactServer.js"); // [C1] var port = pw.connect("ExactClient"); // [C2] port.on("ansAdd", function(ans, name, cnt) { print(cnt + " call => [add] ans = " + ans + " name = " + name); }); // [C3] port.on("ansSub", function(ans, name, cnt) { print(cnt + " call => [sub] ans = " + ans + " name = " + name); }); // [C3] port.on("error", function(err) { // [C4] alert("filename : " + err.filename + "\n" + "lineno : " + err.lineno + "\n" + "message : " + err.message); }); port.on("close", function() { // [C5] // サーバ側から portが閉じられた // portが切断された // ・・・ }); port.post("add", 200,100); // [C6] port.post("sub", 200,100); // [C6] port.close(); // [C7] 以降、通信できない /* 出力結果 1 call => [add] ans = 300 name = ExactClient 2 call => [add] ans = 100 name = ExactClient */ *** ExactClient2.js ***(Second PWorker) // PWorkerを呼び出す側(クライアント側)コード var pw = new PWorker("ExactServer"); // [C1] すでにサーバが起動していればニックネームのみの引数でよい var port = pw.connect("ExactClient2"); // [C2] port.on("ansAdd", function(ans, name, cnt) { print(cnt + " call => [add] ans = " + ans + " name = " + name); }); // [C3] port.on("ansSub", function(ans, name, cnt) { print(cnt + " call => [sub] ans = " + ans + " name = " + name); }); // [C3] port.post("add", 20,10); // [C6] port.post("sub", 20,10); // [C6] port.post("add", 2000,1000); // [C6] port.close(); // [C7] 以降、通信できない /* 出力結果 1 call => [add] ans = 30 name = ExactClient2 2 call => [sub] ans = 10 name = ExactClient2 3 call => [add] ans = 3000 name = ExactClient2 */ ---------------------------------------------------------------------- *** ExactServer.js ***(Server PWorker) // 呼び出される側(サーバ側)PWorkerのコード on("connect", function(event) { // [S1] var port = event.ports[0]; var name = event.data; var cnt = 0; port.on("add", function(a,b) { // [S2] port.post("ansAdd", a + b, name, ++cnt); // [S4] }); port.on("sub", function(a,b) { // [S2] port.post("ansSub", a - b, name, ++cnt); // [S4] }); port.on("close", function() { // [S3] // クライアントが portを閉じた // portが切断された // .... }); });
矢印先で登録された受信関数が呼び出されます。この受信関数登録は、
「シンプルなプロセス間通信」では、addListener, onグローバル関数が使用されます。
「精密なプロセス間通信」では、PWportオブジェクトメソッド addListener, on関数が使用されます。
グローバル関数 | |
addListener, on関数 | プロセスWorker間のイベント受信関数を登録 |
removeListener, off関数 | プロセスWorker間のイベント受信関数を削除 |
__isProcessingRequest__関数 | イベント処理中であるかどうかの判断 |
クラス関数 | |
regSelf関数 | カレントプロセスWorkerに名前を自己登録します |
unregSelf関数 | カレントプロセスWorkerの既登録名を削除します |
myName関数 | カレントプロセスWorker名を取得します |
__myNameS__関数 | カレントプロセスWorker名をすべて取得します |
mySelf関数 | カレントプロセスWorkerのPWokerオブジェクトを作成します |
__isServer__関数 | カレントプロセスWorkerがサーバかどうかを判定します |
コンストラクタ | |
PWorkerコンストラクタ | PWorkerオブジェクトを作成します |
メンバ関数 | |
connect関数 | プロセスPWorkerと接続します。 |
post関数 | プロセスPWorkerへイベントを送ります。 |
postMessage関数 | プロセスPWorkerへmessageイベントを送ります。 |
getName関数 | PWorkerオブジェクトの名前を取得します。 |
equal関数 | PWorkerオブジェクトを比較します。 |
invalid関数 | 無効なPWorkerオブジェクトかどうかの判定 |
__connect__関数 | (非公開)プロセスWorkerと接続します。 |
__data__関数 | (デバッグ用)PWorkerオブジェクトの内部データを取得します。 |
__destroy__関数 | (非公開)プロセスWorkerを終了させるイベントを送ります。 |
__postMessage__関数 | (非公開)イベント送信低レベル関数 |
__valid__関数 | 有効なPWorkerオブジェクトかどうかの判定 |
addListener(name, function(arg1,arg2) { // または on(name, function(arg1,arg2) { /* thisのプロパティ type : name source : (通信相手)PWorkerオブジェクト data : [arg1, arg2] */ // ・・・ 処理 });(2) postMessage送信 : pworker.postMessage(data)
addListener("message", function(event) { // または on("message", function(event) { /* this : pworker eventオブジェクトのプロパティ type : "message" source : (通信相手)PWorkerオブジェクト data : data */ var data = event.data; // ・・・ 処理 });(3) connect接続要求 : pworker.connect(data)
addListener("connect", function( event ) { // または on("connect", function( event ) { /* this : pworker eventオブジェクトのプロパティ type : "connect" source : (通信相手)PWorkerオブジェクト ports : pwport[] data : data */ // 通信切断 終了処理・・・ });(4) エラー : 上記サーバー側の受信関数内でエラー, PWportオブジェクトcloseイベント受信関数内でエラー
addListener("error", function(err) { // または on("error", function(err) { /* this : (通信相手)PWorkerオブジェクト errオブジェクトのプロパティ message : エラーメッセージ filename : ファイル名 lineno : 行番号 */ // ・・・ });
on("connect", function(event) { var port = event.ports[0]; // PWportオブジェクト var data = event.data; // 呼び出し側のconnectメソッド関数の引数 port.on("add", function(a,b) { // 呼び出し側のrequestイベントを受信する関数を登録 port.post("ansAdd", a + b); // 呼び出し側へreposeイベントを送る }); port.on("sub", function(a,b) { port.post("ansSub", a - b); }); port.on("close", function() { // 呼び出し側がportを切断したイベントを受け取る関数を登録 // portが切断された // .... }); });
on(name, function(data) { // data は postメソッド関数の引数 var source = this.source; // イベント送り側のPWorkerオブジェクト ・・・ // 処理 source.post(ansEventname, ansValue); // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。 });
on("message", function(event) { var data = event.data; // data は postメソッド関数の引数 var source = event.source; // イベント送り側のPWorkerオブジェクト ・・・ // 処理 source.post(ansEventname, ansValue); // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。 });
PWorkerオブジェクトを使ったプロセス間通信プログラムは簡易で分かりやすいです。
しかし、欠点として不特定多数の相手と通信ができてしまうため、通信の目的と相手の特定があやふやになりがちです。
この欠点を解決するのが、PWportクラスです。
PWorkerオブジェクトのconnectメソッド関数を使って、指定プロセスWorker間の通信回線を行えるPWportオブジェクトが作成できます。
この通信回線は、他のPWorkerオブジェクトから割り込めず、通信中の状態変移を維持するので目的の処理を確実に行えます。
クラス関数 | |
__get__関数 | (デバッグ用)portidからPWportオブジェクトを取得します。 |
プロパティ | |
pworkerプロパティ | 通信相手のPWorkerオブジェクトを取得します。 |
メンバ関数 | |
post関数 | 相手portへイベントを送ります。 |
postMessage関数 | 相手portへmessageイベントを送ります。 |
close関数 | portを使った通信を終了します。 |
addListener, on関数 | portにイベント受信関数を登録します。 |
removeListener, off関数 | portからイベント受信関数を削除します。 |
invalid関数 | 無効なPWportオブジェクトかどうかの判定 |
__data__関数 | (デバッグ用)PWportオブジェクトの内部データを取得します。 |
__valid__関数 | 有効なPWportオブジェクトかどうかの判定 |
port.on(name, function(data) { // data は postメソッド関数の引数 ・・・ // 処理 port.post(ansEventname, ansValue); // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。 });
port.on("message", function(event) { var data = event.data; // data は postメソッド関数の引数 ・・・ // 処理 port.post(ansEventname, ansValue); // イベントで返答できる。ただし、イベント送り側に受信関数の登録が必要。 });
pwport.addListener(name, function(arg1,arg2) { // または pwport.on(name, function(arg1,arg2) { /* thisのプロパティ type : name source : (通信相手)PWorkerオブジェクト port : pwport data : [arg1, arg2] */ // ・・・ 処理 });(2) postMessage送信 : pwport.postMessage(data)
pwport.addListener("message", function(event) { // または pwport.on("message", function(event) { /* this : pwport eventオブジェクトのプロパティ type : "message" source : (通信相手)PWorkerオブジェクト port : pwportS data : data */ var data = event.data; // ・・・ 処理 });(3) close通信切断 : pwport.close()
pwport.addListener("close", function() { // または pwport.on("close", function() { /* this : pwport */ // 通信切断 終了処理・・・ });(4) エラー : 上記(1)(2)サーバー側の受信関数内でエラー (3)については、グローバルaddListener,on関数でerrorイベント受信関数を登録してください。
pwport.addListener("error", function(err) { // または pwport.on("error", function(err) { /* this : (通信相手)pwportオブジェクト errオブジェクトのプロパティ message : エラーメッセージ filename : ファイル名 lineno : 行番号 */ // ・・・ });
MemMapFileオブジェクトは、メモリへマップされたファイルを、ctypesモジュールのメモリアクセス機能でファイルの中身を操る機能を提供します。
MemMapFileオブジェクトは次の3つのモードで作成でき、指定ファイルのMemMapFileオブジェクト数とアクセスが制限されます。
var {MemMapFile} = require('MemMap'); または var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap');
// 個人情報をバイナリファイルでwriteして、ファイルを閉じる。 var {MemMapFile} = require('MemMap'); var {Person} = DSL.C(` typedef struct { char name[64]; int age; char sex[8]; char hobby[128]; } Person; `); var TwoPerson = Person.array(2); var mmf = new MemMapFile("personalInfo.data", TwoPerson.size); var persons = mmf.getRef(TwoPerson); persons[0] = {name:"山田太郎", age:24, sex:"man", hobby:"野球"}; persons[1] = {name:"福山花子", age:22, sex:"woman", hobby:"旅行"}; mmf.close(); // 上記のバイナリーデータファイルをopenして読み込む var mmf = new MemMapFile("personalInfo.data"); var persons = mmf.getRef(TwoPerson); var name, age, sex, hobby; for (var i=0; i<2; i++) { name = persons[i].name.readString(); age = persons[i].age; sex = persons[i].sex.readString(); hobby = persons[i].hobby.readString(); print(`------------------ name=${name}, age=${age}, sex=${sex}, hobby=${hobby} `) } mmf.close();
// 奇数をバイナリーで書き込み(SHAREDモード) var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap'); var int = ctypes.int; var arrytype100 = int.array(100); var mmf = new MemMapFile("odds.data", arrytype100.size, SHARED); var odds = mmf.getRef(arrytype100); for (var i=0; i<100; i++) { odds[i] = 2*i + 1; } mmf.close(); ----------------------------------------- // 上記のバイナリーデータファイルを読み込む(SHAREDモード)(上記と違うプロセスまたはスレッドでプログラムを走らせる) var {SHARED} = MemMapFile; var int = ctypes.int; var arrytype100 = int.array(100); var mmf = new MemMapFile("odds.data",0,SHARED); var odds = mmf.getRef(arrytype100); print(`odds[45]=${odds[45]}`); //odds[45]=91 mmf.close();
クラスプロパティ | |
NORMAL, READONLY, SHAREDクラスプロパティ | 通常、読込専用、共有化(MemMapFileコンストラクタのmode引数) |
プロパティ | |
length, byteLengthプロパティ | MemMapファイルのメモリバイト数 |
nameプロパティ | ファイル名 |
コンストラクタ | |
MemMapFileコンストラクタ | MemMapファイルオブジェクトを作成 |
クラス関数 | |
resize関数 | ファイルのサイズを変更 |
メンバ関数 | |
mapView関数 | MemMapファイルをアクセスするMapViewオブジェクトを作成 |
close関数 | MemMapファイルを閉じる |
getRef関数 | MemMapファイルを直接参照するCタイプオブジェクトを取得 |
getPtr関数 | MemMapファイルを直接参照するCポインターオブジェクトを取得 |
ファイル名
バイト数(省略時は0) size=0のとき、既存ファイルからMemMapファイルを作成し、サイズはそのサイズ。 size>0のとき、 ファイルがあればMemMapファイルを作成し、 そのファイルサイズ < size なら、ファイルサイズが拡張される。 ファイルサイズ ≧ size なら、ファイルサイズは変更されない。 ファイルが無ければ、そのサイズのファイルが作成される。
作成フラッグ(省略時はNORMAL) mode=NORMALのとき、PC内でopenできるのはこのMemMapファイルオブジェクトだけとなり、 別のプロセス・スレッドで同じファイルのMemMapファイルオブジェクトは作成できない。 読み書きはもちろん可能である。 mode=READONLYのとき、ファイルを読み込むが、書き込んでもファイルに反映されない。 mode=SHAREDのとき、読み書き可能な複数のMemMapファイルオブジェクトを作成できるモード。 別のプロセス・スレッドで同じファイルのメモリマップファイルオブジェクトを作成すれば、ファイルが共有されデータ交換が可能になる。
// 単位円上点座標のバイナリーデータファイルを作成 var {MemMapFile, NORMAL, READONLY, SHARED} = require('MemMap'); var {Pnts} = DSL.c(` typedef struct Point { double x, y; } Point; typedef Point Pnts[101]; `); var mmf = new MemMapFile("pnts.data", Pnts.size, SHARED); var pnts = mmf.getRef(Pnts); var dth = Math.PI/100; for (var i=0; i<=100; i++) { pnts[i].x = Math.cos(dth*i); pnts[i].y = Math.sin(dth*i); } mmf.close(); ----------------------------------------- // 上記のバイナリーデータファイルを読み込む(上記と違うプロセスまたはスレッドでプログラムを走らせる) var {SHARED} = MemMapFile; var {Pnts} = DSL.c(` typedef struct Point { double x, y; } Point; typedef Point Pnts[101]; `); var mmf = new MemMapFile("pnts.data", 0, SHARED); var pnts = mmf.getRef(Pnts); print(`pnts[45]=(${pnts[45].x}, ${pnts[45].y})`); //pnts[45]=(0.1564344650402307, 0.9876883405951378) mmf.close();
SharedMemオブジェクトは、プロセスWorker間で共有可能なメモリを管理するオブジェクトです。
これを使用して、2つ以上のプロセスWorkerが同じメモリをアクセスし目的の処理を効率よくおこなえます。
SharedMem クラスを使う前に、require関数でロードする必要があります。
var {SharedMem} = require('MemMap');
プロパティ | |
length, byteLengthプロパティ | 共有メモリバイト数 |
nameプロパティ | 共有メモリ名 |
コンストラクタ | |
SharedMemコンストラクタ | 共有メモリを作成 |
メンバ関数 | |
mapView関数 | 共有メモリをアクセスするMapViewオブジェクトを作成 |
close関数 | 共有メモリを閉じる |
getRef関数 | 共有メモリを直接参照するCタイプオブジェクトを取得 |
getPtr関数 | 共有メモリを直接参照するCポインターオブジェクトを取得 |
共有メモリ名
バイト数
//==単純な例== var {SharedMem} = require('MemMap'); var smA = new SharedMem("SimpleSample", 100); var aryA = smA.getRef(); for (var i=0; i<100; i++) aryA[i] = 2*i; print(aryA[99]); //198 //==複雑な例== var {Point} = #.dl{ typedef struct Point { double x, y; } Point; }# var AryPnt = Point.array(100); var smB = new SharedMem("ComplexSample", AryPnt.size); var pnts = smB.getRef(AryPnt); var {cos, sin} = Math; var R = 100, dth = 2*Math.PI/100; for (var i=0; i<100; i++) { pnts[i].x = R * cos(dth*i); pnts[i].y = R * sin(dth*i); } print(pnts[33]); // Point(-48.175367410171546, 87.63066800438635)
共有メモリの窓サイズ
共有メモリの窓オフセット
共有メモリをアクセスするMapViewオブジェクトを返します。
//==巨大メモリアクセス== var {SharedMem} = require('MemMap'); var BigArray = ctypes.double.array(1000000); var sm = new SharedMem("Big Array", BigArray.size); //500000番目から1000要素に値を代入 var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000); var a = mv.getRef(ctypes.double.array(1000)); for (var i=0; i<1000; i++) a[i] = Math.PI * Math.random();
Cタイプ
先頭からのオフセット(バイト数)
var mapview = sharedmem.mapView(); var cobj = mapview.getRef(ctype); // var cobj = mapview.getRef(); //cobはsharedmem.getRef(ctype)の返値と同じ
==単純な例==, ==複雑な例==
Cタイプ
先頭からのオフセット(バイト数)
var mapview = sharedmem.mapView(); var cptr = mapview.getPtr(ctype); // var cptr = mapview.getPtr(); //cptrはsharedmem.getPtr(ctype)の返値と同じ
MapViewオブジェクトは、共有メモリをアクセスするためのオブジェクトです。窓を通して共有メモリをアクセスするイメージです。
特に巨大な共有メモリをアクセスする場合、手ごろなサイズの窓を通してデータを扱えばシステムの負担を軽減します。
MapView クラスを使う前に、require関数でロードする必要があります。
var {MapView} = require('MemMap');
プロパティ | |
length, byteLengthプロパティ | MapViewの窓バイト数 |
offsetプロパティ | MapViewのオフセット |
メンバ関数 | |
getRef関数 | MapViewのメモリ窓を直接参照するCタイプオブジェクトを取得/td> |
getPtr関数 | MapViewのメモリ窓を直接参照するCポインタオブジェクトを取得/td> |
get_address関数 | MapViewメモリ窓の先頭アドレスを取得 |
close関数 | MapViewメモリを閉じます |
Cタイプ
先頭からのオフセット(バイト数)
//==巨大メモリアクセス== var {SharedMem} = require('MemMap'); var BigArray = ctypes.double.array(1000000); var sm = new SharedMem("Big Array", BigArray.size); //500000番目から1000要素に値を代入 var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000); var a = mv.getRef(ctypes.double.array(1000)); for (var i=0; i<1000; i++) a[i] = Math.PI * Math.random();
Cタイプ
先頭からのオフセット(バイト数)
//==巨大メモリアクセス== var {SharedMem} = require('MemMap'); var BigArray = ctypes.double.array(1000000); var sm = new SharedMem("Big Array", BigArray.size); //500000番目から1000要素に値を代入 var mv = sm.mapView(ctypes.double.size*500000, ctypes.double.size*1000); var aptr = mv.getPtr(ctypes.double.array(1000)); for (var i=0; i<1000; i++) aptr.contents[i] = Math.PI * Math.random();
PTreeは、ツリー構造の汎用プロパティ管理のためのクラスで、JSON, XML, INI, INFOデータフォーマットへの統一的なアクセス方法を提供します。
このクラスを使うには、次のプログラムのように最初に「property_tree」ライブラリをrequire関数でロードします。
var {PTree} = require('property_tree'); var xml = PTree.parseXML("<point><x>100</x><y>200</y></point>"); print(xml.get("point.x")); //100
PTreeが扱うデータフォーマットのサンプルを以下に列挙します。
[1] JSON
{ "Data": { "value": 3, "str": "Hello", "info": [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Millia"} ] } }
[2] XML
<?xml version="1.0" encoding="utf-8"?> <root> <str>Hello</str> <values> <value>1</value> <value>2</value> <value>3</value> </values> </root>
[3] INI
[Data] value = 3 str = Hello
[4] INFO
Data { value 3 str Hello info { "" { id 1 name Alice } "" { id 2 name Millia } } }
XML 定数 | |
NO_CONCAT_TEXT関数 | text値を1つの文字列に連結せず、<xmltext>キーのプロパティにします。 |
NO_COMMENTS | コメント <!-- comment --> 部分をスキップします。 |
TRIM_WHITESPACE関数 | contentsの前後の空白を除いてパースします。 |
クラス関数 | |
parseXML関数 | 文字列またはファイルをXMLデータとしてパースします. |
parseJSON関数 | 文字列またはファイルをJSONデータとしてパースします. |
parseINI関数 | 文字列またはファイルをINIデータとしてパースします |
parseINFO関数 | 文字列またはファイルをINFOデータとしてパースします. |
read_xml関数 | 文字列またはファイルをXMLデータとしてパースします. |
write_xml関数 | XML形式でファイルを出力します |
read_json関数 | 文字列またはファイルをJSONデータとしてパースします. |
write_json関数 | JSON形式でファイルを出力します. |
read_ini関数 | 文字列またはファイルをINIデータとしてパースします. |
write_ini関数 | INI形式でファイルを出力します. |
read_info関数 | 文字列またはファイルをINFOデータとしてパースします. |
write_info関数 | INFO形式でファイルを出力します. |
modifyMatchdata関数 | *?を含む文字列をRegexpオブジェクトに変換 |
コンストラクタ | |
PTreeコンストラクタ | PTreeオブジェクトを作成 |
メンバ関数 | |
size関数 | 要素の数を取得します |
empty関数 | コンテンツが空かどうかを判定 |
equal関数 | 他のPTreeオブジェクトと同じかどうかを判定する |
not_equal関数 | 他のPTreeオブジェクトと異なるかどうかを判定する |
count関数 | 指定キーの要素数を取得する |
clear関数 | コンテンツを空にする |
erase関数 | 指定キーの要素を削除する |
get_child, get_関数 | 指定キーパスのPTreeオブジェクトを取得する |
put_child, put_関数 | 指定したキーパスにPTreeオブジェクトをセットする |
add_child関数 | 指定したキーパスにPTreeオブジェクトを追加する |
get_value関数 | PTreeオブジェクトのルートにセットされている値を取得する |
put_value関数 | PTreeオブジェクトのルートに値をセットする |
get関数 | 指定パスのPTreeオブジェクトの値を取得する |
put関数 | PTreeオブジェクトの指定パスに値をセットする |
add関数 | PTreeオブジェクトの指定パスに値を追加する |
begin関数 | contentsの取り出し反復子を取得する |
rbegin関数 | contentsの逆順取り出し反復子を取得する |
parent関数 | 親を取得する |
exists関数 | 指定キーの子を持ってるかどうかを調べる |
exists_関数 | exists_... |
toXMLString関数 | XML形式の文字列を得る |
toJSONString関数 | JSON形式の文字列を得る |
toINIString関数 | INI形式の文字列を得る |
toINFOString関数 | INFO形式の文字列を得る |
forEach関数 | 与えられた関数で、各子要素を処理する |
children関数 | 子要素を収集行する |
descendants, desc_関数 | 子孫要素を収集行する |
first関数 | 最初の子要素を取得する |
first_node関数 | 最初の子nodeを取得する |
last関数 | 最後の子要素を取得する |
last_node関数 | 最後の子nodeを取得する |
nth関数 | n番目の子要素を取得する |
nth_node関数 | n番目の子nodeを取得する |
NO_CONCAT_TEXT | : | text値を1つの文字列に連結せず、<xmltext>キーのプロパティにします。 |
NO_COMMENTS | : | コメント <!-- comment --> 部分をスキップします。 |
TRIM_WHITESPACE | : | contentsの前後の空白を除いてパースします。 |
var text = ` <!--comment--> <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); print(pt.get("person.name")); // Ichiro Tanaka print(pt.get("person.<xmlattr>.id")); // 3 print(pt.get("<xmlcomment>")); // comment
var text = ` { "Data": { "value": 3, "str": "Hello", "info": [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Millia"} ] } } `; var pt = PTree.parseJSON( text ); print(pt.get("Data.value")); // 3 var info = pt.get_("Data.info"); for (var i=0; i<2; i++) { var e = info.nth(i); print(e.get("id"), e.get("name")); } /* 1, Alice 2, Millia */
var text = ` [Data] value=3 str=Hello `; var pt = PTree.parseINI( text ); print(pt.get("Data.value")); // 3 print(pt.get("Data.str")); // Hello
var {PTree} = require('property_tree'); var text = ` Data { value 3 str Hello info { "" { id 1 name Alice } "" { id 2 name Millia } } } `; var pt = PTree.parseINFO( text ); print(pt.get("Data.value")); // 3 var info = pt.get_("Data.info"); for (var i=0; i<2; i++) { var e = info.nth(i); print(e.get("id"), e.get("name")); } /* 1, Alice 2, Millia */
char | : | インデント空白文字 | デフォルト値 ' ' (space) |
indent | : | インデント数 | デフォルト値 1 |
enc | : | エンコード | デフォルト値 "utf-8" |
locale | : | ロケール | デフォルト値 "" (空文字列) |
var pt = new PTree(); pt.put("<xmlcomment>", "comment"); pt.put("person.name", "Ichiro Tanaka"); pt.put("person.age", 20); pt.put("person.<xmlattr>.id", 3); PTree.write_xml("d:/work/test.xml", pt); /* d:/work/test.xml <?xml version="1.0" encoding="utf-8"?> <!--comment--> <person id="3"> <name>Ichiro Tanaka <age>20 </person> */
var pt = new PTree(); var elm = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); elm.put("id",1); elm.put("name","Alice"); pt.add_("Data.info.", elm); elm.put("id",2); elm.put("name","Millia"); pt.add_("Data.info.", elm); PTree.write_json("d:/work/test.json",pt); /* d:/work/test.json { "Data": { "value": "3", "str": "Hello", "info": [ { "id": "1", "name": "Alice" }, { "id": "2", "name": "Millia" } ] } } */
var pt = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); PTree.write_ini("d:/work/test.ini", pt); /* d:/work/test.ini [Data] value=3 str=Hello */
char | : | インデント空白文字 | デフォルト値 ' ' (space) |
indent | : | インデント数 | デフォルト値 1 |
locale | : | ロケール | デフォルト値 "" (空文字列) |
var pt = new PTree(); var elm = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); elm.put("id",1); elm.put("name","Alice"); pt.add_("Data.info.", elm); elm.put("id",2); elm.put("name","Millia"); pt.add_("Data.info.", elm); PTree.write_info("d:/work/test.info",pt, {ch:' ', indent:2}); /* d:/work/test.info Data { value 3 str Hello info { "" { id 1 name Alice } "" { id 2 name Millia } } }
var r = PTree.modifyMatchdata("a*"); // r==/^a\w*$/
var text = ` <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); var qt = new PTree(pt); print(qt.toXMLString()); /* <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> */ pt.put("person.name", "Taro Yamada"); print(pt.get("person.name")); // Taro Yamada print(qt.get("person.name")); // Ichiro Tanaka
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); print(pt.size()); // 1 print(pt.get_("person").size()); // 2 //----------------------------------------- var text = ` <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); print(pt.size()); // 1 print(pt.get_("person").size()); // 3
var pt = new PTree(); print( pt.empty() ); // true print( pt.size() ); // 0
var text = ` <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); var qt = new PTree(pt); print( pt.equal(qt) ); // true print( pt.not_equal(qt) ); // false pt.put("person.name", "Taro Yamada"); print( pt.equal(qt) ); // false print( pt.not_equal(qt) ); // true
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); print(pt.count('a')); // 2 print(pt.count('b')); // 1 print(pt.count('c')); // 0
var text = ` <a>a</a> <a>aa</a> <b>b</b> <b>bb</b> `; var pt = PTree.parseXML( text ); pt.erase('a'); print( pt.toXMLString() ); /* <b>b</b> <b>bb</b> */ var iter = pt.begin(); iter.next() pt.erase(iter); print( pt.toXMLString() ); /* <b>b</b> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); var child = pt.get_("person"); print( child.toXMLString() ); /* <name>Ichiro Tanaka</name> <age>20</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var text2 = ` <name>Tarou Yamada</name> <age>30</age> <family>5</family> `; var pt = PTree.parseXML( text ); var pt2 = PTree.parseXML( text2 ); pt.put_("person", pt2); print( pt.toXMLString() ); /* <person> <name>Tarou Yamada</name> <age>30</age> <family>5</family> </person> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var text2 = ` <name>Tarou Yamada</name> <age>30</age> <family>5</family> `; var pt = PTree.parseXML( text ); var pt2 = PTree.parseXML( text2 ); pt.add_("person", pt2); print( pt.toXMLString() ); /* <person> <name>Tarou Yamada</name> <age>30</age> <family>5</family> </person> <person> <name>Tarou Yamada</name> <age>30</age> <family>5</family> </person> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); var child = pt.get_("person.name"); print(child.get_value()); // Ichiro Tanaka print(pt.get(person.name"); // Ichiro Tanaka
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); var child = pt.get_("person.name"); child.put_value("Taro Yamada"); print(pt.get("person.name")); // Taro Yamada pt.put("person.name", "Jiro Yamada"); print(pt.get("person.name")); // Jiro Yamada
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); print(pt.get(person.name"); // Ichiro Tanaka
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); pt.put("person.name", "Taro Ymada"); pt.put("person.family", 3); print(pt.toXMLString()); /* <person> <name>Taro Ymada</name> <age>20</age> <family>3</family> </person> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML( text ); pt.add("person.name", "Taro Ymada"); pt.add("person.family", 3); print(pt.toXMLString()); /* <person> <name>Ichiro Tanaka</name> <age>20</age> <name>Taro Ymada</name> <family>3</family> </person> */
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); for (var iter=pt.begin(); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=a value=a key=a value=aa key=b value=b */ for (var iter=pt.begin("b"); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b */
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); for (var iter=pt.rbegin(); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b key=a value=aa key=a value=a */ for (var iter=pt.rbegin("b"); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML(text); print(pt.parent()==null); // true var child = pt.get_("person.name"); print(child.parent().toXMLString()); /* <name>Ichiro Tanaka</name> <age>20</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML(text); print(pt.exists("person")); // true print(pt.exists("person.name")); // false
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML(text); print(pt.exists_("name")); // 2 print(pt.exists("name")); // false
char | : | インデント空白文字 | デフォルト値 ' ' (space) |
indent | : | インデント数 | デフォルト値 1 |
enc | : | エンコード | デフォルト値 "" |
locale | : | ロケール | デフォルト値 "" (空文字列) |
var pt = new PTree(); pt.put("<xmlcomment>", "comment"); pt.put("person.name", "Ichiro Tanaka"); pt.put("person.age", 20); pt.put("person.<xmlattr>.id", 3); print( pt.toXMLString() ); /* <!--comment--> <person id="3"> <name>Ichiro Tanaka <age>20 </person> */
var pt = new PTree(); var elm = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); elm.put("id",1); elm.put("name","Alice"); pt.add_("Data.info.", elm); elm.put("id",2); elm.put("name","Millia"); pt.add_("Data.info.", elm); print( pt.toJSONString() ); /* { "Data": { "value": "3", "str": "Hello", "info": [ { "id": "1", "name": "Alice" }, { "id": "2", "name": "Millia" } ] } } */
var pt = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); print( pt.toINIString() ); /* [Data] value=3 str=Hello */
var pt = new PTree(); var elm = new PTree(); pt.put("Data.value", 3); pt.put("Data.str", "Hello"); elm.put("id",1); elm.put("name","Alice"); pt.add_("Data.info.", elm); elm.put("id",2); elm.put("name","Millia"); pt.add_("Data.info.", elm); print( pt.toINFOString() ); /* Data { value 3 str Hello info { "" { id 1 name Alice } "" { id 2 name Millia } } }
function func( elm, key ) { // this==thisObj // elm : 子PTreeオブジェクト, key : キー // 繰返 呼出しを中断するには return true; を実行します。 }
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); pt.forEach( function(elm, key) { print("key=" + key + " value=" + elm.get()); }); /* key=a value=a key=a value=aa key=b value=b */ pt.forEach( "b", function(elm, key) { print("key=" + key + " value=" + elm.get()); }); /* key=b value=b */
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); var children = pt.children("a"); for (var i=0; i<children.length; i++) { var contents = children[i]; print("key=" + contents[1] + " value=" + contents[0].get()); } /* key=a value=a key=a value=aa */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> `; var pt = PTree.parseXML(text); var descendants = pt.desc_("*"); for (var i=0; i<descendants.length; i++) { var contents = descendants[i]; print("key=" + contents[1] + " value=" + contents[0].get()); } /* key=person value= key=name value=Ichiro Tanaka key=age value=20 */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); print( pt.first().toXMLString() ); /* <name>Ichiro Tanaka</name> <age>20</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); var first_node = pt.first_node(); print( first_node[1] ); // person print( first_node[0].toXMLString() ); /* <name>Ichiro Tanaka</name> <age>20</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); print( pt.last().toXMLString() ); /* <name>Taro Yamada</name> <age>30</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); var last_node = pt.first_node(); print( last_node[1] ); // person print( last_node[0].toXMLString() ); /* <name>Taro Yamada</name> <age>30</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Hiroshi Sato</name> <age>25</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); print( pt.nth(1).toXMLString() ); /* <name>Hiroshi Sato</name> <age>25</age> */
var text = ` <person> <name>Ichiro Tanaka</name> <age>20</age> </person> <person> <name>Hiroshi Sato</name> <age>25</age> </person> <person> <name>Taro Yamada</name> <age>30</age> </person> `; var pt = PTree.parseXML( text ); var nth_node = pt.nth_node(1); print( nth_node[1] ); // person print( nth_node[0].toXMLString() ); /* <name>Hiroshi Sato</name> <age>25</age> */
__IterPTree__オブジェクトは、PTreeオブジェクトの要素を順次取り出すための反復子オブジェクトです。
PTreeオブジェクトのメンバーbegin関数が返す値です。
次の例のようにして要素を順次取り出します。
var {PTree} = require('property_tree'); var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); for (var iter=pt.begin(); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=a value=a key=a value=aa key=b value=b */ for (var iter=pt.begin("b"); !iter.isEnd(); iter.next()) { var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b */
begin関数 | begin... |
next関数 | next... |
isEnd関数 | isEnd... |
isSafe関数 | isSafe... |
contents関数 | contents... |
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); var iter=pt.begin(); iter.next(); var e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=a value=aa */ iter.begin(); // 反復子の指す位置を先頭に巻き戻す。 e = iter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=a value=a */
__RIterPTree__オブジェクトは、PTreeオブジェクトの要素を逆順に取り出すための反復子オブジェクトです。
PTreeオブジェクトのメンバーrbegin関数が返す値です。
次の例のようにして要素を逆順に取り出します。
var {PTree} = require('property_tree'); var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); for (var riter=pt.rbegin(); !riter.isEnd(); riter.next()) { var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b key=a value=aa key=a value=a */ for (var riter=pt.rbegin("b"); !riter.isEnd(); iter.next()) { var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b */
rbegin関数 | rbegin... |
next関数 | next... |
isEnd関数 | isEnd... |
isSafe関数 | isSafe... |
contents関数 | contents... |
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); var riter=pt.rbegin(); riter.next(); var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=a value=aa */ riter.rbegin(); // 反復子の指す位置を最後尾に巻き戻す。 e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=b value=b */
XMLオブジェクトは、PTreeオブジェクトを使ってE4Xに近いXML操作を可能にするオブジェクトです。
var {XML} = require('xml'); var text = ` <person id="3"> <name>Ichiro Tanaka</name> <age>20</age> </person> <person id='4'> <name>Taro Yamada</name> <age>30</age> </person> `; var xml = XML(text); for (var riter=pt.rbegin(); !riter.isEnd(); riter.next()) { var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b key=a value=aa key=a value=a */ for (var riter=pt.rbegin("b"); !riter.isEnd(); iter.next()) { var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); } /* key=b value=b */
rbegin関数 | rbegin... |
next関数 | next... |
isEnd関数 | isEnd... |
isSafe関数 | isSafe... |
contents関数 | contents... |
var text = ` <a>a</a> <a>aa</a> <b>b</b> `; var pt = PTree.parseXML( text ); var riter=pt.rbegin(); riter.next(); var e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=a value=aa */ riter.rbegin(); // 反復子の指す位置を最後尾に巻き戻す。 e = riter.contents(); print("key=" + e[1] + " value=" + e[0].get()); /* key=b value=b */