型システムのデバッグ
型システムをデバッグするために、MPS は型システムトレースを提供します - それは型システムエンジンの中で起こる評価プロセスへのインサイトをあなたに与える統合された視覚的なツールです。
自分で試してみる
型システムを簡単に試すことができるように、専用のサンプル言語を用意しました。MPS にバンドルされている式サンプルプロジェクトを開きます。これは、ユーザーホームフォルダー内のサンプルプロジェクトの中で使用可能になります。
サンプル言語
実験する言語は、いくつかの型、4 つの算術演算(+、-、*、/)、割り当て(: =)、2 種類の変数宣言、変数参照を備えた簡易式言語です。エディターは非常に基本的なもので、ほとんどカスタマイズされていません。そのため、式の編集はおそらくかなり荒いものになります。それでも、新しいコードを書くよりも既存のサンプルをインスペクションし、それらの型をデバッグすることを期待しているため、スムーズな編集の欠如は問題になりません。
SimpleMathWrapper の概念のおかげで言語を Java に埋め込むことができますが、言語と BaseLanguage の間の相互作用は不可能です。
式言語は、2 つのブランチにサブタイプ規則によって編成された 6 つのタイプをサポートします。
要素 -> 数値 -> フロート -> 長い -> Int
要素 -> ブール
型を調べる
シンプルなサンプルクラスを開くと、式の任意の部分にキャレットを配置したり、有効な式ブロックを選択したりできます。Ctrl+Shift+P を押すとすぐに、選択したノードの型がポップアップダイアログに表示されます。別の方法として、任意のノードを右クリックし、コンテキストメニューで言語デバッグ | 型の表示を選択することもできます。
Main サンプルクラスは、型推論が適切な型を変数に正しく伝播する方法を示すより複雑な例を示します。
計算された型を自分で確認してください。
タイプエラー
TypeError サンプルクラスは、タイプエラーの簡単な例を示しています。コード Ctrl+/ のコメントを外し、報告されたエラーを確認してください。
この変数宣言では、その型が Int であると明示的に宣言されていますが、初期化子は Float 型であるため、型システムはエラーを報告します。下部のステータスバーを確認するか、間違ったコード部分にマウスを移動します。
型システムトレース
Ctrl+Shift+X を押すか、ポップアップメニューを移動すると、右側に型システムトレースパネルが表示されます。
トレースは、型システムエンジンが実行したすべてのステップ (つまり、型システムルール) をパネル 2 に示します。ステップは、実行された順序で上から下に並べられています。ボタン 1 を選択すると、パネル 2 では、エディター ( パネル 1) で選択したノードのタイプに直接的または間接的に影響を与えるステップがハイライトされます。パネル 3 は、 パネル 2 で選択されたステップの詳細を示します。パネル 3 では、ステップ内の型システムエンジンの状態にどのような変更が加えられたかを説明します。エンジンのワーキングメモリの実際の状態はパネル 4 に表示されます。
ステップバイステップのデバッグ
Simple サンプルクラスは、おそらく実験を開始するのに最も簡単なクラスです。型は、言語で指定された型システムの規則に従って、6 つのステップで解決されます。F3 (ソースノードに移動) は、現在のルールの影響を受けるノードに移動します。
変数宣言の型は、初期化子の型のスーパー型である必要があります。AValue は変数が初期化式(に B サブ型または同じ型)、B 型システム変数および > = B が割り当てられている作業メモリに追加され、型システム変数が割り当てられます。
算術式の型システム規則に従って、b は Number のサブ型である必要があり、値 10 には c 変数が割り当てられ、1.3F に は d 変数が割り当てられ、c を待機するための when-concrete ハンドラーが追加されます。計算されます。
フロート定数 d のルールに続いてフロートとして解決されます。
整数定数 c の規則に従うと、Int として解かれます。これにより、手順 2 で登録された when-concrete ハンドラーがトリガーされ、別の when-concrete ハンドラーが d を待機するように登録されます。d はすでに Float に解決されているため、ハンドラーは b (算術式全体)をトリガーして Float として解決します。これにより、b <= Number という以前の方程式(ステップ 2)も解かれます。
これで、a を Float として解くことができます。これにより、a> = b であるステップ 1 の方程式も解かれます。
関連ページ:
Using_typesystem
言語の型システムを定義した場合、タイプチェッカーは自動的にそれをエディターで使用して、開いているノードをエラーと警告でハイライトします。また、エディターアクションやジェネレータークエリなど、クエリの型に関する情報を使用することもできます。ノードの型を使用することも、特定の型が別の型のサブタイプかどうかを知りたいこともあります。または、与えられた形式を持つ型のスーパータイプを見つけたいと思うかもしれません。タイプ操作:type 操作を使用して、クエリでノードのタイプを取得できます。<expr...
インテンション
インテンションは、MPS によって言語作成者がその言語を使用するユーザーのユーザーエクスペリエンスをスムーズにできることを示す非常に良い例です。インテンションは、「ブール値の否定」、「条件の反転」、「使用箇所からの作成」など、言語の構文構造で最もよく使用される操作にすばやくアクセスできます。IntelliJ IDEA のインテンションや、最新の IDE の同様の機能を使用したことがある場合は、MPS、インテンションが非常に馴染み深いものになるはずです。インテンションを使う:IDEA と同様に、...