型システムのデバッグ
型システムをデバッグするために、MPS は型システムトレースを提供します - それは型システムエンジンの中で起こる評価プロセスへのインサイトをあなたに与える統合された視覚的なツールです。
自分で試してみる
型システムを簡単に試すことができるように、専用のサンプル言語を用意しました。MPS にバンドルされている式サンプルプロジェクトを開きます。これは、ユーザーホームフォルダー内のサンプルプロジェクトの中で使用可能になります。
サンプル言語
実験する言語は、いくつかの型、4 つの算術演算(+、-、*、/)、割り当て(:=)、2 種類の変数宣言、変数参照を備えた簡易式言語です。エディターは非常に基本的なもため、ほとんどカスタマイズされていません。そのため、式の編集はおそらくかなり荒いものになります。それでも、新しいコードを書くよりも既存のサンプルをインスペクションし、それらの型をデバッグすることを期待しているため、スムーズな編集の欠如は課題になりません。
言語は SimpleMathWrapper の概念のおかげで Java に埋め込むことができますが、言語と BaseLanguage の間の対話は不可能です。
式言語は、2 つのブランチにサブタイプ規則によって編成された 6 つのタイプをサポートします。
要素 -> 数値 -> フロート -> 長い -> Int
要素 -> ブール
型を調べる
シンプルサンプルクラスを開くと、カーソルを式の任意の部分に移動するか、有効な式ブロックを選択できます。Control +Shift + P を押すとすぐに、ポップアップダイアログに選択したノードの種類が表示されます。
メインサンプルクラスは、型推論が適切な型を変数に正しく伝達する方法を示す、より複雑な例を示します。
計算された型を自分で確認してください。
タイプエラー
TypeError サンプルクラスは、型エラーの簡単な例を示しています。コード Ctrl+/ のコメントを外し、報告されたエラーを確認してください。
この変数宣言はその型が Int であることを明示的に宣言しているため、初期化子は型フロートであるため、型システムはエラーを報告します。一番下のステータスバーを確認するか、誤ったコードの上にマウスを移動するとします。
型システムトレース
N/A を押すか、ポップアップメニューをナビゲートすると、右側に型システムトレースパネルが表示されます。
トレースは、型システムエンジンが実行したすべてのステップ(たとえば型システム規則)をパネル 2 に示す。ステップは、実行された順序で上から下に並べられます。ボタン 1 _ 選択済みを使用している場合、パネル 2 はエディターで選択されているノードのタイプに直接または間接的に影響するステップ(パネル 1)をハイライトします。パネル 3 は、パネル 2 で選択されたステップの詳細を示します。ステップで型システムエンジンの状態にどのような変更が加えられたかを説明しています。エンジンのワーキングメモリの実際の状態はパネル 4 に表示されます。
ステップバイステップのデバッグ
シンプルサンプルクラスは、おそらく実験を開始するのに最も簡単なクラスです。型は、言語で指定された型システムの規則に従って、6 つのステップで解決されます。 F4 を押すか、N/A の「ルートノードに移動」コマンドを使用して、これらのルールをすばやく参照することをお勧めします。F3 は、現在のルールの影響を受けているノードに移動します。
変数宣言の型は、初期化子の型のスーパー型でなければなりません。aValue 変数に a 型システム変数が割り当てられ、初期化式に b 型システム変数が割り当てられ、a> = b(b サブ型または a と等しい型)が作業メモリに追加されます。
算術式の型システム規則に従って、b は数値のサブ型でなければならず、10 には c 変数が割り当てられ、1.3F には d 変数が割り当てられ、when-concrete ハンドラーが追加されて c が計算されます。
浮動小数点定数 d の規則に従うと、フロートとして解かれます。
整数定数 c の規則に従うと、Int として解かれます。これにより、ステップ 2 で登録された when-concrete ハンドラーおよび別の when-concrete ハンドラーが d を待つように登録されます。d はすでにフロートに解決されているため、ハンドラーは b(算術式全体)をトリガーし、フロートとして解決します。これは、b <= 数値という以前の式(ステップ 2)も解きます。
これで a はフロートとして解くことができます。これは a> = b というステップ 1 の方程式も解きます。
ツールバーのボタンを押して型展開を有効にすると、最後のステップとして、すべてのノードの具体的な型への最終展開が得られます。
関連ページ:

Using_typesystem
言語の型システムを定義した場合、タイプチェッカーは自動的にそれをエディターで使用して、開いているノードをエラーと警告でハイライトします。また、エディターアクションやジェネレータクエリなど、クエリの型に関する情報を使用することもできます。ノードの型を使用することも、特定の型が別の型のサブタイプかどうか...

インテンション
インテンションは、MPS が言語作成者が自分の言語を使用している人々のユーザーエクスペリエンスを滑らかにする方法を示す非常に良い例です。インテンションは、"negate boolean"、"invert if condition"、"create-from-usage" などの構文上の構文で、最もよ...