Previous: システムインタフェース, Up: 組み込みライブラリ [Contents][Index]
Gauche には開発者がプログラムを解析するための基本的な組込みAPIがあります。
• デバッグ補助: | ||
• プロファイラAPI: |
このマクロはexprをそのフォームのまま印字してから、その式を評価し、 評価の結果を印字し、その値を返します。
出力は現在のトレース出力ポート (current-trace-port
)
に行きます (ポート共通の操作参照)。
特殊リーダー構文 #?=expr
は
(debug-print expr)
に展開されます。
詳細については デバッグ を参照してください。
このパラメータはdebug-print
が印字する情報の最大幅を指定するもの
です。このパラメータが保持する値よりも大きいカラム数の情報は丸められま
す。
すべての情報を表示したければ、このパラメータに#f
を設定してくだ
さい。
このマクロはprocを呼び出す直前に全てのargの値を表示し、 そしてprocの呼び出し後に全ての戻り値を表示します。
出力は現在のトレース出力ポート (current-trace-port
)
に行きます (ポート共通の操作参照)。
特別なリーダ構文 #?,expr
は (debug-funcall expr)
に展開されます。詳しくは デバッグ を参照してください。
debug-print
およびdebug-funcall
のように動作しますが、
testが真の値に評価された時のみデバッグ出力を表示します。
これらは次のコードと機能的には同じです。
(if test (debug-print expr) expr) (if test (debug-funcall (proc arg …)) (proc arg …))
特別なリーダ構文 #??=test expr
および
#??,test expr
はそれぞれ
(debug-print-conditionally test expr)
と
(debug-funcall-conditionally test expr)
に展開されます。
詳しくは デバッグ を参照してください。
objに付加されているソースコード情報を検索します。ソースコード情
報とはソースコードファイル名と行番号のリストです。objにソースコー
ド情報が付加されていなければ、#f
が返されます。
closureのソースコードが取り出せればそれを返します。そうでなければ
#f
を返します。
現在、Schemeソースから直接読み込まれた場合のみ、ソースコードが取り出せます。 プリコンパイルされたSchemeコードではソースコードは保存されません。 将来は変更されるかもしれません。
procedureが定義された場所(ファイル名と行番号)がわかればそれをリストにして
返します。わからなければ#f
が返ります。
gosh> (use rfc.http) gosh> (source-location http-get) ("/usr/share/gauche-0.9/0.9.5/lib/rfc/http.scm" 443)
procedureがsubrやプリコンパイルされた手続きの場合、 ファイル名は完全なパスではないかもしれません。
gosh> (source-location cons) ("liblist.scm" 46)
コンパイル済のclosureの本体部分をディスアセンブルして印字します。 これはコンパイラのバグをなんとかしようという場合か、限界まで チューンしようとしないかぎりは役には立たないでしょう。
このディスアセンブラの出力結果を読む場合には、コンパイルされたコードに はデッドコードが含まれている可能性があることを心してください。デッドコー ドはジャンプ最適化によって生成されるのですが、コンパイラはこれをわざわ ざ除去することはしていません。
この手続きは、objについてほぼユニークな文字列を返します。
「ほぼ」ユニークというのは、
次のGCが起きるまでは、オブジェクトが同じ文字列を返したらeq?
であり、
またeq?
でないオブジェクト同士は異なる文字列を返すということです。
この文字列は、他に区別の手段がないような無名オブジェクトを印字する時に 使われることを想定しています。GCをまたいだ唯一性は保証されないので、 この手続きが返す文字列をオブジェクトを同定するキーとして使ってはいけません。
ここに挙げている関数は、Gauche の組込みプロファイラを制御するためのも のです。プロファイラの説明については プロファイラを使う を参照してく ださい。
注意:現時点ではプロファイラはマルチスレッドプログラムでは正しく動作する
保証はありません。setitimer
とスレッドの相互作用が
プラットフォーム依存だからです。
標本化プロファイラを始動します。プロファイラが既に始動しいる場合 には何もしません。
標本化プロファイラを停止し、標本データを内部データ構 造に保存します。既に標本データが保存されていた場合には、新 しく収集された標本データがその後に追加されます。もしプロファイラが動いてい なかった場合には何もしません。
もしプロファイラが動いていればそれを停止し、保存されていた標本データ を破棄します。
格納されている標本データを表示します。
キーワード引数 sort-by は指定する場合は、time
、
count
または time-per-call
のどれかひとつです。
これで結果の整列順を指定します。デフォルトでは time
です。
キーワード引数 max-rows では結果を表示する最大行数を指定します。
この値が #f
であればすべてのデータが表示されます。
手軽にプロファイリングするための手続きです。 プロファイラをonにしてthunkを呼び出し、結果をcurrent output port に出力します。thunkの戻り値が式の戻り値となります。 結果表示後、プロファイラはリセットされます。
この手続きをネストすることはできません。最も内側のwith-profiler
が
結果をリセットしてしまうので、外側のwith-profiler
に全ての情報が渡らないからです。
Previous: システムインタフェース, Up: 組み込みライブラリ [Contents][Index]