我正在尝试创建一个自动调试器'用于跟踪功能流程。因为我不是上帝,我确实犯了错误,当我这样做时,我通常最终会抛出一堆" show"在我的功能。我要做的是创建一个函数,该函数将在每行的每个行之前插入显示在该行的表达式中使用的每个变量以及在前一个中分配给的任何变量。
想象一下,我有一个函数f,它会抛出一个无用的错误。我会插入 f:debugwrap [f]; 在函数定义之后,在函数字符串的行内插入相应的调试,解析并返回扩充函数。
我已经成功处理了params和简单的函数,但是我遇到麻烦的地方是分号不表示eol,例如在函数调用中。使用函数体上的解析,我可以轻松地打破所有行并找到所需的变量,但是一旦我这样做,我就需要解析'函数中的每一行。那个解析是给我带来麻烦,特别是在功能被翻译成我认为是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: *:
我现在正在做的是以递归方式遍历解析树并重建呼叫。这是痛苦的,尚未产生结果。我认为最好的方法是从每个解析子树中获取我需要的信息,然后解压缩该子树并将其附加到我的函数字符串。
感谢您提供的所有帮助。