引用符
引用は、必要な構造を持つノードを簡単に作成できるようにする言語構造です。もちろん、smodelLanguage を使用してノードを作成し、同じ smodelLanguage を使用して、適切な子、プロパティ、参照を手動で入力することができます。ただし、これを実現するためのより簡単で視覚的な方法があります。
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.resources には、...
ロギング
jetbrains.mps.baselanguage.logging 言語には、MPS ログとメッセージツールビューパネルに任意の情報を書き込むためのステートメントが含まれています。LogLowLevelStatement コンセプト (別名「ログエラー ...」) はシステムロガーを使用してログを記録するために使用され、MsgStatement(別名「メッセージエラー ...」) はメッセージツールウィンドウにログを記録するために使用されます。メッセージツールウィンドウは画面下部にあります。MP...