一般化された入力
Wolfram言語を含むほとんどのコンピュータ言語の基礎的パラダイムは,入力が与えられ出力へと処理されるというものである.歴史的に,そのような入力はあるシンタックスに従った文字と数の列で構成されている.
そのようなコントロールの作成方法は次のセクションで説明することにし,まず,ほとんどの場合このような入力に代わるよりよい方法があるということに注目する.
この例題をManipulateという形式にすることで,スライダーが動くときにリアルタイムでその影響を見ることができる:
しかし,従来のShift+Returnで評価された入力内でコントロールを使ったほうがよい場合もある.例えば,評価が非常に遅い場合,コントロール周囲の入力行の残りの部分を編集する柔軟性が欲しい場合,コードの目的が後で使われる定義を作ることで,コントロールは初期値を指定するための便利な方法として使われている場合等がある.
例えば,後続するコードで使用される指定された色を初期化するためには,ColorSetterを使って色パレットを設定するとよい:
Slider[]を評価することでスライダーを作成することができる:
結果のスライダーオブジェクトは,他の種類の入力であるかのように,後続の入力セルにコピー・ペーストすることができる(または,出力セルをクリックしてタイプし始めるだけでもよい.これで自動的に入力セルに変換される).
評価すると,スライダーはスライダーのままである.この場合これは希望の結果ではない(これが便利な場合もあろうが).必要なのは,スライダーを入力として評価すると,スライダーオブジェクトではなく設定された値になることである.
DynamicSetting[e] | e として表示するオブジェクト.しかし評価時には動的に更新された現在の e の設定として解釈される |
DynamicSettingがスライダーの周りにラップされ評価されると,新しいスライダーはもとのスライダーと全く同じに見えるが,評価でその現在の設定になるという隠された特性を持つ.
前のセクションの例は,このようにしてDynamicSettingを使って作成したものである.
コントロールを含む入力行を構築するために,コピー・ペーストは非常に効果的に使えるが,特にコントロール作成のコマンドに慣れると,最も便利なのは現在位置で評価 Ctrl+Shift+Enter(MacではCommand+Return)を使って,コントロール式をその場で変換することである.
次にコントロール式全体をハイライトする(DynamicSettingをトリプルクリックすると簡単にできる)
Ctrl+Shift+Enter(MacではCommand+Return)とタイプすると,コントロール式がその場で実際のコントロールに変換される(Ctrl+Shift+Enterは入力の評価に使われる通常のShift+Enterではない):
Sliderの引数はすべて,初期値,範囲,刻み幅を変更するために使うことができる.
コントロール式には,通常のように変数への動的参照は含まれていない(「Dynamicチュートリアル」を参照).ここで記述してあるように,入力式で使われるコントロールは,テキストコマンドのように静的で不活性なオブジェクトである.このようなコントロールは互いにリンクしないので,それが動く場合以外は,どれかを動かしても何も起らない.基本的に,入力行が評価されたときに使用するために,現在の状態を記録しているだけである.
入力式で複数のコントロールを含むすべてのパネルを使うことができる.さまざまなコントロールの値を,テンプレートが評価されたときに返される値にどのように組み立てるかを指定しなければならないため,そのようなパネルを構築することは,単独のコントロールの周囲にDynamicSettingをラップするだけよりも複雑である.
関数Interpretationを使うと,内蔵型の入力テンプレートオブジェクトを組み立てることができる.このオブジェクトには動的変数を介して互いにインタラクトする多くの内的部分が含まれる.引数はInterpretation[variables,body,returnvalue]である.
第1引数はModuleあるいはDynamicModuleと同じ形式でオプショナルの初期化子を持つ局所変数のリストを与える.(実際にInterpretationは出力でDynamicModuleを生成する.「Dynamicチュートリアル」を参照.)
Interpretation[e,expr] | 入力として与えられると,e として表示されるが expr の未評価形として解釈されるオブジェクト |
Interpretation[{x=x0,y=y0,…},e,expr] | e および expr の局所変数を許す |
下の入力セルを評価すると,Plotコマンドのテンプレートを含む出力セルが生成される:
積分の結果をテストするために,テンプレートをDでラップして導関数を取り,結果が初期値と同じであることを検証する:
上の例は非常に一般的なものである.多くのプログラムで見られるダイアログボックスのようなものである.しかしそれとは大きな違いがある.例えば,入力フィールドの に注目する.Wolframシステムの入力フィールドは,他のプログラムのものと同様に見えるかもしれないが,内容はタイプセット数式でも,さらにはグラフィックスや他のコントロールでもよいのである(互いの内部にネストするテンプレートの書き方は次のセクションを参照のこと).
このようなテンプレートを作った方が便利かどうかはさまざまな要因によるが,大切なのは,Wolframシステムではテキスト,タイプセット数式,グラフィックスを含むフル装備のフォーマットコンストラクトが入力フィールドおよびテンプレートの内部でも周りでも使えるということである.
前セクションのテンプレートのように,定義されたテンプレートは初期化子に与えられた変数がすでに割り当てられた値を持っている場合(例えば,前セクションでは変数 x が値を持っている),あるいは,テンプレート構造が入力フィールドにペーストされた場合には,思ったように動作しない.評価の問題を正確に扱うためには,式ではなく解析されていないボックス構造の形式で値を保存するInputFieldオブジェクトを使う必要がある(ボックス構造はそれが正しいWolfram言語の入力式であろうとなかろうと,表示可能な構造なら何でも表現するという点で文字列のようである).
Graphics,Graphics3D,プロットコマンド,外部の画像ファイルからインポートしたプロットを含むグラフィカルオブジェクトはすべて入力として使うことができ,テキスト入力と自由に組み合わせることができる.グラフィックス,コントロール,タイプセット数式,テキストを組み合せるのに,制約はない.
コンテキストにより,プロットがいくつかの異なる大きさで表示されることに注目されたい.標準の自動プロットサイズには3つあり,プロットだけが出力にあれば最大,プロットがリストまたは表出力の中にあれば中,テキスト入力行で使用されていれば最小となる.これは主にグラフィックス入力をあまり大きくしないようにするためのものであるので,グラフィックスをクリックしたりリサイズハンドルを使ったりしてグラフィックスをリサイズすることや,明示的なImageSizeオプションを入れることも自由にできる.
入力としてグラフィックスが使えることで,この簡単なManipulateの例にあるように,非常に豊かな入力が可能となる: