Можно ли создавать модификации языка C # так же, как и LINQ? - PullRequest
11 голосов
/ 30 августа 2011

Я довольно долго смотрел на Мистер.Блог Скита о том, как повторно реализовать 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) 

от компилятора.

У меня такой вопрос: как можно впечатлить достаточно больших париков библиотекой, чтобы заставить их позволить языкуизменить, чтобы поддержать библиотеку?Или эти слова уже были зарезервированы до появления LINQ?

Ответы [ 4 ]

9 голосов
/ 30 августа 2011

Захватите Mono C # Compiler - это открытый исходный код, и вы можете делать любые языковые модификации, какие захотите, и какие .net поддерживает, например, использовать перечисления в качестве общих ограничений, создавать методы, которые возвращают ссылки на типы значений (public ref int Max(ref int x, ref int y) { if (x>y) return ref x; else return ref y; }), которые имеют защищенную или внутреннюю видимость и т. д.

Конечно, вы создаете несовместимую производную от C #, но если вы приложите достаточно усилий, то это может понравиться людям.

Другой вариант: начать блог, придумать несколько действительно хороших вариантов его использования, возможно, пример реализации на языке .net или использовать настроенный компилятор, показать, какую проблему он решает и почему это будет большой победой. это оправдывает затраты, связанные с определением, проектированием, разработкой, тестированием и документированием функции.

3 голосов
/ 30 августа 2011

Я очень сомневаюсь, что разработчики компиляторов реализовали бы синтаксические расширения для любой библиотеки.Если вам действительно нужна интеграция на уровне языка, вы можете разработать препроцессор, который преобразует ваш собственный синтаксис в действительный C #.По сути, это то, что компилятор делает с LINQ в любом случае (как вы указали в своем вопросе).

Конечно, вы потеряете такие вещи, как автозаполнение и подсветка синтаксиса в Visual Studio, но это можно исправить с помощьюрасширение.

1 голос
/ 31 августа 2011

Некоторые языки позволяют расширить их синтаксис и семантику.Наиболее близким к C # является Nemerle (и он даже поддерживает безопасное подмножество C #, которое вы, в свою очередь, можете расширять по своему усмотрению), но то же самое можно сделать, например, практически с любым Lisp.Поэтому, если вы используете достаточно мощный язык, вам не нужно «впечатлять» кого-либо - любая библиотека может добавить новые функции к самому языку.

Ходили слухи, что следующий C # предоставит некоторыеподдержка рудиментарного метапрограммирования, но я не смог найти каких-либо подробностей.

0 голосов
/ 30 августа 2011

Это возможно, но это будет сложно, и они, вероятно, переопределят идею, чтобы лучше соответствовать их языковым конструкциям.Новая асинхронная функция похожа на библиотеку под названием AsyncEnumerator, например, но она строит все, чтобы лучше соответствовать языку.Ключевые слова для LINQ не были зарезервированы заранее, но они являются контекстными ключевыми словами, что означает, что могут быть идентификаторы, которые соответствуют этим ключевым словам вне контекста LINQ.Когда компилятор обнаруживает конструкцию LINQ, он переходит в режим LINQ, где эти ключевые слова являются фактическими зарезервированными словами.

...