这个问题讨论的是Erlang,但它也适用于其他函数式编程语言。
在函数定义的中间说,有一个这样的表达式:
A = B + voodoo(C, D)
和voodoo
定义为
voodoo(X, Y) -> more_voodoo(more_voodoo1(X), more_voodoo2(Y)).
和more_voodoo*
定义为voodoo
,列表继续执行,经过一些步骤后,它最终达到文字,BIF,库函数(后来称为“边框”)。
问题是:我想知道如何定义A
,如何生成图表来说明A
的定义?像这样:
C -> more_voodoo1 ---+
|-> more_voodoo ---+
D -> more_voodoo2 ---+ |-> (+) -> A
(graph inferred from context) -> B ---+
图表的组织方式在这里并不重要,只要它让我清楚地看到A
的定义(具有足够高的抽象并在必要时放大)。
直观地说,你可以认为程序是通过一些球的一些线程,其中踏板代表数据流,球代表功能,我想要做的是选择产生A
的球,以及摇晃,因此,只剩下与A
相关的内容,所有其他无趣的信息都会被删除。
我怀疑是否存在现成的工具,那么您对如何为此类任务实施工具有什么看法?它不必是全自动的,它可以尝试它的最佳状态,当它卡住它可以询问用户的指令(只是黑盒子,用户定义的边框等),解析源代码?挂钩到编译器?使用某种“无线电活动”值然后进行X射线检测吗?
你可能想知道,为什么不只是流动代码并理解它?好吧,有时候调用链太长了,很难把所有的堆栈都放在头上,当然,如果我们努力的话,我们最终会理解它,但是如果有更好的方法去做,为什么不呢? ?说实话,有时候这些代码是商业逻辑,而不是真正有趣的东西,这是一个一劳永逸的解决方案,一旦我们拥有了这个工具,我们下次就不会抓住我们的头脑了。使用图表,您可以清楚地看到某些数据来自哪里(并且它与用户更好地与文本交互,是的,我知道您喜欢纯文本,我也喜欢它,但承认它,有时候GUI比文本)。
如果你的电话链很长,你可能应该重构它,我听说你说。好吧,糟透了,有时你不允许改变这些代码。