引用符
引用符は、必要な構造を持つノードを簡単に作成できるようにする言語構成です。もちろん、smodelLanguage を使用してノードを作成してから、同じ smodelLanguage を使用して適切な子、プロパティ、参照を手動で追加することもできます。ただし、これを実現するためのより簡単で、より視覚的な方法があります。
次の 2 つの構成要素は同一のノードを構築します。最初の構成要素は引用符を使用し、2 番目の計画モデル API を使用します。
Quotations as well as light quotations are defined int the jetbrains.mps.lang.quotation language: You need this language to be set as a used language in order to be able to use it in your models.
引用符は式であり、その値は引用符の内側に書かれた MPS ノードです。引用を " ノードリテラル "、数値定数や文字列リテラルに似た構造として考えてみましょう。つまり、自分がどのような値を意味しているのかを静的に知っていれば、リテラルを書くことになります。そのため、引用符の中には、ノードに評価される式を書くのではなく、ノード自体を書くのです。たとえば、発現 2 + 3
が 5
に評価される、発現 < 2 + 3 >
は、(傾斜し括弧は引用ブレースある)leftOperand は 整数定数 2 あると rightOperand が IntegerConstant 3
された状態でノード PlusExpression に評価されます。
次の 2 つの構文でも同じ AST が作成されます。ここで、引用アプローチによってコードの簡潔さに明らかな利点がもたらされます。
<Car()>
のような引用を使用して も動作コンストラクターは 呼び出されませ んが、new node<Car>()
のような smodel コンストラクターを使用すると 呼び出されます。
反引用符
それはリテラルなので、引用符の値は静的に知るべきです。一方、ノードの一部(子、参照先、またはプロパティ)だけを動的に知っている場合、つまり実行時にしか評価できず、設計時にはわからない部分は、使用できません。そのような部分を含むノードを作成するための単なる引用です。
ただし、良いニュースは、ノードの大部分を静的に知っていて、いくつかの部分だけを動的に評価されたノードに置き換えたい場合には、引用符を使用できます。反引用符は、4 つのタイプ(子、参照、財産、およびリストの 引用符)にすることができます。それらはすべて式を含み、動的に評価されて、引用されたノードの一部をその結果で置き換えます。子および参照の対引用符はノードに評価され、プロパティ対引用符は文字列に評価され、リスト対引用符はノードのリストに評価されます。
たとえば、ArrayList クラスで ClassifierType を作成したいが、その型パラメーターは動的にしか認識されません。たとえば、"computeMyTypeParameter()" などのメソッドを呼び出すことによってわかります。
<ArrayList <%(computeMyTypeParameter())%>> という式を書きます。ここでの構成 %(...)% は節の逆引用符です。
また、それぞれ ^(...)^ と $(...)$ を使用して、参照ターゲットとプロパティ値を逆引用符で囲むこともできます。または *(...)* を使用して 1 つのロールを持つ子供のリスト。
a)引用符で囲まれたノード内のどこかにあるノードを式で評価されたノードに置き換える場合は、ノードの引用符を使用します。つまり、%()% です。ご想像のとおり、引用符で囲まれたノード全体を内部で式を含む引用符で置き換えることは意味がありません。そのような場合は、代わりにそのような式をプログラムに直接記述することができます。
そのため、ノードの引用符は、子供、孫、孫、その他の引用ノードの子孫を置き換えるために使用されます。antiquotation の内側の式はノードを返すべきです。そのような引用符を書くには、キャレットを子供用のセルに置き、「%」と入力します。
b)引用符で囲まれたノード内のどこかからの参照のターゲットを式で評価されたノードと置き換える場合は、参照の引用符を使用します。つまり、^(...)^ です。このような引用符を書くには、参照先のセルにキャレットを置き、"^" を入力します。
c)複数カーディナリティのロールを持つ子(またはさらに深く位置する子孫)を置き換えたい場合、その理由のためにそれを単一のノードではなくむしろ複数のものと置き換えたい場合は、子リスト(簡潔にするために単純なリスト)を使用します。*()。リストの逆引用符の内側の式はノードのリストを返すべきです。それは * * 型です nlist <..> * * または互換性のある型(つまり * ** {} list <node <.. >> * * も同様です。このような引用符を書くには、子コレクション内の子のセルにキャレットを置き、「msgstr " 空の子コレクションには使用できませんため、押す前に "」と入力して、その中に 1 人の子を入力する必要があります。
d)クォートされたノードのプロパティ値を動的に計算された値で置き換えたい場合は、プロパティ antiquotation $()$ を使用してください。引用符内の式は文字列を返す必要があります。これは、引用符付きノードの逆引用符付きプロパティの値になります。このような引用符を書くには、プロパティのセルにキャレットを置き、「$」と入力します。
軽い引用 (引用ビルダー)
強力で便利な引用はありますが、使用することには欠点があります。例:独自の定義で言語の引用を作成している場合は、言語のコンパイル中に特別な処理が必要なブートストラップサイクルを作成しています(ブートストラップ依存関係の削除を参照)。さらに、エディターが概念構造に 1 対 1 で対応していないノードの引用を作成するのは不便な場合があります。軽い引用は、このような課題を解消するのに役立つ代替アプローチを提供します。
次の 2 つの構文は、一方は引用符を使用し、他方は軽い引用符を使用しています。
直接モデル API の使用箇所とは異なり、軽い引用はより深い階層に便利に使用できます。
関連ページ:

ブートストラップ依存関係の問題の除去
定義::いつでもそれ自体を使用する言語または、言語を使用し、その言語が機能するために同じソリューションを必要とする(つまり、間接的または直接依存する)ソリューション、ブートストラップ依存関係の問題があります。なぜこれが問題なのですか :ビルドスクリプトを使用してプロジェクト全体をゼロから再構築するこ...

ログ関連
jetbrains.mps.baselanguage.logging言語には、メッセージツールビューパネルだけでなく MPS ログにも任意の情報を書き込むためのステートメントが含まれています。LogLowLevelStatementの概念(別名 "log error ...")はシステムロガーを使用...

アイコンの説明
アイコン記述言語は、さまざまな MPS 要素(概念、アクションなど)のアイコンの記述とインスタンス化に役立ちます言語には 2 つの目的があります。1. クイックアイコンプロトタイピング用のツールを提供します(例:コンセプト用の新しいアイコンの作成)2. アイコンを拡張可能な言語構成にします第一印象