もう、大好きが止まらない感じがするなでしこですが(^-^;

前回のバージョンアップからなでしこには「Lua」という言語が内包され、
便利度がアップしました。

Luaがなでしこで使えるようになったおかげで、
なでしこで、windowsのCOMライブラリが使えるようになりました。

前々から、なでしこでCOMつかえたらなぁと思ってたんですが、
それは、ほとんどのWindowsに搭載されている「scriptControl」という機能を使いたかったためです。

「scriptControl」とはMS謹製のスクリプトエンジンで、
標準で「VBScript」と「JScript」が利用でき、
COM経由で呼び出せば、
自前のアプリケーションにスクリプトエンジンを組み込むことができるのです。

何の意味があるかというと、なでしこで作ったアプリケーションに、
VBSやJSを利用するユーザースクリプトのような機能を実現できるというわけですね。

もちろん、作りこみは必要で、組込みにはそれ相応の知識が必要です。

それにそもそも、なでしこ言語やLua言語でのユーザースクリプトを実現したほうが、
組込みも簡単で、安定して使えると思うのですが、
多くの人に使ってもらおうと思うと、JScriptのほうがよく知られた言語ですから、
JScriptでユーザースクリプトを実現したいわけです。
(たしか、JScriptは、javascript1.5と互換だったと記憶しています)

で、さらに突っ込むならば、なでしこの中にLuaを書いて、
Luaの中にJSを書かなければならないので、いたってめんどくさい(^-^;


余談。

mozillaが開発しているspiderMonkeyというスクリプトエンジンがあり、
(たしかFirefoxの3.0まではこのスクリプトエンジンでjavascript機能を実現しています)
こちらは、C言語で開発されていてDLLもあるので、
なでしこ用のプラグインを作れば、
簡単になでしこJSが使えるんでしょうけどね・・・。ひまなときにでもつくろうかな。



ではごく簡単なコードでやってみましょう。
以下なでしこのコードです。

//なでしこJSテスト
『require('luacom')
sc = luacom.CreateObject("ScriptControl")
sc.Language = 'JScript'
sc:AddCode('function test(v){ return v+1; }' )
js = sc.CodeObject
test = 2
val = js:test(test)
』をLUAする。
LUA値(「val」)という。

『』の中はなでしこに内包されたLua言語です。

1行目は、LuaでCOMを扱うためのライブラリをロードします。

2行目で、ScriptControlオブジェクトを作成、scに代入します。

3行目で、使用する言語の名前を指定します。標準状態なら「VBScript」か「JScript」を選択します。適切な言語環境がインストールされているなら「PerlScript」なんかも使えますが、汎用的なアプリケーションを作るなら「VBScript」か「JScript」のほうがいいでしょう。

4行目で、3行目に指定した言語にユーザー定義のソースを加えます。例示では、「test」というユーザー定義関数を作っています。この「test」関数では、引数に与えられた値に1を足して返すというだけの関数です。

5行目では、スクリプトエンジンそのものを、Luaの変数「js」に代入しています。これにより、変数「js」はJScriptの関数をまるでLuaの関数であるかのように利用できるようになるのです。※1後述

7行目で、自作の「test」関数を実行し「val」へ代入しています。

で、以上をなでしこで「LUAする」します。

で、Luaの中の変数「val」にはtest関数を実行した内容が保持されるはずですので、この値をなでしこで取得して利用するわけですね。上記の例では単純に表示だけしていて、「3」と表示されるはずです。


※1ユーザー定義関数だけじゃなくて、JSで搭載されている関数なんかもそのまま利用できます。
たとえば、

val = js:escape('!"#$%&()*+,-./')

↑このようにすると、JS標準の「escape」関数をそのまま利用して結果を「val」に代入するなんてことができちゃうわけです。


【追記】
あら、
http://nadesi.com/man/page/LUA%E3%81%99%E3%82%8B
↑こちらによると「nako_set」という命令を使うと、なでしこの変数にLuaから直接代入できるのね。不勉強でした。。。

そうそう、MSのJScriptは、いわゆるJavascriptに比べて実装がアレなので、、、その点は目を瞑りましょう(>_<)