MPS 2023.3 ヘルプ

振る舞い

構文ツリーの操作中に、タスクを簡素化し、機能を再利用するために、一般的な操作がユーティリティメソッドに抽出されることがよくあります。このようなユーティリティを静的メソッドに抽出したり、仮想メソッドでユーティリティコードを保持するノードラッパーを作成したりすることができます。ただし、MPS では、より優れたソリューションである動作言語の側面を利用できます。これにより、ノード上に仮想および非仮想インスタンスメソッド、静的メソッド、コンセプトインスタンスコンストラクターを作成できます。

Behavior example

Behavior アスペクトのメソッドは、BaseLanguage を使用して実装され、通常は拡張機能で拡張されます。

  • 直感的なコレクション API のコレクション言語

  • 関数リテラルを簡単に使用するためのクロージャ言語

  • コードを操作するための smodel 言語 (構造)

コンセプトインスタンスメソッド

コンセプトインスタンスメソッドは、指定された任意のコンセプトインスタンスで呼び出すことができるメソッドです。それらは、仮想と 仮想の両方にすることができます。概念を拡張する際に仮想 メソッドをオーバーライド できますが、非仮想メソッドはオーバーライドできません。また、仮想概念メソッドを抽象として宣言して、継承に実装を提供させることもできます。

概念インスタンスメソッドは、概念宣言と概念インターフェースの両方で実装できます。これにより、メソッド解決の問題が発生する可能性があります。MPS が継承階層でどの仮想メソッドを呼び出すかを決定する必要がある場合は、次のメソッド解決順序(MRO)アルゴリズムが適用されます。

  • 現在の概念がマッチングメソッドを実装している場合は、それを呼び出します。計算値を返します。

  • 拡張概念がある場合は、そのアルゴリズムを再帰的に呼び出します。成功した場合は計算値を返します。

  • implements セクションでの定義順に、実装されているすべての概念インターフェースに対してこのアルゴリズムを再帰的に呼び出します。メソッドを実装している最初に見つかったインターフェースが使用されます。成功した場合は計算値を返します。

  • 失敗を返します。

動作メソッドをオーバーライドする

スーパーコンセプトから継承したメソッドをオーバーライドするには、Ctrl キーボードショートカットを使用してオーバーライドダイアログを呼び出します。そこで、オーバーライドするメソッドを選択できます。目的のメソッドの名前を入力してオーバーライドすることにより、メソッドのリストを絞り込みます。

コンセプトコンストラクター

概念インスタンスが作成されるとき、いくつかのプロパティ / 参照 / 子をデフォルト値に初期化することはしばしば役に立ちます。これが、概念構築子が使用できるものです。概念構成内のコードは、特定の概念の新しいノードがインスタンス化されるたびに呼び出されます。

Behavior コンストラクターは次の場合に呼び出されます

  • 新しい initialized() を追加新しい initialized() をセットj.m.lang.actionsj.m.lang.smodel の類似の方法でノードを作成する

  • new node<Car>() でノードを作成する

<Car()> のような引用符を使用しても、Behaviors コンストラクターは呼び出されません。代わりに smodel コンストラクターの使用を検討してください。

コンセプトスタティックメソッド

一部のユーティリティメソッドは概念インスタンスに属していないため、インスタンスメソッドとして作成しないでください。概念全体の機能のために、MPS は静的概念メソッドを提供します。制約も参照してください。

null ノード / コンセプトに対する振る舞いメソッドの呼び出し

ノードまたは概念を表す null オブジェクトに対して振る舞いメソッドが呼び出された場合、呼び出しは NullPointerException にはなりません。代わりに、呼び出されたメソッドの戻り型が ClassifierType または StringType の場合、null 値が返されます。PrimitiveType の場合、そのタイプのデフォルト値が返されます。

関連ページ:

引用符

引用は、必要な構造を持つノードを簡単に作成できるようにする言語構造です。もちろん、smodelLanguage を使用してノードを作成し、同じ smodelLanguage を使用して、適切な子、プロパティ、参照を手動で入力することができます。ただし、これを実現するためのより簡単で視覚的な方法があります。2 つの以下の構築物は、最初のものは、第二の計画モデルの API を引用を使用して、同じノードを構築します。node<IntegerType> node = <int>; n...

エディターのアクション

MPS エディターには、完了アクション、ノード作成ポリシーにかなり実用的なデフォルトがあります。しかし、カスタマイズしたい場合は、アクション言語を使用しなければなりません。ノードファクトリ:あるノードが別のノードと交換されるとき、交換されるノードによって保持される値で交換するノードの作成プロセスをパラメーター化すること、またはおそらくモデル内の交換するノードの将来の位置を反映することも役に立つでしょう。ノードファクトリはあなたにまさにそれを与えます。新しいノードを代入アクションで、または新しい...

制約

構造言語は、言語構造に対する高度な制約を表現するには不十分な場合があります。制約アスペクトは、そのような追加の制約を定義する方法を提供します。デフォルトの具体的な概念:抽象概念の場合、制約アスペクトを使用して、抽象概念のノードを作成する必要がある場合に代わりにどの概念を使用するかを示すことができます。例: 子コレクションが AbstractCommands を保持することになっていて、ユーザーが Enter キーを押して新しい子をコレクションに挿入すると、EmptyLine コンセプトのノードが...

制約規則

制約言語には、個々の制約のエラーメッセージを指定できないことや、同じ種類の制約に対して複数の個別のルールを定義できないことなど、いくつかの欠点があります。実験的な制約規則言語は、これらを克服しようとしています。これは、RulesConstraintsRules ルートの制約の側面で利用できます。子 / 親 / 祖先 / ルートルールを指定できます:RulesConstraintsRules ルートは、最小限の視覚的なガイダンスを選択します。定義はルールブロックに分割されます。これらのルールブロック...

型システム

言語のための型システムを定義する:このページでは、MPS 型システムについて詳しく説明します。最初の型システムの規則を定義する際に、さらに簡単に導入したい場合は、型システムクックブックをチェックしてください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使うの章も参照してください。型システムとは:型システムは、言語を使用して書かれたモデル内のノードに型を割り当てる言語定義の一部です。型システム言語は、ノードとそのタイプに対する特定の制約をチェックするためにも使用されます