Возможно ли создать языковые модификации С#, как LINQ?

Я немного искал Mr. Блог 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) 

КОМПЬЮТЕРОМ.

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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