MPS 2023.3 ヘルプ

コンセプト機能

概念関数を使用すると、言語設計者は言語ユーザーにフックを残すことができます。これにより、ユーザーは生成されたコードで活用するコードを提供できます。例: エディター制約インテンションなど、MPS が言語設計に提供するほとんどの言語は、概念関数を活用します。

cf1.png

インスペクターウィンドウでそれらの使用箇所を見つけることもできます。

cf2.png

コンセプト関数 は jetbrains.mps.baselanguage で定義されており、BaseLanguage コードが含まれています。このコードは、生成時に生成された Java コードの一部になります。このオプションは、DSL に非常に高い柔軟性を与えることができます。

サンプル

Robot Kaja サンプルプロジェクトを使用して、コンセプト関数を実験します。ゴールは、スクリプト作成者がトレースメッセージをカスタマイズする機能を提供できるようにすることです。トレースメッセージは、trace コマンドを介してユーザーに報告されます。

cf3.png
cf4.png

ユーザは、元のメッセージをパラメーターとして受け取り、代わりに表示されるべき文字列を返す関数を通してトレースメッセージをカスタマイズすることができます。

cf5.png
cf6.png

概念関数 concept を定義する

まず、ConceptFunction のサブコンセプトを作成する必要があります。

cf7.png
cf8.png

動作の 側面は、ConceptFunction から継承されたいくつかのメソッドをオーバーライドします。

  • getExpectedReturnType()- 関数から返されるタイプを宣言します

  • getParameterConcepts()- この関数のパラメーターを表す概念をリストします

  • showName()- 関数の名前をパラメーターリストおよび戻り型と一緒にエディターに表示するかどうかを示します

  • getName()- エディターに表示する関数の名前。デフォルトではコンセプトエイリアスになっているため、通常、動的な名前が必要な場合にのみこれをオーバーライドする必要があります。

MyFunction は、元のトレースメッセージ値を保持するための引数を必要とするため、そのパラメーターを表す概念も作成する必要があります。これにより、ConceptFunctionParameter の 概念が拡張され、オーバーライドされた getType() 動作メソッドを通じてその型が指定されます。

cf9.png
cf10.png

スクリプトに MyFunction を追加する

定義したら、MyFunction の 概念をスクリプトに追加できます。

cf11.png
cf12.png

これにより、スクリプトエディターで関数を編集できるようになります。

cf16.png

エンターキーを押すと、エディターがコンセプト関数のシグネチャーを表示し、その本体を編集することができます。

cf17.png

コンセプト関数シグネチャーにキャレットを置くと、インスペクターに関数の説明メッセージとそのパラメーターが表示されることに注意してください。

ジェネレーター調整

残っている最後のステップは、トレースメッセージのカスタマイズが行われるようにジェネレーターを変更することです。最初に、ロボット Kaja スクリプトから生成されるすべてのクラスのスーパークラスである KajaFrame クラスを変更する必要があります。

cf15.png

trace() 方法は、カスタマイズされた元のトレースメッセージを持っているために、新しい customizeMessage() メソッドを呼び出す必要があります。customizeMessage() メソッドのデフォルトの実装は、変更なしでメッセージを返します。

定義スクリプトのために生成されたクラスはのように見えるべきかということジェネレーターテンプレートは KajaFramecustomizeMessage() メソッドをオーバーライドします。余分な方法を生成することがあります。

cf13.png

オーバーライドメソッドは、コンセプト関数がスクリプトに存在する場合にのみ生成されます。ジェネレーターは、myFunction の本体を生成された customizeMessage() メソッドの本体として使用します。

cf14.png

トレースメッセージをカスタマイズするための概念関数は完全に機能するはずです。

cf5.png