我正在尝试创建一个用于跟踪功能流的自动“调试器”。因为我不是神,我确实会犯错,当我犯错时,我通常会在我的函数中抛出一堆“秀”。我要做的是创建一个函数,该函数将在每一行之前插入显示,用于该行表达式中使用的每个变量以及之前分配给的任何变量。
想象一下,我有一个函数 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: *:
我现在正在做的是递归遍历解析树并重建调用。这是痛苦的,还没有产生结果。我认为最好的方法是从每个解析子树中获取我需要的信息,然后解析该子树并将其附加到我的函数字符串中。
感谢大家可以提供的任何帮助。