【发布时间】:2015-01-11 10:32:30
【问题描述】:
我正在尝试创建一个自动“调试器”来跟踪函数流。因为我不是神,我确实会犯错误,而且当我这样做时,我通常会在我的函数中抛出一堆“秀”。我要做的是创建一个函数,该函数将在每行之前插入显示,用于该行表达式中使用的每个变量以及之前分配给的任何变量。
想象一下,我有一个函数 f 抛出了一个无用的错误。我会插入 f: 调试包装[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: *:
我现在正在做的是递归遍历解析树并重建调用。这是痛苦的,还没有产生结果。我认为最好的方法是从每个解析子树中获取我需要的信息,然后解析该子树并将其附加到我的函数字符串中。
感谢大家提供的任何帮助。
【问题讨论】:
-
This
unparserepository from Github 解析 q 解析树,我认为这是您关于调试的问题的一部分。请参阅此 SO 问题和答案:stackoverflow.com/questions/44904518/…