Windows PowerShell ISEのコードエディタ凄いね。という話
僕、たまにしかコードを書かないので、毎度、色々と浦島太郎になってるわけですが、最近、Windows PowerShell を書く機会がありまして。で、コレってよく出来てますねー。と思ったので書いておきます。
PowerShell ってのは、長ったらしいコマンドレットを呼び出して記述する、Perl チックな文法の軽量プログラミング言語。主に Windows 環境で使われてるけど、最近はオープンソース化されてて、他のOSでも動くには動く。
超強力な型変換。Shellなのに内部ストリームをオブジェクトが飛び交う徹底した設計。充実したオブジェクト操作機能。それでいて Perl みたくパイプで繋ぎまくってワンライナー。あっと驚く「| ogv」でオブジェクトやCSVをGUI表示&フィルタリング。そんな感じで、開発速度が要求される用途向けの言語になっています。
そんな Windows PowerShell ですが、最近の Windows には「Windows PowerShell ISE」という統合開発環境が標準でインストールされており、これが大変便利。
って事で、PowerShell ISE を触っていたら、どうやらこいつのコードアシストは動的オブジェクトの中身も拾ってきている。という事実を知って少なからぬショックを受けたわけです。
コードアシストが動的定義オブジェクトの中身も拾ってくる怪
例えば、テキストで記述された設定ファイルを一行ずつ連想配列(Key-Value)に取り込むプログラムがあったとします。
その連想配列は、PowerShell の強力な型変換機能で PSCustomObject 型へと一発でキャストできます。まぁ、ここまでなら「ハイハイ、言語仕様強力だね。良かったね。」で、終わる話なんですが、ここからが凄い。
その設定ファイル由来のオブジェクトのメンバがコードアシストの対象になって出てくる。びっくり。デバッグ中でも無いのに。ですよ。もちろん、コード側でメンバの定義はしていない。
具体的には、$settings が PSCustomObject 型のオブジェクトだとすると、「$settings.」まで書けば、テキストで書かれた設定ファイルのキー項目が勝手にサジェストされて出てくる。
しかも、どんな値が入っているのかまで拾われてる…。
これを気持ち悪いと捉えるか、便利と捉えるかは宗派に依るところが大きそうですが、PowerShell が愛されるであろう用途においてはまぁ便利。と言って良さそうです。
仕組みとしては、恐らくは直近の実行時に、どんな情報がオブジェクトに放り込まれたのかを記憶して、それをコードアシストに反映しているだけなのだろうとは思います。が、捉え方によっては、通常、実行・デバッグ後に普通なら消す情報をあえて残してやがる。ってことで、なかなかイカしたことやってんね。と。
正味、悪く捉えれば誤解を招きそうな仕様だし、コードサジェスト周りの挙動がコンテキストで変わるから安定しない、という意味では混乱の元にもなりそうな気もしなくはありませんが、そういうあたりも含めて、マイクロソフトらしい仕様だなぁ。と。
その辺を問題と捉えないなら、挙動に対する理解を前提に、実用上は便利ね。とも思うわけです。
静的定義済みのクラスメンバやプロパティとかなら、Eclipse や NetBeans でも当然サジェストは効くわけだけども、実行しないと中身が分からない動的定義オブジェクトに対してもコードアシストが効く。というのは単純に「どーなってんの?」という驚きがありました。
浦島太郎なので、なんか違ったらごめんなさいですが。
何にしても、PowerShell、便利でいいっすねー。