FiM ++

画像






ある講義で、ある友人がポニープログラミング言語(もちろんシリーズに基づいている)があることを教えてくれました。 彼はredditでそれを見たと言いましたが、長時間の検索の後でも、実装の詳細なしで空のGoogle Codeリポジトリしか見つけることができませんでした。 私はこれに非常にがっかりしましたが、ほんの数分で、自分でこの言語の実装を書くことができることに気づきました。 誰もが通訳を書けるわけではないという意味では、おそらくそれは良くないか、使用されることさえありませんが、私は自分のスキルをテストしたかったのです。 そして、私は長いジョークが好きです。



それで、私があなたに注意を向けるのは、私がFiM ++と呼ぶ構文のかなり粗雑なバージョンです。



FiM ++は、ポニーの代わりにCelestia王女に手紙を書くための、動的に型付けされ、解釈された、オブジェクト指向の、チューリング完全な言語です(仕様にはTwilightを使用しました)。 言語の関数は、文字の段落としてフォーマットされます。 これは、コードを簡単に読み取り、できる限り文字に似せるために行われます。 このような各文字はクラスであるため、ユーザーが必要に応じて各プログラムを複数の文字で構成できます。 ただし、Javaの場合とほぼ同様に、最小の解釈単位はクラスです。 私たちは手紙を送るので、言語はライブラリをサポートしていません。つまり、コードは可能な限り軽量でなければなりません。 必要なデータ型はユーザーが定義できます。



各クラスは、常に同じ見出しで始まります。

Dear Princess Celestia: Letter One
      
      







コードの一部の演算子ブラケットは、メッセージ形式に違反しているため削除されましたが、ユーザーの希望に応じて使用できますが、Pythonのようにインデントが代わりに使用されます。 「Pelcess Celestia」はクラスを作成するための予約キーワードであるため、常に最初の受信者にする必要があります。 「レター1」はクラスの名前です。



クラスヘッダーの最初の行に、カンマで区切ってインターフェイスを追加できます。

 Dear Princess Celestia, and Princess Luna, and Princess Cadance: Letter One
      
      







各インターフェイスは、クラス内になければならない段落(関数)によって定義されます。 通常のクラスは次のように呼び出されます。

 I wrote you another letter! It's titled Letter Two.
      
      







「Letter Two」はイラスト入りのオブジェクトになり、そのまま使用できます。 たとえば、新しいクラスから現在のクラスに関数を転送するために使用できます。 また、コードでさらに使用するためにオブジェクトを宣言することもできます。

 I wrote you another letter! // code // code Oh, about that other letter. It's titled Letter Two!
      
      







メイン関数は次のようになります。

 Today I learned // code // code Your faithful student, Twilight Sparkle.
      
      







コマンドライン引数などの引数を受け入れることはありません。 戻り値は、「Your faithful student」という文字列と、名前である引数で構成されます。 インタプリタによっては、値を返す必要がない場合があります。



他の関数は次のようになります。

 I learned about ducks // code // code
      
      







名前で呼ばれ、この場合は「友情」です。 厳密に値を返す必要はなく、無視できます。 もちろん、パラメーターを使用して関数を呼び出すことができます。

 I learned about friendship with Spike and Rarity // code // code
      
      







Spike and Rarityを関数内で使用できるようになりました。 すべての引数は(念のため)魔法のように渡されます。



「I」キーワードは、ほとんどの言語で「self」演算子のように機能します。 ただし、彼はクラスのインスタンスを参照するのではなく、手紙の作成者を参照します。 どこでも定義できます。



変数の割り当ては次のようになります。



 Did you know that Spike is a dragon?
      
      







この例では、文字列値「dragon」を変数「Spike」に割り当てます。 スパイクには他の値も設定でき、実行時に正確なデータ型が決定されます。



言語は動的に型付けされるという事実にもかかわらず、2つの変数を使用した操作中に特定のチェックが実行されます。 「Pinkie Pieが数字の付いた日付になる」などの何かを書いた場合、インタープリターは例外(この場合はRidiculousException)をスローする必要があります。



FiM ++のループ:

 I did this 100 times… // code // code
      
      





これは、特定の言語のインタープリターを作成するのに十分なはずです。 そしてもう1つ、予約済みのキーワード「友情」は常に「魔法」と解釈する必要があります。そうしないと、エクエストリアが存在する宇宙のルールの基礎に違反する危険があります。



ハローワールド


 Dear Princess Celestia: Hello World! Today I learned how to say Hello World! I said “Hello World”! That's all about how to say Hello World! Your faithful student, Twilight Sparkle.
      
      







参照資料


現在の言語仕様を説明するドキュメント

シンプルなJavaScriptインタープリター

コード例:99サイダーの水差し



All Articles