研究!rsc公司

关于编程的想法和链接,通过

RSS(RSS)

戈夫特
发布于2009年12月15日星期二。

围棋项目最具争议的方面之一Go有一个规范的程序格式,实现了通过程序(戈夫特)能捡到任何东西去编程并以规范格式重新格式化它。Go源代码树中的每个程序都已格式化与gofmt合作。代码审查和修订控制工具检查所有新代码是否也是gofmt格式的。

(我避免使用“风格”这个词,因为gofmt没有强制执行风格,在某种意义上编程风格的要素.通过gofmt更改运行代码布局,但不是它是否是一个写得好、优雅的程序。随着风格的提升,引用这些平凡的格式规则它们远远超出了它们的重要性。gofmt强加的唯一风格是一致性。)

使用gofmt最明显的好处是打开一个陌生的围棋程序,你的大脑甚至不会分心下意识地,为什么那个支架放错了地方;你可以专注于代码,而不是格式。但是gofmt还有很多有趣的用途。Gofmt可以获取Go源代码树中的任何文件,将其解析为内部表示,然后将完全相同的字节写回文件。这样做有两个原因:主要原因是gofmt付出了很多努力,但重要的次要原因是gofmt只需要担心关于一个格式约定,我们已经同意接受这个作为官方的。

一旦你有了一个可以解析和打印程序无损,易于插入机械加工在中间,在解析和打印之间转换程序。想改变语言吗?在gofmt中更改它并重新格式化源树。自公开发布以来,这已经发生了多次。

12月9日发布的Go增加了一个新的内置功能副本(dst,src)从一个切片到另一个。(它是内置的,因为它是常见操作,因为Go缺少指针算术使得自己很难编写重叠检查。)新的复制替换了库例程字节。复制,类似但只在字节片上工作。

Gofmt有一个选项,-第页,指定重写表单中的规则图案->更换.在模式和替换中,单字母小写名称用作匹配任意表达式的通配符。想要从转换字节。复制复制?

gofmt-w-r'字节。复制(d,s)->复制(d、s)'*.go

(-w标志将程序的新版本写回输入文件。)

12月9日的版本还增加了对写作的支持x[i:]而不是x[i:len(x)].如果可能,想转换程序以使用新语法吗?

gofmt-w-r'x[i:len(x)]->x[i:]'*.go

这两个微小的变化被讨论所取代一个更大的句法变化是取消了行号。再一次,gofmt对实现转变至关重要。正在考虑的语法主要是,但不完全是,向后兼容当前版本的Go。通常,这意味着必须制作编译器在一段时间内支持这两种语法编译器可能会根据在旧语法上,希望用户修复他们的程序。相反,有一个工具的工作是重写程序意味着所有其他工具都可以专注于其他事情。Gofmt可以机械地修复程序,以及编译器和其他工具可以删除旧语法,而不必同时支持这两种语法。

我希望看到更多使用gofmt和它使用的库(go/解析器go/打印机).例如,IDE插件没有理由不能位于同一位置库来构建有趣的重构工具。Gofmt的-第页只是开始。这将是令人兴奋的。

最后一个注释。能够挑选创建一个程序并将其写回,保留注释,用任何语言来说都不是一件容易的事。Robert Griesemer应该为为了让gofmt能够很好地处理真实的程序,付出了巨大的努力。

(评论最初通过Blogger发布。)

  • 安德鲁 (2009年12月15日上午9:57)我必须对SQL做一些类似的操作——读入大量COBOL文件,找到其中的所有SQL,读入,做一个小的更改,然后将其写回。解析SQL、更改表达式树,然后将其写回原来是实现这一点的最简单可靠的方法,因为至少这样您就知道什么时候会遇到一些不理解的SQL。

  • 新资本市场 (2009年12月15日下午4:10)这真的很有趣。

    首先,这意味着修复我迄今为止注意到的最大语法设计错误还为时不晚:前缀解引用操作符“*”。后缀解引用“^”可能是帕斯卡唯一正确的细节。

  • 罗格·佩佩 (2009年12月16日上午9:37)gofmt很棒,我喜欢重写规则。。。但这并不是一个包罗万象的问题。例如,我不确定是否有一种方法可以将“范围(a)”转换为“范围a”?

  • 俄罗斯考克斯 (2009年12月16日上午9:43)您还不能进行范围重写,因为没有语句块通配符的语法,而-r“range(a){x}->range a{x}”需要使用通配符。但也许{x}作为通配符就足够了。

    你可以用-r'(a)->a'去掉所有不必要的paren。

  • 本诺 (2011年1月8日下午6:59)重写非常酷。是否需要将字段从未报告更改为导出?

    例如:

    type Foo结构{bar int}->type Foo-struct{bar int}

    简单地替换bar->bar并不一定能很好地工作(如果有其他名为“bar”的东西,比如变量名或其他结构中的字段。