R语言识别代码重新格式化/重构工具?

时间:2012-02-02 00:12:24

标签: r refactoring automated-refactoring

最近,我发现自己正在使用R代码,这些代码在编码风格方面遍布地图 - 多位作者和个人作者并不严格遵守单一结构。有些任务我想比现在更好地自动化。

我正在寻找一种管理以下任务的工具(或多种工具) - 按照欲望递增的顺序列出,但也有点依赖于存在的怀疑主义。

  • 基本格式。比如将“if(foo)”转换为“if(foo)”并在支撑位置和类似物方面实现一致性。

  • 将“foo $ blah”转换为“foo [[”blah“]]”进行列表访问。理想情况下,如果一个对象真的是一个列表而不是一个data.frame并且只转换列表,它至少可以猜测。

  • 将'='转换为'< - '。是的,这是一个简单的搜索和替换 - 但不是真的。工具(或regexp)需要具有语言感知能力,以便它知道转换“x = 5”而不是“foo(x = 5)”。不仅简单地替换符号而且确保赋值运算符两侧的单个空格也是非常好的。

  • 变量重命名,特别是跨功能和文件。例如,假设列表中有一个元素“foo”,我很乐意将其更改为“foobar”一次,而不必在整个代码流中追踪该列表的每个用法。我想这将需要该工具能够进行整个控制流程,以便识别诸如在不同功能中作为另一个名称存在的列表之类的内容。

  • 命名约定。我希望能够定义一些标准命名约定(例如Google's或其他)并让它识别所有函数,变量等并转换它们。请注意,这与列表元素之类的内容相关联。

随意列出基本的unix处理命令(例如sed),只要它真的足够智能,至少通常不会搞砸(例如将“foo(x = 5)”转换为“foo(x< -5)“)。

我猜测,如果这样的工具已经存在于我现在已经听说过的完美状态,而且我也意识到使用像R这样的语言很难做到这些类型的一些自动变化,但人们可以做梦,对吧?有没有人对这些/所有这些有指针?

2 个答案:

答案 0 :(得分:2)

恕我直言,写下你自己的。编写漂亮的打印机实际上非常困难。它需要理解标记化,解析,构建AST或其他IR,跟踪符号表和范围,模板等。

但是如果你能做到这一点,你将会学到很多关于编程语言的知识。你的同事看起来也很令人印象深刻,简历上也很棒。这也很有趣。

我推荐Terence Parr的“Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages”。阅读有点粗糙,但内容非常好。它是在解析器的介绍级别编写的,它非常简短,但它包含了您自己编写此工具所需的所有部分。

如果你构建它,开源它,回到这里告诉我们,并建立一个包含一些广告的网站,让自己赚几块钱。这样每个人都可以使用你真棒的创作,在这个过程中你会得到几美元。

祝您好运......

答案 1 :(得分:2)

由于这似乎仍然相关,我想提到styler根据tidyverse style重新格式化r代码。

它勾选了一些方框,例如基本格式,但不重命名变量(尽管linter lintr至少能够显示这些)。

Styler是一个带有接受代码功能的R包(例如style_text()),但它也可以在命令行中使用:

例如tmp.r

中的此代码
a <-c(1,2,3) 
if(foo) {
  b=2 }
myVar=2

并且正在运行:

Rscript -e 'styler::style_file("tmp.r")'

将覆盖tmp.r:

a <- c(1, 2, 3)
if (foo) {
  b <- 2
}
myVar <- 2