UWSCでオブジェクトを扱う

やったー!!!
ついに閃いた!
ちょっと、不完全だけど。

追記 20121012
入れ子は、オブジェクトをjavascript内で設定すればOK
UWSC側にしか参照がない場合は、AddObjectで逆輸入という手も


こんなことができる。

	DIM pt = Object.Create("Point")
	pt.x = 110; pt.y = 15
	pt = pt.Move(-15, 25)
	MSGBOX("(" + pt.x + ", " + pt.y + ")")

種明かし

javascriptのオブジェクトです。
スクリプトは以下の通り。


Object.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME = "Object.uws" THEN
	DIM pt = Object.Create("Point")
	pt.x = 110; pt.y = 15
	pt = pt.Move(-15, 25)
	MSGBOX("(" + pt.x + ", " + pt.y + ")")

	//オブジェクトの定義は、prototypeを使った簡略表記も可
	Object.Define("var Rect = function(){}; Rect.prototype = { x:0, y:0, w:0, h:0 }")
	DIM rect = Object.Create("Rect")
	WITH rect
		.x = 100; .y = 50; .w = 30; .h = 20
	ENDWITH
	MSGBOX("面積=" + (rect.w * rect.h))

	Object.Dispose()
ENDIF


MODULE Object
	DIM _sct

	TEXTBLOCK _JS_SRC
		// よく使うオブジェクトを事前定義する
		var Point = function(x, y) {
			this.x = x
			this.y = y
			this.Move = function(dx, dy) {
				return new Point(this.x + dx, this.y + dy)
			}
		}
	ENDTEXTBLOCK

	PROCEDURE Object
		_sct = CREATEOLEOBJ("ScriptControl")
		_sct.Language = "JScript"
		this.Define(_JS_SRC)
	FEND

	PROCEDURE Dispose()
		_sct.Reset()
		_sct = Nothing
	FEND

	PROCEDURE Define(src)
		_sct.ExecuteStatement(src)
	FEND

	FUNCTION Create(name)
		RESULT = _sct.Eval("new " + name)
	FEND

ENDMODULE

不完全なところ

プロパティにオブジェクトを入れると、.参照できません。
「obj.paraobj.para1」とかができません。
「pt.Move(10).x」とかはできるんですが、、、。
ま、入れ子になってない構造体ならできるということです!
一応解消。

経緯

経緯と言っても、javascriptのオブジェクト使えるんじゃ?
ってまさしく閃いただけ。
前に、
UWSCで可変配列 - じゅんじゅんのきまぐれ
というのを書いて、オブジェクトっぽいことをしましたが、やっぱり.参照じゃないと、、、
とずーっと気になってたのです。
で、今日閃いた。


閃いたので、試しにPowershell使ってScriptControlを調査したら、EvalとかExecuteStatementとか、面白そうなメソッドがあるある!
で、スクリプトを書いた次第。
newはどうなんだ、という意見もありますが、所詮ScriptControl内なので。


Powershellだと、System.__ComObjectを使ってReflectionになるので、書くのが面倒ですが、UWSCなら.参照するだけ。
ま、Powershellだと、そんなことしなくてもオブジェクトは使えるわけですが。


なんにしても、うれしー!!!