是否有可能像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出现之前就已经被保留了?
使用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模式,其中这些关键字是实际保留字。