goo blog サービス終了のお知らせ 

JScript 用 Include コンポーネント

2012-04-18 23:39:03 | Programming > JScript
はじめに
Include コンポーネントは JScript 上では関数化が困難とされる機能を提供する言語仕様拡張系のスクリプト コンポーネントである。通常のコンポーネントとは異なり、オブジェクトとして公開されることはなく、呼び出し元 JScript の変数に直接オブジェクトの関数を割り当てるという特殊な形態をとっている。


機能紹介
現在 Include コンポーネントに実装されている機能は以下の通り。

1) 他の JScript ファイルをインクルード
変数 $include に他の JScript ファイルをインクルードする関数を割り当てる。
詳細:JScript ファイルに一行加え、インクルードを実現する方法

2) 文字列内の変数展開
変数 $q に文字列内の変数展開を行う関数を割り当てる。
詳細:JScript で文字列内の変数を展開する関数を作ってみた

3) 関数の動的スコープ化
変数 $local にユーザー定義関数を動的スコープ化する関数を割り当てる。
詳細:JScript で関数を動的スコープ化する関数を作ってみた

各関数の詳細はリンク先を参照のこと。


ダウンロード
include.zip


インストール
通常スクリプト コンポーネントはシステムに登録して利用する。手順としてはエクスプローラ上で include.wsc を右クリックし、[登録] を実行する(または regsvr32.exe を使用してコマンドラインから登録)。登録後に include.wsc を移動するとコンポーネントが動作しなくなるので注意。その場合は移動先で再度 [登録] を実行すること。後述するが、構文によっては登録なしで呼び出すことも可能である。


構文
($=new ActiveXObject('JScript.Include'))(this);
上記は include.wsc をコンポーネントとしてシステムに登録した場合に利用できる構文である。一時的に変数$を利用するが、最終的に代入は行われない(後述)。システムへの事前登録を行わない場合は下記のように include.wsc のフルパスを指定して呼び出すことも可能(モニカによる参照)。
($=GetObject('script:C:\\...\\include.wsc'))(this);
いずれかの構文を用いてコンポーネントをアクティブ化することにより、Include コンポーネントに実装された機能を JScript の関数として呼び出すことができるようになる。この構文にはいくつかのオプションがあるが、それらは各機能の項で説明する。


構文の仕組み
構文はシンプルかつ一行で書けるよう工夫したもので、以下のような流れとなっている。
$ = new ActiveXObject('JScript.Include');
$.Initialize(this);
this['@Raptor'] = $;
delete $;
ActiveXObject オブジェクトのロード状態を保つため、オブジェクトの参照は必須である。スクリプト コンポーネント内から暗黙的に参照することはできないため(コンポーネント内の this は別物)、一旦 $ プロパティに格納する。その後、Initialize メソッドで @Raptor プロパティに入れなおし、$ プロパティを削除する。直接 this['@Raptor'] を使わず $ プロパティを経由しているのは構文をシンプルにしたかったため。また @Raptor といった添字アクセスしかできないプロパティを用いることで変数名の衝突を避けた。Initialize メソッドはデフォルトプロパティとして定義しているので省略可能。これらの組み合わせで構文は作られている。


スクリプト コンポーネントについて
スクリプト コンポーネントは XML フォーマットのテキスト ファイルであり、これ自体が COM コンポーネントとして動作する。実装には JScript や VBScript といったスクリプト言語が使われ、一言で言うなら「メモ帳で書ける COM コンポーネント」である。わずか数十行のコードなので是非読んでみてほしい。


おわりに
本コンポーネントが JScript プログラマの一助となれば幸いです。感想・不具合報告などお待ちしております。


JScript > Top (作成中……)

4月15日(日)のつぶやき

2012-04-16 02:41:25 | Twitter
09:06 from Silver Bird
The Jelly Jam の Shall We Descend って Molken Music のサイトからしか買えないのだろうか?

09:41 from Silver Bird
タスクトレイのアイコンをクリックしてウィンドウを表示させるとき、アプリによってシングルだったりダブルだったりするから紛らわしい……。

16:35 from Twitter for iPhone
一昔前は普通の靴屋にもウエスタン・ブーツがあったんだけどなぁ。今は全く見当たらない……。

16:36 from Twitter for iPhone
加えてジーンズ・ショップに行ってもブーツカットがない。

by ghostwind_jp on Twitter

