Authorの優れたデータ型

インタプリタ「Author」には、この記事で説明したい他の古典的な言語とは異なる3つのデータ型、つまり「digit」、「graf」、「program」があります。 これらはそれぞれ、浮動小数点のない天文学的な数値、普遍的なグラフ、および変数と定数を含む演算子と関数呼び出しのツリーに対して責任があります。



次の例は、数字型と整数型の主な違いを示しています。



 // fact.txt
 var fact(n){return n <2?1:n * fact(n-1);}

 void main(){
	トレース(事実(10));
	トレース(事実(50));
	トレース(事実((数字)50));
	 x =(数字)1;
	 x.setAccuracy(63);
	トレース(x / 3.123);
	 getstring();
 }


 3628800
 0
 30414093201713378043612608166064768844377641568960512000000000000
 0.320204931155939801472942683317323086775536343259686199167467178




最初のケースでは、計算は正しく行われました。 2番目では、タイプ「int」のメモリがオーバーフローしました。 3番目では、計算はスムーズに進みました。 これは、「数字」タイプが必要に応じて数値の指数にメモリを割り当てることができるために発生しました。 数字の仮数については、たとえば3で割るときにメモリリークを避けるために制限を指定する必要があります。 タイプ「x.setAccuracy(63);」のメソッドは、小数点以下の桁数の仮数の制限を示します。 この型には他の便利なメソッドがあります。



次に、ユニバーサルグラフについて少し説明します。 グラフは、多くのノードとそれらの間の接続を指します。 「graf」タイプの場合、ノードは少なくとも1つの接続がある場合にのみ存在します。 各リンクには2つのノード番号、入力矢印の存在に対応する値とリンクの名前があります。 ユニバーサルグラフでは、ノード間の接続に加えて、ノードとマーカー間の接続もあります。 マーカーはテキストの行です。 各マーカーリンクには、1つのノード番号、リンク名、およびマーカー名があります。 ノードおよびマーカー内の入力矢印の存在に関する論理値もあります。

