なんちゃってMathematicaを作る - その7 [なんちゃってMathematica]
前回はMathematicaのシンタクスの基本となる「式」をおさらいした。シンタクス(文法)と言えないぐらい簡単なもの。今日はそれ以外の入力表現について。
たとえば
この、シンタクスのエラーとセマンティクスのエラーの区別は、ユーザにとってはあまり意味がなく、どちらもエラーであることには違いない。しかし、内部構造上はエラーの発生場所が違っていて、特に実装する上では重要である。もうすこし設計が進めばまたこの問題に帰ることになる。
シンタクスシュガー(糖衣構文)とは、読み書きしやすいように追加されたシンタクスで、本来のシンタクスに内部的に置き換えられる(他のケースでは、「本来のシンタクス」に書き換えられない場合や、「本来のシンタクス」がユーザから見えないという場合もある。例えばREDUCEを記述してあるのはpascalに似た文法で、専用のコンパイラでLISPのコードが出力される。REDUCEのpascal風のコードはLISPのシンタクスシュガーと言える)。
たとえば
このように、内部ではMathematica式だけが有効な入力だけどそれでは不便なので、入力しやすい書き方が決まっていてそれがMathematica式に変換される。このようなシンタクスシュガーはやまほど定義されていて、覚えていれば便利だけど、覚えていなくてもMathematica式の形で入力すれば問題なく、ただたくさん文字を打たなければいけないだけ、である。
もうきりがないのでやめる。
Mathematica Bookのリファレンスガイドにはこういうシンタクスシュガーが何ページにもわたって説明されている。
しかしMathematica Bookのどこを見てもこれがシンタクスシュガーであるとは書いてない。ユーザから見たときにMathematica式であるか、そのシンタクスシュガーであるかの区別は意味がないからだけど、内部構造を知るうえでは必要である。
7.1.2 セマンティクスのエラーとの違い
もちろんMathematicaはいろいろなエラーを返すが、どれもセマンティクス(意味上、解釈上)のエラーである。たとえば
Divide[1]という入力にはエラーを返すが
Divideは1つの引数で呼ばれました.2個の引数が想定されています.というメッセージになっている。つまり、Divide(割り算)は割る数と割られる数の二つの引数が必要である、というエラーである。これが
Times[1]ではエラーにならない。これはTimes(掛け算)が引数一つでもかまわないと定義されているからである。つまり「割り算」と「掛け算」の意味の違いがエラーになるかならないかを生んでいる、ということである。
この、シンタクスのエラーとセマンティクスのエラーの区別は、ユーザにとってはあまり意味がなく、どちらもエラーであることには違いない。しかし、内部構造上はエラーの発生場所が違っていて、特に実装する上では重要である。もうすこし設計が進めばまたこの問題に帰ることになる。
7.2 糖衣構文シンタクスシュガー
Mathematicaはすべて式(expression)だけが扱われるけど、それでは入力は不便だし、括弧の入れ子が多くなるとぱっと見てわからなくなるので、非常に多くのシンタクスシュガーを持っている。シンタクスシュガー(糖衣構文)とは、読み書きしやすいように追加されたシンタクスで、本来のシンタクスに内部的に置き換えられる(他のケースでは、「本来のシンタクス」に書き換えられない場合や、「本来のシンタクス」がユーザから見えないという場合もある。例えばREDUCEを記述してあるのはpascalに似た文法で、専用のコンパイラでLISPのコードが出力される。REDUCEのpascal風のコードはLISPのシンタクスシュガーと言える)。
たとえば
1+2*3はごく普通の式に見えるけど、これはMathematicaに入力されると
Plus[1,Times[2,3]]というふうにMathematica式に変換される。あるいは配列Aの第3要素を取り出す
A[[3]]という書き方は、入力されると
Part[A,3]という形に変換される。
このように、内部ではMathematica式だけが有効な入力だけどそれでは不便なので、入力しやすい書き方が決まっていてそれがMathematica式に変換される。このようなシンタクスシュガーはやまほど定義されていて、覚えていれば便利だけど、覚えていなくてもMathematica式の形で入力すれば問題なく、ただたくさん文字を打たなければいけないだけ、である。
7.2.1 シンタクスシュガーの例
例をあげようとすると、じつは普段使うのはほとんどがシンタクスシュガーだ、ということになってしまうけど、典型的なものをあげてみる。a+2/3 | Plus[a,Divide[2,3]] | 数式 |
{a, b, c} | List[a, b, c] | リスト |
#<0& | Function[Less[Slot[1], 0]] | 無名関数 |
NumberQ /@ {a,b,1,2} | Map[NumberQ,{a,b,1,2}] | Map関数 |
a;b;c; | CompoundExpression[a,b,c,Null] | 式の複合 |
a/.x->x0 | ReplaceAll[a,Rule[x,x0]] | 置き換え |
a?IntegerQ | PatternTest[a, IntegerQ] | パターンの即時テスト |
Mathematica Bookのリファレンスガイドにはこういうシンタクスシュガーが何ページにもわたって説明されている。
しかしMathematica Bookのどこを見てもこれがシンタクスシュガーであるとは書いてない。ユーザから見たときにMathematica式であるか、そのシンタクスシュガーであるかの区別は意味がないからだけど、内部構造を知るうえでは必要である。
2011-11-13 21:41
nice!(0)
コメント(0)
トラックバック(0)
コメント 0