MPS 2020.1 ヘルプ

コンセプト機能

コンセプト機能を使用すると、言語設計者は自分の言語ユーザーのためにフックを残すことができ、それを介してユーザーは生成コードで活用するためのコードを提供できます。例:エディター制約インテンションなど、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

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

ジェネレーター調整

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

cf15

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

スクリプト用に生成されたクラスの外観を定義するジェネレーターテンプレートは、KajaFramecustomizeMessage() メソッドをオーバーライドする追加のメソッドを生成する必要があります。

cf13

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

cf14

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

cf5