4月14日(土)のつぶやき

2012-04-15 02:42:05 | Twitter
10:47 from Silver Bird
JScript ファイルに一行加え、インクルードを実現する方法を考えてみた。Windows Script Host で JScript を実行する場合にオススメです。 bit.ly/HHCApA

12:42 from Silver Bird
あ~あ「初めまして」って言っちゃった(苦笑)。 bit.ly/HH4oOn

16:59 from Silver Bird
mixi って、もう「足あと」ないの? いつの話してるんだとか言われそうだけど(苦笑)。

17:04 from Silver Bird (Re: @takajixi
@takajixi そうなんですか。最近数年ぶりに使い始めたのですが、色々と変わりましたね。

by ghostwind_jp on Twitter

JScript ファイルに一行加え、インクルードを実現する方法

2012-04-14 08:57:35 | Programming > JScript
はじめに
JScript にはスクリプト単体でインクルードが可能な関数やステートメントは提供されていない。そこでスクリプト コンポーネントを用いて、これを実現する方法を考えてみた。たった一行加えるだけのシンプルなコードである。JScript の eval が抱える実行コンテキストの問題も解決している。興味のある方は是非一度試していただきたい。

※現在は Include コンポーネントの機能の一つとして公開しています。

Include コンポーネント
基本的な機能の紹介やダウンロード先は Include コンポーネントのページを参照のこと。

構文
Include コンポーネントをアクティブ化することで $include というインクルード用の関数が使えるようになる。
($=new ActiveXObject('JScript.Include'))(this);
$include('C:\...\js\module1.js');
$include('C:\...\js\module2.js');
$include('C:\...\js\module3.js');


文字コードの指定
インクルードされる JScript ファイル(以下 "モジュール" )は UTF-8 として読み込まれる。それ以外の文字コードで書かれている場合は第二引数で指定する。"_autodetect" は自動検出の指定だが、誤判定の可能性もあるのであまりお勧めしない。
$include('C:\\...\\js\\module1.js', 'shift_jis');
$include('C:\\...\\js\\module2.js', 'euc-jp');
$include('C:\\...\\js\\module3.js', '_autodetect');
モジュールのデフォルト文字コードを変更したい場合は前述の構文において、第二引数以降にそのパスを指定する。
($=new ActiveXObject('JScript.Include'))(this, 'shift_jis');
$include('C:\\...\\js\\module1.js');
$include('C:\\...\\js\\module2.js');
$include('C:\\...\\js\\module3.js');
さらに個別指定しても構わない。
($=new ActiveXObject('JScript.Include'))(this, 'shift_jis');
$include('C:\\...\\js\\module1.js');
$include('C:\\...\\js\\module2.js', 'euc-jp');
$include('C:\\...\\js\\module3.js', 'utf-8');


パスの指定
モジュールのパスは絶対パスによる指定が基本だが、相対パスで指定した場合は呼び出し元 JScript ファイルが置かれたディレクトリを基準としてパスを補完する(スクリプト ホストが Windows Script Host の場合のみ)。すべてのモジュールが同一ディレクトリにあるなら
($=new ActiveXObject('JScript.Include'))(this);
$include('module1.js');
$include('module2.js');
$include('module3.js');
もちろん「.」や「..」、環境変数も使える。
($=new ActiveXObject('JScript.Include'))(this);
$include('.\\module1.js');
$include('..\\module2.js');
$include('%USERPROFILE%\\My Documents\\js\\module3.js');
セパレータに "/" を使ってもよい。このあたりはお好みで。
($=new ActiveXObject('JScript.Include'))(this);
$include('./module1.js');
$include('../module2.js');
$include('%USERPROFILE%/My Documents/js/module3.js');
モジュールが特定のディレクトリにまとめて置かれている場合は、そのディレクトリを相対パスの基準とすることもできる。これは前述の構文において、第二引数以降にそのパスを指定する(環境変数も可)。
($=new ActiveXObject('JScript.Include'))(this, 'D:\\...\\js');
$include('module1.js');
$include('module2.js');
$include('module3.js');
同時にデフォルト文字コードの指定も可能。第二引数以降は順不同および省略可能である。
($=new ActiveXObject('JScript.Include'))(this, 'shift_jis', 'D:\\...\\js');
($=new ActiveXObject('JScript.Include'))(this, 'D:\\...\\js', 'shift_jis');


戻り値とエラー
$include 関数はモジュールが存在しない場合であってもエラーを発生させない。ただし戻り値に false が返る(成功時は true)。


$include の実装について
大まかな流れとしてはコンポーネント側でスクリプト側のグローバル オブジェクトの eval を呼び出すメソッドを用意し、それをスクリプト側の $include 変数に代入しているだけである。本来 eval は呼び出し元コンテキストのスコープチェーンを辿るが、スクリプト側とコンポーネント側ではスコープ チェーンが独立しているため、eval に適用されるコンテキストはコンポーネント側の関数コンテキストではなく、スクリプト側で $include を呼び出したコンテキストとなる。つまり $include 関数は動的スコープになっているのである。本来できないと思われていた eval の処理を関数化できたのはそのためである。


JSCript > Include コンポーネント

4月7日(土)のつぶやき

2012-04-08 03:16:16 | Twitter
06:43 from Twitter for iPhone
「これからお前を殴るけど、殴り返してきたら殺すからな」と言うのが某国の理屈。

18:23 from Twitter for iPhone
「ふしぎの海のナディア」のデジタルリマスター版放送開始で森川美穂の声がお茶の間に流れるのが、ちょっと嬉しい。

18:30 from Twitter for iPhone
sfcminiでCOMのインターフェイスを扱えるように色々といじってみた。API名だけでなく関数アドレスで直接呼び出せるようにしたり、SAFEARRAYを使って可変長の配列を渡せるようにしたり。後はJScript側でコードの記述が楽になるようにモジュールを作成。

19:45 from Safari on iOS
Kick Down The Walls について語る Luke のインタヴューを見つけた。 toto99.com/features/encyc…

20:02 from Twitter for iPhone
Ponta会員だけど、LAWSON Wi-FiはAndroid端末限定か……。

20:24 from Twitter for iPhone
コンクリートブレーカーみたいなドラムさえなければ、Dragonforce もそこそこ聞ける(苦笑)。

20:38 from Twitter for iPhone
on time を real-time と勘違いしている人って、ライターや DJ にも多い。

21:15 from Twitter for iPhone
勝生真沙子のイメージは thirtysomething のホープ役。このドラマはとても好きだった。

21:31 from YouTube on iOS
これはスゴイ! DVD 出てないかなぁ。 youtube.com/watch?v=Jn77Zr…_gdata_player

by ghostwind_jp on Twitter

4月1日(日)のつぶやき

2012-04-02 03:08:34 | Twitter
14:48 from Twitter for iPhone
Lionville と The Magnificent と Last Autumn's Dream と Work Of Art をシャッフル。

19:13 from Silver Bird
年度末の打ち切りや復興radiko終了の煽りを受けて、四月から聴けるお気に入りの番組が少なくなってしまった。radikaがサイマルラジオに対応したのがせめてもの救い。リアルタイム聴取はほぼ無理なので録音は必須なのである(笑)。

19:17 from Silver Bird
「湘南カントリーミュージックナイト」はトークが多めで聴きやすい。曲だけ流すなら海外のカントリー系ネットラジオで事足りるからね。願わくばアーティストの近況や新譜情報を中心とした情報番組がいいのだが、中々見つからない。シーンのハブを担うようなDJがいないんだろうなぁ。

19:21 from Silver Bird
そういう意味ではHM/HRは色んな番組があって恵まれているよね。特に伊藤政則氏はシーンのハブとして十分機能していると思う。時折偏っていると感じることもあるけど、まあ彼だって人間だから仕方が無い(苦笑)。

19:22 from Silver Bird
ところでケルト音楽がメインのラジオ番組ってあるのだろうか?

by ghostwind_jp on Twitter

3月31日(土)のつぶやき

2012-04-01 03:10:14 | Twitter
05:54 from Twitter for iPhone
ゴンがアニメ化されるんだね。声優要らず?(笑)

06:03 from Twitter for iPhone
番組改編期ということもあり、久しぶりにTV雑誌を買った。以前使っていた「おとなのデジタルTVナビ」は売っていなかったので、雰囲気の似ている「デジタルTVガイド」にした。

06:05 from Twitter for iPhone
明日はCS無料開放デー。ミュージック・エアではTOTOのライヴが二本。

06:16 from Twitter for iPhone
radiko.jpの復興支援プロジェクトも今日が最終日か……。

by ghostwind_jp on Twitter