次のプログラムは、ユニバーサルグラフの機能を示しています。



 // UniversalGraf.txt
 void main(){
	 //グラフ(エンベロープ)を設定します。
	 G =(グラフ)0;
	 G.NET(0.1、「高価」、1.1);
	 G.NET(0.1、「高価」、1.4);
	 G.NET(1.1、 ""、1.2);
	 G.NET(1.1、 ""、1.4);
	 G.NET(1.1、 ""、1.3);
	 G.NET(2.1、 ""、1.3);
	 G.NET(2.1、 ""、1.4);
	 G.NET(3.1、 ""、1.4);
	 G.MARKER(0,0、 ""、0、 "Mars");
	 G.MARKER(1.0、 ""、0、 "Vinnitsa");
	 G.MARKER(2.0、 ""、0、misto = "Gayvoron");
	 G.MARKER(3.0、「」、0、「モスクワ」);
	 G.MARKER(4.0、「」、0、「Gysin」);
	 G.MARKER(0,1、 "life"、0、 "no");

	 trace(G.getMARKER(0、#、#、0、#)。export());
	 trace(G.getNET(4、#、#、#、#)。export());

	 tracex(ミスト);
	 stop = n = G.getMARKER(#、0、 ""、0、misto)[0] [0];
	 {
		 tracex( "->");
		 n = G.getNET(n、#、#、1、#)[#] [2];
		 tracex(G.getMARKER(n、0、 ""、0、#)[0] [0]);
		 } while(stop!= n);

	 getstring();
 }


 {{0、 ""、 "Mars"}、{1、 "life"、 "no"}}
 {{1、 "expensive"、1,0}、{1、 ""、1,1}、{1、 ""、1,2}、{1、 ""、1,3}}
 Gayvoron->モスクワ-> Vinnitsa->モスクワ-> Gaysin-> Gayvoron




タイプ「graf」の変数を作成するには、キャスト演算子を使用する必要があります。 次に、グラフ自体を開いたエンベロープに似た形状に設定します。「G.getMARKER(0、#、#、0、#)」メソッドは、指定されたマスクのマーカーでノードのリンクを検索し、見つかった要素の配列を返します。 各要素は、マスクで要求されたデータを含む配列です。 検索マスクには、「#」記号で示される不明なリンクの詳細が少なくとも1つ必要です。 言語「Author」では、シンボル「#」は値「void」を返します。これは、例えば「return」のない関数から取得できます。 「.export()」配列メソッドは、ネストされた配列を文字列に変換します。 trace()関数は、画面に文字列を表示します。 グラフメソッド「G.getNET(4、#、#、#、#)」は、検索の対称性を考慮して、グラフのノード間のリンクを検索し、マーカーを使用したリンクの検索と同様に機能します。 型「void」が配列インデックス演算子「{3,5,9} [#]」に該当する場合、インタープリターはこの配列の要素の値の1つを返します。

そして、それは「世界中を旅する」方法を探しているプログラムであることが判明しました。

グラフタイプには、他の便利なメソッドもあります。

「プログラム」の基本的なタイプの可能性を説明するために、次の例を示します。



 // demo.txt
 var main(nirvana、paradise、skazka){
	 if(isset(nirvana))return paradise + nirvana + skazka;
	 f = getFunction(getThisFunctionName());
	 pos = f.Up(f.Root());
	 command = command2 = f.getCommand(pos);
	 trace((string)command + "==" + eval(command));
	 trace(command.getSub({}));
	 trace(command.getSub({0}));
	 trace(command.getSub({0,0}));
	 trace(command.getSub({0,1}));
	 trace(command.getSub({1}));
	トレース( "-----------------");
	 pos = f.Up(pos);
	 command = f.getCommand(pos);
	 trace((string)command + "==" + eval(command));
	 trace(command.getSub({}));
	 trace(command.getSub({0}));
	 trace(command.getSub({0,2}));
	 trace(command.getSub({0,4}));
	 trace(command.getSub({0,4,0}));
	 trace(command.getSub({0,4,3}));
	 trace(command.getSub({0,4,3,0}));
	 trace(command.getSub({0,4,3,1}));
	 trace(command.getSub({1}));
	トレース( "-----------------");
	 proga = PROGRAM( "X =#+#");
	トレース(プログラム);
	 proga.setSub({1,0}、コマンド);
	 proga.setSub({1,1}、command2);
	トレース(プログラム);
	 eval(プログラム);
	 trace( "X ==" + X);
	 getstring();
	帰る
	 {0,1,2,3、main(100,20,7-3)} [4];
	 (1 + 9)* 100;
 }


 (1 + 9)* 100 == 1000
 (1 + 9)* 100
 1 + 9
 1
 9
 100
 -----------------
 {0,1,2,3、main(100,20,7-3)} [4] == 124
 {0,1,2,3、main(100,20,7-3)} [4]
 {0,1,2,3、main(100,20,7-3)}
 2
メイン(100,20,7-3)
メイン
 7-3
 7
 3
 4
 -----------------
 X =#+#
 X = {0,1,2,3、main(100,20,7-3)} [4] +(1 + 9)* 100
 X == 1124


関数アルゴリズムの最初の行は、再帰の終端分岐を示しています。 次に、変数「f」は、変数が配置されている関数にアクセスします。 次に、変数「pos」は、実行時に関数が変換されたアルゴリズムの(ブロック)図の最後のノードの一意の識別子を受け取ります。 最後のノードはゼロノードの上にあります。 次に、アルゴリズムスキームの最後のノードにあるコマンドのコピーを取得します。 実際、「チーム」は「プログラム」タイプのオブジェクトです。 これは、変数と定数を使用した演算子と関数呼び出しのツリーです。 任意のコマンドをテキストに変換するか、実行できます。 「command.getSub({})」などのメソッドを使用すると、アクセスパスを指定してツリーからブランチをコピーできます。この場合、ツリー全体がコピーされます。

PROGRAM()関数は、プログラムテキストの行をタイププログラムに変換します。

この型には他の便利なメソッドがあります。



もっと | 続いて。



All Articles