C#中是否有类似Python或Haskell的显著空白?
我在想,其他C#开发者是否会觉得,如果有一个编译器指令可以让空格变得重要,就像Haskell或Python那样,空格的不同可以用来创建代码块,那会不会更好。
虽然这和C语言风格的语言有很大的不同,但我觉得C#最终是编译成CIL(公共中间语言),而CIL依然需要大括号和分号,所以这其实只是编译器处理的一种方式(也就是说,编译器可以选择是否把空格当回事)。因为大括号和分号常常让新手觉得难以入门,而它们其实只是帮助解析的工具(本身并不赋予代码意义),所以可以像Haskell或Python那样去掉。
F#通过#light编译器指令来处理这个问题,具体可以参考F# 1.1.12.3中的轻量语法选项。
我希望在C#中也能看到类似的东西:比如一个叫#SigSpace的指令,让csc.exe
在处理源代码时像处理Haskell文件那样对待空格(这只是一个例子)。
标准C#代码:
public void WhiteSpaceSig()
{
List<string> names = new List<string>();
List<string> colors = new List<string>();
foreach (string name in names)
{
foreach (string color in colors)
{
// bla bla bla
}
}
}
重要的空格:
#SigSpace
public void WhiteSpaceSig()
List<string> names = new List<string>()
List<string> colors = new List<string>()
foreach (string name in names)
foreach (string color in colors)
// bla bla bla
我并不是说我想在C#中实现这个,但我对其中的利弊很感兴趣。我猜大多数C#开发者已经习惯了这种语法,以至于他们可能看不到它有多么不自然(尽管最终可能会让代码更容易阅读)。
9 个回答
作为一个主要使用Python的开发者,我希望更多的编程语言能像Python一样,使用空白字符来区分代码块。
如果你去查查相关讨论组,你会发现很多C、C++、C#、Java等语言的开发者都有自己的看法。我感觉他们中的很多人其实很喜欢用大括号。
不过,如果各种风格混在一起,那可就麻烦了。
我也经常使用带大括号的语言,所以我能理解两种风格的优缺点。
如果你想要这样的语法,为什么不直接使用 IronPython 或者 Boo 呢,而非C#?
与其去调整C#,不如为这个目的实现一种自定义的语言。正如你所说,它们最终都会编译成相同的IL(中间语言),所以没有必要为了实现一个本质上是新语言语法的东西,而去改变一个已经很好、干净的工作语法。
你可能会对Kirill Osenkov的论文感兴趣,《设计、实现和集成一个结构化的C#代码编辑器》。
这篇论文的核心思想是,虽然大括号是C#语言的一部分,但你的编辑器并不一定要显示它们。Osenkov为SharpDevelop实现了一个编辑器控件,它通过缩进来表示大括号的配对,这样程序员在处理代码结构时会更快。想要看到一个很好的例子,可以跳到链接文档的第113页。