クックブック - 型システム
推論ルール
このクックブックは、言語の型を設計する際の簡単な答えとガイドラインを提供するものです。型システムの詳細な説明については、ユーザーガイドの型システムセクションを参照してください。
等価
ノードのタイプが常に特定の具体的なタイプである必要がある場合は、タイプ方程式を使用します。typeof コマンドを使用して、目的のノードのタイプが特定のタイプと等しくなければならないことを宣言します。
注: 引用符は型を参照するために使用されます。<string> は new node<StringType>() と入力することと同じです。要素の型は、他の要素の型と等しくなります。例: 括弧がラップされた要素の型を保持することを表すには、ParenthesizedExpression の概念を宣言します。
不等価
タイプを他のタイプのサブタイプまたはスーパータイプにする必要がある場合は、infertypeof コマンドを使用します。例として三項演算子を参照してください。
ForEachStatement の概念は、非常に複雑なシナリオを解決する方法を示しています。ループ変数の型は、反復コレクション内の要素の型と同じである必要がありますが、コレクションの型は、elementType 型の要素のシーケンスまたは配列のサブ型である必要があります。
注目すべきは、`var elementType` を使用して変数を宣言し、それを使ってコレクション要素の型とループ変数の型を関連付けている点です。また、`%(...)%` は、いわゆるアンチクォーテーションを区切るもので、ローカルコンテキストから操作対象の AST に値を渡したり、ローカルコンテキストから値を取得したりすることができます。
交換ルール
置換ルールは、ある型を別の型に置き換える可能性を型システムに示します。例: NullType はすべての型(プリミティブ型を除く)のサブタイプであるため、型システムは NullType と BaseConcept の間の不等式を簡単に削除できます。
置換ルールは、共分散と反分散を宣言するのにも便利です。例: シーケンスの共分散は、MPS で次のように宣言されます。
左のコレクションが右のコレクションのサブタイプであると主張する元のルールは、左のコレクションの要素のタイプが右のコレクションの要素のタイプのサブタイプであることを保証するルールに置き換えられます。
サブタイプ規則
サブ型ルールを使用すると、特定の型が型階層のどこに属するかを指定できます。ルールは型のコレクションを返し、それを直接のスーパー型として識別します。たとえば、次のルールは、Long 変数を Float にキャストできることを宣言しています。
ここで MPS は、LinkedList が List、Deque、または Stack のいずれかのサブタイプであることを宣言しています。
比較ルール
2 つのタイプを交換可能にする必要がある場合は、比較ルールを使用してそれを定義します。例: 次のルールにより、NullType は、プリミティブタイプを除くすべてのタイプと比較可能になります。
同様に、BaseLanguage の MapType と Java の Map インターフェース (ここではパターン内の ClassifierType の概念を通して参照) は比較可能であるべきです。
代替タイプルール
これらは、型を表すノードを定義済みの置換で置き換えるように型システムに指示します。
例: タスクで必要な型に応じて、int または long のように、プログラム構成ごとに異なる型を使用するように決定する場合があります。これは、ジェネレーターを使用して正しい「実装」型を生成する場合とは異なります。置換は型チェックの実行時に行われるため、潜在的なエラーを早期に検出できます。
最も単純な形式では、型システムモデルで Substitute Type Rule のインスタンスを作成することによって型置換を使用できます。
Substitute Type Rule は型を表すノードに適用可能です。タイプチェッカによって新しい型が導入されるときはいつでも、適切な代入規則を検索して実行します。この規則は、置換として `node <>` のインスタンス、または null 値を返さなければなりません。その場合、元のノードが型を表すのに使われます(デフォルトの振る舞い)。
型チェッカーが使用する型をオーバーライドするもう 1 つの方法は、ノード属性を使用することです。元の型ノードにノード属性が含まれている場合、型チェッカーはまずその属性に適用可能な置換型ルールを探します。この方法を使えば、実装が非公開の言語であっても型ノードをオーバーライドできます。
上記のルールは属性ノードに対して定義されており、明示的なパラメーターとしてルールに渡されるのは属性ノードです。この規則は、型ノードを置換するための条件が満たされているかどうかをチェックでき、attributedNode 式を介して元の型を表す属性付きノードにもアクセスできます。
チェックとクイックフィックス
チェックルールは MPS コード分析プロセスの一部となり、エディターで対話形式でユーザーに見つかった問題を報告します。例: これは、余分な型キャストのチェックです。
これで、上記の問題が報告されたときにユーザーにポップアップするクイックフィックスを定義できます。その後、ユーザーはクイックフィックスをすばやく呼び出して、報告された問題を修正できます。
報告されたエラーにクイックフィックスを関連付けるには、クイックフィックスを情報メッセージにリンクされたインテンション(オプション)として指定する必要があります。

さらに、クイックフィックスにパラメーターを渡し、それを「すぐに 適用」でマークすることもできます。その場合、エディターでエラーが検出されるとすぐにクイックフィックスが自動的に適用されます。
コンクリートのオーバーロード操作
When-concrete ブロックを使用すると、ノードのタイプが計算された後、タイプチェックを実行できます。以下の例では、計算された操作のタイプが、演算子のオーバーライドルールに基づいて操作タイプコマンドによって提案されたタイプと一致することを確認しています。
関連ページ:
型システム
言語のための型システムを定義する:このページでは、MPS 型システムについて詳しく説明します。最初の型システムの規則を定義する際に、さらに簡単に導入したい場合は、型システムクックブックをチェックしてください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使うの章も参照してください。型システムとは:型システムは、言語を使用して書かれたモデル内のノードに型を割り当てる言語定義の一部です。型システム言語は、ノードとそのタイプに対する特定の制約をチェックするためにも使用されます
HowTo- 追加のツールを追加する (別名再生)
追加のツールを追加する (別名再生):This document describes how to build a new ツール (For Eclipse users, a Tool in MPS is like a View in Eclipse) for MPS. This can serve as an example to build arbitrary additional tools into MPS. This text emphasizes two aspects of Tool...
インタープリタークックブックの作成
バージョン 3.1 以降 MPS にバンドルされている Shapes サンプルプロジェクトを確認してください。エディターでいくつかの凝ったトリックを行うことができます。デフォルトでは、エディターは、キャンバス上に指定されたサイズと色の視覚的形状を描画するためのコマンドで構成されるプレーンコードを表示します。コードを Java に生成して実行することができます。これにより、上記のコードから生成されたばかりのアプリケーションを実行する新しい Java プロセスが起動します。ただし、MPS は Java...