SSブログ

なんちゃってMathematicaを作る - その7 [なんちゃってMathematica]

前回は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式であるか、そのシンタクスシュガーであるかの区別は意味がないからだけど、内部構造を知るうえでは必要である。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立11/13献立11/14 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。