引用符
引用は、必要な構造を持つノードを簡単に作成できるようにする言語構造です。もちろん、smodelLanguage を使用してノードを作成し、同じ smodelLanguage を使用して、適切な子、プロパティ、参照を手動で入力することができます。ただし、これを実現するためのより簡単で視覚的な方法があります。
以下の 2 つの構造は同一のノードを構築しますが、1 つ目は引用符を使用し、2 つ目はプレーンなモデル API を使用します。
引用符と簡単な引用符は、jetbrains.mps.lang.quotation 言語で定義されています。モデルで使用できるようにするには、この言語を使用言語として設定する必要があります。
引用符は式であり、その値は引用符内に記述された MPS ノードです。引用符は、数値定数や文字列リテラルと同様の構造である「ノードリテラル」と考えてください。つまり、意味する値が静的にわかっている場合はリテラルを記述します。引用符内には、ノードに評価される式ではなく、ノード自体を記述します。たとえば、式 2 + 3 は 5 に評価され、式 < 2 + 3 > (山括弧は引用符の括弧) は、leftOperand が IntegerConstant 2、rightOperand が IntegerConstant 3 である PlusExpression ノードに評価されます。
次の 2 つの構文でも同じ AST が作成されます。ここで、見積もりアプローチによってコードの簡潔さに明らかな利点がもたらされます。
<Car()> のような引用を使用して も動作コンストラクターは 呼び出されませんが、new node<Car>() のような smodel コンストラクターを使用すると 呼び出されます。
反引用符
引用符はリテラルであるため、その値は静的に既知である必要があります。一方、ノードの一部(子ノード、参照先、プロパティなど)が動的にしか分からない場合、つまり、設計時には分からず実行時にのみ評価できる部分については、引用符だけではそのような部分を持つノードを作成することはできません。
しかし朗報なのは、ノードの大部分を静的に把握していて、動的に評価されるノードで一部のみを置き換えたい場合は、アンチクォーテーションを使用できるということです。アンチクォーテーションには、子、参照、プロパティ、リストの 4 種類があります。これらはすべて、引用されたノードの一部をその結果で置き換えるために動的に評価される式を含んでいます。子アンチクォーテーションと参照アンチクォーテーションはノードに評価され、プロパティアンチクォーテーションは文字列に評価され、リストアンチクォーテーションはノードのリストに評価されます。
たとえば、ArrayList クラスを使用して ClassifierType を作成したいが、その型パラメーターは、たとえば「computeMyTypeParameter()」メソッドを呼び出すことによってのみ動的に認識されます。
次の式を記述します: <ArrayList <%(computeMyTypeParameter())%>>。ここでの構文 %(...)% は、ノードの逆引用です。
また、それぞれ ^(...)^ と $(...)$ を使用して、参照ターゲットとプロパティ値を引用符で囲むこともできます。または、*(...)* を使用した 1 つのロールの子のリスト。
a) 引用符で囲まれたノード内のノードを、式によって評価されたノードに置き換えたい場合は、ノードのアンチクォーテーション、つまり %( )% を使用します。ご想像のとおり、引用符で囲まれたノード全体を、単に式を囲むだけのアンチクォーテーションで置き換える意味はありません。なぜなら、そのような場合は、プログラム内で直接式を記述すればよいからです。
ノードの逆引用符は、引用符で囲まれたノードの子、孫、ひ孫、その他の子孫を置き換えるために使用されます。逆引用符内の式はノードを返す必要があります。このような逆引用符を記述するには、子のセル内にキャレットを置き、「%」と入力します。
b) 引用符で囲まれたノード内のどこかからの参照先を、式によって評価されたノードに置き換える場合は、参照の逆引用符、つまり ^(...)^ を使用します。このような逆引用符を記述するには、参照先のセル内にキャレットを置き、「^」と入力します。
c) 複数のカーディナリティロールを持つ子 (またはより深く位置する子孫) を置き換えたい場合、およびその理由から、単一のノードではなく複数のノードで置き換えたい場合は、子リスト (簡潔にするために単にリスト) の逆引用符を使用します。*( ) 。リストの逆引用符の内側の式はノードのリストを返すべきです。それは * * 型です nlist <..> * * または互換タイプ(つまり、* **{ } list<node<..>> * * も OK です。他の方法も同様です。このような逆引用符を記述するには、子コレクション内の子のセル内にキャレットを置き、「「。空の子コレクションでは使用できないため、押す前に「」と入力します。その中には単一の子を入力する必要があります。
d) 引用符で囲まれたノードのプロパティ値を動的に計算された値に置き換える場合は、プロパティの逆引用符 $()$ を使用します。引用符内の式は文字列を返す必要があり、この文字列が引用符で囲まれたノードの逆引用符で囲まれたプロパティの値になります。このような逆引用符を記述するには、プロパティのセル内にキャレットを置き、「$」と入力します。
軽い引用 (見積もりビルダー)
強力で便利な見積もりはありますが、使用することには欠点があります。例: 独自の定義で言語の引用を作成している場合は、言語のコンパイル中に特別な処理が必要なブートストラップサイクルを作成しています(ブートストラップ依存関係の削除を参照)。さらに、エディターが概念構造に 1 対 1 で対応していないノードの見積もりを作成するのは不便な場合があります。軽い引用は、このような問題を解消するのに役立つ代替アプローチを提供します。

次の 2 つの構文は、一方は引用符を使用し、他方は軽い引用符を使用しています。
直接モデル API の使用とは異なり、軽い引用は、より深い階層で引き続き便利に使用できます。
関連ページ:
ブートストラップ依存関係の問題の除去
定義::いつでもそれ自体を使用する言語または、ある言語を使用するソリューションであり、その言語が機能するために同じソリューションを必要とする(つまり、間接的または直接的に依存している)ソリューション。ブートストラップ依存関係の問題があります。なぜこれが問題なのですか:ビルドスクリプトを使用してプロジェクト全体をゼロから再構築することはできません、生成されたアーティファクトを VCS リポジトリに保持する必要があります、このブートストラップ依存関係サークルは、プロジェクトが完全に一から再構築され...
アイコンの説明
アイコン記述言語は、概念やアクションなどのさまざまな MPS 要素のアイコンを記述およびインスタンス化するために使用されます。この言語には、次の 2 つの目的があります。クイックアイコンプロトタイピング用のツールを提供する (たとえば、概念を表す新しいアイコンを作成する)、アイコンを拡張可能な言語構造にする、第一印象:MPS 言語定義言語でアイコンが必要な場合は、既存の .png ファイルを指す代わりに、目的のアイコンのテキスト説明を入力できます。jetbrains.mps.lang.reso...
ロギング
jetbrains.mps.baselanguage.logging 言語には、MPS ログとメッセージツールビューパネルに任意の情報を書き込むためのステートメントが含まれています。LogLowLevelStatement コンセプト (別名「ログエラー ...」) はシステムロガーを使用してログを記録するために使用され、MsgStatement(別名「メッセージエラー ...」) はメッセージツールウィンドウにログを記録するために使用されます。メッセージツールウィンドウは画面下部にあります。MP...