関数フローをトレースするための自動「デバッガー」を作成しようとしています。私は神ではないので、間違いを犯します。間違いを犯すと、通常、自分の関数に大量の「見せかけ」を投げかけることになります。私が探しているのは、その行の式で使用される各変数と前に割り当てられた変数の各行の前にショーを挿入する関数を作成することです。
役に立たないエラーをスローしている関数 f があるとします。f: debugwrap[f]; を挿入します。関数定義の後に、関数文字列の行内に適切なデバッグを挿入し、解析して、拡張関数を返します。
私はパラメーターと単純な関数の処理に成功しましたが、問題があるのは、関数呼び出しなどでセミコロンが eol を示さない場合です。関数本体で parse を使用すると、すべての行を簡単に分割して必要な変数を見つけることができますが、一度実行したら、関数内の各行を「解析解除」する必要があります。特に関数が "*:" のように k であると信じているものに変換されている場合、その解析解除は問題を引き起こしています。
初期ロギングのみの簡単な例:
q)f: {[a;b] a: a xexp b; c: a-first `int$-1#string first table[`symbols]; :c }
q)df: dp[f;";"]
q)df
"{[a;b] show "a is ",string[a]; show "b is ",string[b]; a : a xexp b;c : a - *:`int$-1#$:*:table`symbols;: c;}"
q)parse df
ERROR: *:
私が今行っていることは、解析ツリーを再帰的にたどり、呼び出しを再構築することです。それは苦痛であり、まだ結果を出していません。私が考える最良の方法は、各解析サブツリーから必要な情報を取得し、そのサブツリーを解析解除して関数文字列に追加することです。
皆さんが提供できるあらゆる支援に感謝します。