一般化された入力

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