MPS 2026.1 ヘルプ

SModel 言語

SModel 言語の目的は、MPS モデルを照会および変更することです。これにより、モデルのノード、属性、プロパティ、リンク、その他の多くの重要な品質を調査できます。言語は、言語のいくつかの異なる側面(アクション、リファクタリング、ジェネレーター)をエンコードして、最も目立つものに名前を付けるために必要です。通常、jetbrains.mps.lang.smodel 言語を BaseLanguage と組み合わせて使用します。

null 値の扱い

SModel 言語は null 値を非常に安全に扱います。Java や C# などのオブジェクト指向言語では、コード全体に expr == nullexpr != null といった null 値のチェックが多数散在していることがよくあります。これは null ポインタ例外を防ぐために必要ですが、同時にコードの煩雑さを増し、読みにくくする原因にもなります。この問題を軽減するために、MPS は null 値を寛容に扱います。例: null ノードにプロパティを要求すると、プロパティの型のデフォルト値が返されます。null ノードに子ノードのリストを要求すると、空のリストが返されます。null ノードで動作メソッドを呼び出すと、呼び出されたメソッドの戻り値の型が ClassifierType または StringType であれば、null 値が返されます。PrimitiveType の場合は、その型のデフォルト値が返されます。これにより、言語設計者の作業が楽になります。

操作パラメーター

SModel 言語の操作の多くは、パラメーターを受け入れます。操作の最後に <を入力してパラメーターリストを開くと、パラメーターを指定できます。例: myNode.ancestors <concept = IfStatement、concept = ForStatement>

これらの操作のパラメーターとしての「+」シンボルは、「自分自身を含める」という意味です。つまり、操作が呼び出されるノードが条件に一致する場合、「+」によって、そのノードも返される結果に含まれることが保証されます。たとえば、myNode.ancestors<concept = IfStatement, +> は、それが IfStatement であれば myNode を返す可能性があります。

同時アクセスの管理

jetbrains.mps.lang.access 言語は、モデルアクセス API、特にその同時アクセス部分の使用を容易にします。この言語は、モデルアクセス API の上に構築された構文シュガーと考えることができ、API に直接アクセスする対応する低レベルコードの例が提供されています。MPS モデルにアクセスするには、スレッドが適切なロックを取得する必要があります。そうでない場合、読み取りまたは書き込み操作は許可されません。これらのステートメントを使用するには、jetbrains.mps.lang.access 言語をインポートする必要があります。この言語には、次のコマンドが含まれています。

  • アクションを書く

  • アクションを読む

  • とのコマンド

  • EDT でコマンドを実行します

  • EDT で実行する

  • 元にすると透明なコマンド

Example of obtaining a lock

一部のロックは EDT からのみ取得できます。プラットフォームは、ApplicationManager クラスを介して EDT のコンテキストで実行されるタスクをスケジュールするための API を提供します。

Example of scheduling a command on EDT

アクションを書く

同期モデルの書き込み:

モデルへの変更は、適切な書き込みロックを保持するマネージドアクション内からのみ実行できます。メソッドはそのようなロックを取得し、提供されたアクションを実行します。EDT(イベントディスパッチスレッド)から呼び出さないでください。呼び出さないと、UI がフリーズする可能性があります。ロックはアップグレードできません。読み取りロックを所有している場合、このコマンドを使用して書き込みロックを要求することはできません。

アクションを読む

同期モデルの読み取り:

モデルのプロパティのクエリは、適切な読み取りロックを保持するマネージドアクション内からのみ実行できます。メソッドはそのようなロックを取得し、提供されたアクションを実行します。

とのコマンド

同期モデルコマンド:

これは、プラットフォームの取り消しメカニズムに関して実行される書き込みアクションを表します。このメソッドは EDT スレッドからのみ呼び出す必要があります。EDT のコマンドの実行とは異なり、このメソッドは同期的に実行されます。

EDT でコマンドを実行します

コマンドを EDT から非同期で実行するようにスケジュールします。

これは、プラットフォームの元に戻すメカニズムに関して実行される書き込みアクションを表し、EDT スレッドから非同期で実行されます。このメソッドは、任意のスレッドから呼び出すことができます。

EDT で実行する

EDT から読み取られた非同期モデルをスケジュールします。

モデルのプロパティのクエリは、適切な読み取りロックを保持するマネージドアクション内からのみ実行できます。このメソッドはそのようなロックを取得し、EDTUI スレッドで提供されたアクションを非同期的に実行します。アクション内では、UI 要素に触れたり、IntelliJ プラットフォームの他の EDT バインドアクションを実行したりしても安全です。

元にすると透明なコマンド

Undo-transparent コマンド:

実行されたコードにはモデル書き込みアクセス権があり、コマンドとして扱われます。唯一の違いは、透過的なアクションからの変更が以前の元に戻すことができるコマンドの変更とマージされるため、このアクションを個別に元に戻すことができないことです。

2026 年 5 月 06 日