MPS 2020.3 ヘルプ

コンセプト機能

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

Cf1

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

Cf2

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

サンプル

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

Cf3
Cf4

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

Cf5
Cf6

概念関数 concept を定義する

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

Cf7

Cf8

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

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

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

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

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

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

Cf9

Cf10

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

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

Cf11

Cf12

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

Cf16

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

Cf17

概念関数シグネチャーにカーソルを合わせると、インスペクターに関数の説明メッセージとそのパラメーターが表示されます。

ジェネレーター調整

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

Cf15

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

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

Cf13

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

Cf14

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

Cf5