是否可以像LINQ一样创建C#语言修改?

时间:2011-08-30 17:29:51

标签: c# linq compiler-construction language-design

我一直在Mr. Skeet's blog on how to re-implement LINQ看一下。

特别是,他声明代码:

var list = (from person in people
        where person.FirstName.StartsWith("J")
        orderby person.Age
        select person.LastName)
       .ToList(); 

被转换为LINQ库提供的扩展方法的方法:

people.Where(person => person.FirstName.StartsWith("J"))
  .OrderBy(person => person.Age)
  .Select(person => person.LastName) 

BY THE COMPILER.

我的问题是,如何用图书馆给这些重要人物留下足够的印象,让他们允许语言改变以支持图书馆?或者在LINQ出现之前这些词已经被保留了?

4 个答案:

答案 0 :(得分:9)

抓住Mono C#编译器 - 它是开源的,你可以做任何你想要的语言修改和.net支持,例如,使用枚举作为通用约束,创建返回值类型引用的方法(public ref int Max(ref int x, ref int y) { if (x>y) return ref x; else return ref y; }) ,具有保护或内部可见性等。

当然,你正在创建一个不兼容的C#派生词,但是如果你把它推得足够硬,那么人们可能会喜欢它。

另一个选择:启动博客,为它提出一些非常好的用例,可能是.net语言的示例实现或使用自定义编译器,显示它解决了什么问题以及为什么这将是一个巨大的胜利这证明了指定,设计,开发,测试和记录特征所需的成本。

答案 1 :(得分:3)

我非常怀疑编译器开发人员会为任何库实现语法扩展。如果你真的想要语言级集成,你可以开发一个预处理器,将你的自定义语法转换为有效的C#。这基本上就是编译器对LINQ所做的事情(正如你在问题中指出的那样)。

当然,您会在Visual Studio中丢失自动完成和语法突出显示等内容,但可以通过扩展修复。

答案 2 :(得分:1)

某些语言允许扩展其语法和语义。最接近C#的是Nemerle(它甚至支持C#的安全子集,您可以根据需要进行扩展),但几乎任何Lisp都可以完成相同的操作。所以,如果你使用的语言足够强大,你就不需要“打动”任何人 - 任何库都可以为语言本身添加新的功能。

有传言说下一个C#也会提供一些基本的元编程支持,但我找不到任何细节。

答案 3 :(得分:0)

这是可能的,但它很难,他们可能会重新实现这个想法,以更好地适应他们的语言结构。例如,新的异步功能类似于名为AsyncEnumerator的库,但它们正在构建一切以更好地适应语言。 LINQ的关键字未提前保留,但它们是上下文关键字,这意味着可以在LINQ上下文之外存在与此关键字匹配的标识符。当编译器检测到LINQ构造时,它进入LINQ模式,其中这些关键字是实际的保留字。