是否有可能像LINQ那样创建c#语言修改?

本文关键字:语言 修改 创建 有可能 LINQ 是否 | 更新日期: 2023-09-27 18:07:09

我一直在看Skeet先生关于如何重新实现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出现之前就已经被保留了?

是否有可能像LINQ那样创建c#语言修改?

使用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语言的样例实现,或者使用一个定制的编译器,展示它解决了什么问题,以及为什么这将是一个巨大的胜利,证明在指定、设计、开发、测试和记录特性方面的成本是合理的。

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

当然,在Visual Studio中你会失去自动完成和语法高亮等功能,但这可以通过扩展来修复。

一些语言允许扩展它们的语法和语义。最接近c#的是Nemerle(它甚至支持c#的一个安全子集,您可以根据自己的喜好对其进行扩展),但同样的事情也可以用在几乎任何Lisp上。所以,如果你正在使用一门足够强大的语言,你不需要"给任何人留下深刻印象"——任何库都可以为语言本身添加新功能。

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

这是可能的,但这将很难,他们可能会重新实现这个想法,以更好地适应他们的语言结构。新的异步特性类似于一个名为AsyncEnumerator的库,但他们正在构建更适合该语言的一切。LINQ的关键字没有预先保留,但它们是上下文关键字,这意味着在LINQ上下文中可以有与该关键字匹配的标识符。当编译器检测到LINQ结构时,它将进入LINQ模式,其中这些关键字是实际保留字。