興味のある方のためのJetBrains MPS#1

はじめに



最初の投稿の下にあるコメントの批判に感謝します。重要なトピックに触れることなくMPSについて書きたいと思ったので、後で順番に書き始めることができます。







なぜ天気が必要なのですか?



1つの投稿へのコメントには、次の記述がありました。







この観点から、DSLはフレームワークに似ていますが、より便利なインターフェースを備えています。 もちろん、非常に怪しいケースを除いて、誰も1つのプロジェクトのフレームワークを実行しません。 そして、特定の主題分野のためにそれを作るために-どうしてですか?..

原則として、これがどのように機能するかです。 優れた言語は基本的に優れたフレームワークに似ています。これにより、私たちが書きたくないことを心配することなく重要なものを書くことができます。 ナレーションの過程で、類推と比較のために定期的に他の言語に目を向けます。







構文



実装するWeather言語は、次のタスクを実行する必要があります。条件(今日の天気など)と結果(明日の天気、明後日...)を簡潔に表現できる必要があります。

Weather言語では、1つの要素から予測を行います:今日の気温(オブジェクトの時間+気象条件の配列)から。







JSの入力配列の例
const weatherInput = [ { time: 1501179579253, temperature: { unit: "celsius", value: 23.7 } }, { time: 1501185944759, temperature: { unit: "fahrenheit", value: 15.3 } } ]
      
      





それでいいと思う。







天気の実装
 Weather prediction rules for Saint Petersburg data Today: [21:23]{ temperature = 23.7 °C } [23:06]{ temperature = 15.3 °F }
      
      





非常に簡単なデータがあります-時間と温度の測定単位。 抽象概念WeatherTimedDataを作成しましょう-測定時間と温度自体を保存するために必要です。







画像







ここで、 温度時間を決定する必要があります。







画像







時間は非常に簡単に実装されます-時間と分単位の時間があり、 hh : mm



として表示されます。







画像







Timeですべてが明確な場合、 Temperatureでは少しではありません。 まず、値は何らかの_FPNumber_String



です。 これは実際にはMPSダブルなので、大したことはありません。 しかし、問題は、 Temperatureインターフェイスからさまざまな測定単位で温度を実装する方法です。 そして一般的に、コンセプトインターフェイスとは何ですか?

そのような概念はASTに実装できません。 つまり、まったくありません。 別の概念がそれを拡張する場合のみ、それ以外は何もしません。 これは、OOPの場合のように、1つの共通の原則の下でいくつかのクラスを一般化するために行われます。







これは、 Temperatureのエディターで表示を実装する方法です。







画像







ここには、最初のセル-ダブル値、温度値、および2番目- 読み取り専用モデルアクセスがあります 。 ここでは、練習から少し離れて、理論に進みます。







理論



MPSでは、すべてが概念に基づいて構築されます。OOPと直接的な類似性を引き出す場合、概念はクラスです。 他の概念を拡張し、インターフェイスを実装できますが、何らかのロジックを含めることもできます。 たとえば、温度の抽象的なクラスを記述する場合、独自の測定単位を設定する可能性を提供する必要があります。







 abstract class Temperature{ abstract double value; public abstract String getUnit(); override String toString(){ return value + this.getUnit(); } }
      
      





ユニットを変数として設定し、抽象メソッドを記述することはできませんが、...

Behaviorと呼ばれるアスペクトがあります。 彼ができることは、コンセプトに新しいメソッドを追加することだけです。 つまり、変数を追加できないため、抽象メソッドを使用します。







画像







その後、 Temperatureコンセプトの各実装でこのメソッドを呼び出すことができます。 しかし、それはどこで呼ばれていますか? このMPSでどのようにコーディングしますか?..







もう一度練習する



Editorアスペクトに不可解なセルがあるという事実-ReadOnlyモデルアクセスに落ち着きました。 すべてが非常に簡単です-表示する前に何らかの方法でプロパティ/子/参照を処理する必要があり、これに十分な組み込みのジョークがない場合は、エディターのコンテキストとコンセプトの実装から必要な行を取得できます。 シンプルな場合、コンセプトの現在のオブジェクト、つまり実装されたものを提供し、そこからプッシュしたすべてのものを取得できます。 この場合、測定単位を取得するため、 R / Oモデルアクセスセルをクリックして、







画像







ちなみに、コード内の任意の場所で、興味のある小さなものを突いてCtrl + Shift + T押すと、この小さなもののタイプに関する情報を取得できます。 たとえば、上の画面でノードをクリックしてそのタイプを確認すると、次のようになります







画像







node< >



= node< >



ある種の実装

concept< >



=コンセプトクラス

だから! 値と測定単位ごとに温度を集計する方法はすでに知っていますが、必要な測定単位はどこで取得できますか? 子実装から、当然。

空の摂氏温度の概念を作成し、温度を展開してその動作を作成します。







画像







画像







最後のスクリーンショットでわかるように、 getUnitメソッドを再定義し( Temperatureからコンセプトを継承したため可視性ゾーンに存在します)、 "°C"



を返します。 すべてがシンプルです!







WeatherTimedDataにすべてをまとめるだけです。







画像







言語を収集し、結果を確認します。







画像







それは真実のようです。 それでも、天気予報自体はなく、バックライトもありません。さらに、24時間以上ゼロ未満にすることもできますが、分も整数次元以外のものによって制限されません...次の投稿では、新しい側面の制約 - 制約と何か-いつか。 それまでは-コメントにフィードバックを書いてください。質問が単純な場合はすべてがいつものようになります-広範で希望があれば同じ場所で答えます-そして各投稿でより良い文章を書きます。 ご清聴ありがとうございました!







//更新\

私は、各ブランチがHabréの新しいチュートリアルであるプロジェクトを含む、曲がったリポジトリを取得しました。 これです!!!








All Articles