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

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

コンセプト関数 は jetbrains.mps.baselanguage で定義されており、BaseLanguage コードが含まれています。このコードは、生成時に生成された Java コードの一部になります。このオプションは、DSL に非常に高い柔軟性を与えることができます。
サンプル
Robot Kaja サンプルプロジェクトを使用して、コンセプト関数を実験します。ゴールは、スクリプト作成者がトレースメッセージをカスタマイズする機能を提供できるようにすることです。トレースメッセージは、trace コマンドを介してユーザーに報告されます。


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


概念関数 concept を定義する
まず、ConceptFunction のサブコンセプトを作成する必要があります。


動作の 側面は、ConceptFunction から継承されたいくつかのメソッドをオーバーライドします。
getExpectedReturnType()- 関数から返されるタイプを宣言します
getParameterConcepts()- この関数のパラメーターを表す概念をリストします
showName()- 関数の名前をパラメーターリストおよび戻り型と一緒にエディターに表示するかどうかを示します
getName()- エディターに表示する関数の名前。デフォルトではコンセプトエイリアスになっているため、通常、動的な名前が必要な場合にのみこれをオーバーライドする必要があります。
MyFunction は、元のトレースメッセージ値を保持するための引数を必要とするため、そのパラメーターを表す概念も作成する必要があります。これにより、ConceptFunctionParameter の 概念が拡張され、オーバーライドされた getType() 動作メソッドを通じてその型が指定されます。


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


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

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

コンセプト関数シグネチャーにキャレットを置くと、インスペクターに関数の説明メッセージとそのパラメーターが表示されることに注意してください。
ジェネレーター調整
残っている最後のステップは、トレースメッセージのカスタマイズが行われるようにジェネレーターを変更することです。最初に、ロボット Kaja スクリプトから生成されるすべてのクラスのスーパークラスである KajaFrame クラスを変更する必要があります。

trace() 方法は、カスタマイズされた元のトレースメッセージを持っているために、新しい customizeMessage() メソッドを呼び出す必要があります。customizeMessage() メソッドのデフォルトの実装は、変更なしでメッセージを返します。
定義スクリプトのために生成されたクラスはのように見えるべきかということジェネレーターテンプレートは KajaFrame で customizeMessage() メソッドをオーバーライドします。余分な方法を生成することがあります。

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

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

関連ページ:

アイコンの説明
アイコン記述言語は、さまざまな MPS 要素(概念、アクションなど)のアイコンの記述とインスタンス化に役立ちますこの言語には、次の 2 つの目的があります。クイックアイコンプロトタイピング用のツールを提供する (たとえばコンセプトの新しいアイコンを作る)、アイコンを拡張可能な言語構造にする、第一印象:MPS 言語定義言語でアイコンが必要な場合は、既存の .png ファイルを指す代わりに、目的のアイコンのテキスト説明を入力できます。jetbrains.mps.lang.resources には、...

汎用プレースホルダーと汎用コメント
汎用プレースホルダー:汎用プレースホルダーは、2 つのノード間の空白を表し、任意のノードコレクションに追加できます。キーの組み合わせは、コレクション内の現在の位置にプレースホルダーを挿入します。プレースホルダーは透過的に動作します。プレースホルダーノードの補完メニューを呼び出してノードを置き換えるか、Enter キーを押して通常のノードを次の兄弟の位置に追加することができます。たとえその言語がそのような概念をサポートしていなくても、どの言語の汎用プレースホルダーユーザーを使用しても、任意の視...