属性
f[x_]=x^2等の定義は,関数に特定の値を指定する.場合によっては,明示的な値は与える必要がないかもしれないが,一般的な関数の性質は指定しなければならないことがある.
関数の性質は,属性で指定することができる.例えば,
Flatと呼ばれる属性を関数に付与しておくと,その関数は「平坦」な特性を持つことになる.つまり,引数の部分がネストすれば,自動的にそのネスト部が平坦化され,結合則が適用可能な状態になる.
ネスト構成が平坦化され, fは結合則が適用可能な関数になる.
| Out[2]= |  |
|
Flatのような属性は評価の仕方だけでなくパターンマッチ等の操作にも影響する.このため,属性の指定は,関数を定義したり,変換規則を適用する前に行う必要がある.
fは平坦なので,先の定義はすべての引数に自動的に適用される.
| Out[4]= |  |
|
シンボルの属性操作
| Out[5]= |  |
|
| Out[6]= |  |
|
シンボルの属性一覧
組込み関数 Plusがどんな属性を持っているか調べる.
| Out[7]= |  |
|
重要な属性に
Listable(リスト可)がある.この属性は,すべての組込み済み数学関数に割り当てられている.この属性の関数に引数をリストとして与えると,関数頭部がリストの各要素に直接かかるように適用される(頭部を
fとすると,
fが「糸を縫う」ように各リスト要素に分配されることから,この分配操作は英語でスレッド(thread)とも呼ばれる).
| Out[8]= |  |
|
| Out[10]= |  |
|
多くの属性は,適用先の関数の評価そのものに直接影響を与える.評価には影響しないが,他の面で影響を与える属性もある.例えば,属性
OneIdentityはパターンマッチだけに影響する(
「平坦な関数と順不同な関数」を参照).同様に,属性
Constantは微分を計算するときか,微分に依存する操作が必要なときだけに有効になる.
属性
Protectedは割当て操作に影響する.プロテクトの掛かったシンボルは再定義することができない.
「組込み関数の変更」で説明した関数
Protectと
Unprotectを,
SetAttributesと
ClearAttributesの代りに使っても,プロテクトの有効化と解除を行うことができる.
「組込み関数の変更」で触れたが,
Mathematica が起動した時点では,ほとんどの組込み関数にプロテクトが掛かっている.このため,ユーザが誤って定義付けをしようとしてもできない.
| Out[11]= |  |
|
| Out[12]= |  |
|
| Out[13]= |  |
|
特定のシンボルに割り当てた定義を参照するには
?f と入力する(組込み関数にもこれに関連した機能を提供するものが各種あるので,それらを使ってもよい).参照禁止の属性
ReadProtectedを変数や関数に付加しておけば,定義内容が参照できないようにすることができるようになっている.参照不可になっても,関係式自体は有効なままであり,引き続き評価に使うことができる.
gの定義式を変更することはできないが,参照することは可能である. |
SetAttributesや
ClearAttributesのような関数を使えば,通常,変数や関数の属性をどのようにでも設定変更することができる.ただし,あらかじめ変数や関数に属性
Lockedが割り当ててあるときは,属性の変更はできない.(新たに設けた
Mathematica セッションなら,ロックは解除されるので,この限りではない.)属性
Lockedを属性
Protectedと参照禁止の属性
ReadProtectedに組み合せて使うことで,ユーザによる不用意な定義内容の参照や,変更を未然に防ぐことができる.
| Clear[f] | f に割り当てられている値を消去する(属性はそのまま維持される) |
| ClearAll[f] | f の割当て値と属性をすべて消去する |
値と属性の消去
上の例で pに属性 Listableを与えたが,ここで,値と属性のすべてを消去する. |
属性を取ってしまったので, pは展開することができない.
| Out[18]= |  |
|
関数に属性を与えるということは,
Mathematica に対して評価や参照で特別な性質を考慮するよう指示することを意味する.通常,一度与えられた性質は常に有効だが,場合によっては,限られた状況下でだけそれを有効にしたいかもしれない.そのようなときは,属性は直接使わずに,代りに,特殊な関数を呼び出すことでその属性に関連付けられた変換を行うことも可能である.
| Out[19]= |  |
|
属性に関連した変換操作を行うための関数
属性は単一シンボルに対してのみ恒久的に定義される.ただし,属性付きの純関数を構築することで,一時的にしか有効でない属性を備えた関数を定義することは可能である.
| Function[vars,body,{attr1,...}] | 属性attr1, ... を備えた純関数を定義する |
属性を備えた純関数
| Out[20]= |  |
|
| Out[21]= |  |
|