metashellの紹介

これはAmusementCreators AdventCalendar通称ACACの7日目の記事です。

metashellとは

C++の対話型環境です。テンプレートの展開などを追えるのでC++のTMPを学ぶのに 良いです。

導入

対応している環境は

です。
これらに当てはまるならここからインストーラーを手に入れることが出来ます。
また、対応していなくてもgithubからソースコードをダウンロードしてinstall_build_dependencies.shbuild.shを実行すれば自前でビルドできます。

使い方

環境

#msh environment

で何がどう定義や宣言されていたり、どのファイルがインクルードされているかを知ることが出来ます。
これらの環境を一時的に保存するには

#msh environment push

してください。これによって現在の環境か変わることはありません。
その後、一段落してもとの環境に戻りたいときは

#msh environment pop

してください。pushする前の環境に戻ったと思います。
また、現在スタック上にいくつの環境があるのかは

#msh environment stack

で教えてくれます。
他にも

  • #msh environment reload ・・・インクルードファイルを読み直す
  • #msh environment reset・・・環境を初期状態に戻す(環境のスタックは変わりません)
  • #msh environment save <path>・・・環境をファイルに保存(metashell実行時に--enable-savingを引数に与える必要あり)

などが出来ます。

デバッグモード

#msh mdb <type>

デバッグモードに入ります。デバッグモードになると先頭に(mdb)が表示されます。
typeは省略できて、省略した時は直前の計算に対するデバッグモードになります。

デバッグモードでは

  • step n・・・でnつだけ処理を進める。
  • step over n or next n・・・現在のtemplateの階層よりも深い展開を無視してnつ分処理を進める。
  • step out・・・現在のtemplateの階層を抜ける
  • rbreak <regex>・・・正規表現にマッチした所にブレークポイントを張る
  • continue・・・ブレークポイントに引っかかるまで処理を進める
  • break list・・・ブレークポイントのリストを表示する
  • finish・・・ブレークポイントを無視して最後まで処理を進める
  • forwardtrace or ft・・・これからの処理を表示する
  • backtrace or bt・・・これまでの処理を表示する
  • help <command>・・・コマンドのヘルプを見る
  • quit・・・デバッグモードを終了する

などができます。

そのほか

  • boost::mplのコンテナを使うときはmetashell/formatter.hppをインクルードしておいた方が良さそうです
  • #msh quitでmetashellを終了します
  • #msh precompiled_headers onとするとプリコンパイル済みヘッダを使えます
  • いちいちうるさいなぁと感じたら#msh verbose offにするとよいです