なんちゃってMathematicaを作る - その8 [なんちゃってMathematica]
昨日はMathematica式を読み書きしやすくするシンタクスシュガーをちょこっとまとめた。今日はMathematica式の特殊性のひとつ(それはLISPの特徴でもある)と、とりあえずのまとめ。
Mathematicaにはこういう意味での予約語はない。Mathematicaにも「If」や「For」といった関数があるが、これはCのif文やfor文と似たような動作をするMathematica関数にすぎない。Mathematicaの命名規約を満足する記号列は基本的にすべてシンボルとして扱われる。
したがって極端な話、Ifを再定義することも可能である。
このあとでは
もちろん、こんなことができてもあまり面白くないし、システムで重要なシンボルを書き換えるとMathematicaが正常に機能しなくなる。とくに重要なシンボルにはLocked属性が付与されていて、Unprotectできなくなっている(Locked属性を持ったシンボルはUnprotectがエラーを返すようになっている)。Locked属性が与えられているシステムのシンボルはTrue、False、ListやI(虚数単位)など7個と、20個ほどのシステム定数($OperatingSystemや$PipeSupportedなど読み出しのみ意味があるもの)にすぎない。
Cなどのコンパイラ処理系は入力文字列を解釈して、シンタクスをチェックし、正しければそれに従って構文木を出力する。これはかなり複雑な処理で、処理系によってはソースを2度読み込むものも存在する。
Mathematicaはこの処理が非常に簡単になる。Mathematicaにおける構文解析は実質的にシンタクスシュガーをMathemaitca式に変換することしかしていない。そしてMathematica式はMathematicaの内部形式に直接対応している。たとえばCなどのコンパイラ言語では、ソースコードと内部形式のデータ構造や実行形式のオブジェクトとはこういった直接の対応は無い。このことは今回の「なんちゃってMathematica」を作る上で面倒を減らす大きな要素になる(はずである)。
実はこの特徴はMathematica固有のものではなく、LISPという古い言語(インタプリタ)の特徴である。評価の問題とからめてLISPのレビューをする。
7.2.2 予約語について
他の言語とは異なってMathematicaには予約語はない。予約語とは、構文解析の上で特別な意味のある単語である。たとえばCの「if」や「for」は予約語である。記号列としての「if」は、たとえば変数や関数の名前として命名規約を満足しているが、変数名や関数名としては使えない。 たとえばCでint if(int a);は関数の宣言の格好をしているけど、コンパイラはエラーを吐く。「if」が予約語であって、if文の初めを示すのに使われるためである。Cには37の予約語がある。
Mathematicaにはこういう意味での予約語はない。Mathematicaにも「If」や「For」といった関数があるが、これはCのif文やfor文と似たような動作をするMathematica関数にすぎない。Mathematicaの命名規約を満足する記号列は基本的にすべてシンボルとして扱われる。
したがって極端な話、Ifを再定義することも可能である。
In[1]:= Unprotect[If]; In[2]:= If[x_]=x^2;としてみる。ここでIn[]:=はMathematicaのプロンプトで、それ以降が入力であり、一行目のUnprotectはデフォルトではシンボルIfが書き換え不能に設定されているのを、書き換えられるようにするためのものである。
このあとでは
In[3]:= If[2] Out[3]= 4となって、Ifがもとの機能を失っていることが分かる(ちなみにここでOut[]=は出力を示すタグである)。
もちろん、こんなことができてもあまり面白くないし、システムで重要なシンボルを書き換えるとMathematicaが正常に機能しなくなる。とくに重要なシンボルにはLocked属性が付与されていて、Unprotectできなくなっている(Locked属性を持ったシンボルはUnprotectがエラーを返すようになっている)。Locked属性が与えられているシステムのシンボルはTrue、False、ListやI(虚数単位)など7個と、20個ほどのシステム定数($OperatingSystemや$PipeSupportedなど読み出しのみ意味があるもの)にすぎない。
7.3 シンタクスに関するまとめ
このようにMathematicaでは- 括弧の数が合わない
- 入力の先頭が括弧で始まる
Cなどのコンパイラ処理系は入力文字列を解釈して、シンタクスをチェックし、正しければそれに従って構文木を出力する。これはかなり複雑な処理で、処理系によってはソースを2度読み込むものも存在する。
Mathematicaはこの処理が非常に簡単になる。Mathematicaにおける構文解析は実質的にシンタクスシュガーをMathemaitca式に変換することしかしていない。そしてMathematica式はMathematicaの内部形式に直接対応している。たとえばCなどのコンパイラ言語では、ソースコードと内部形式のデータ構造や実行形式のオブジェクトとはこういった直接の対応は無い。このことは今回の「なんちゃってMathematica」を作る上で面倒を減らす大きな要素になる(はずである)。
実はこの特徴はMathematica固有のものではなく、LISPという古い言語(インタプリタ)の特徴である。評価の問題とからめてLISPのレビューをする。
2011-11-14 22:12
nice!(0)
コメント(0)
トラックバック(0)
コメント 0