Совсем программерский пост
Aug. 30th, 2007 06:12 pmMono постепенно реализует фичи третьей версии языка C#.
И вот мы пытаемся скомпилить код:
И получаем облом. Понятное дело, фреймворк-то у Mono всего-лишь второй, в нем у списка никакого Where нету. Но компилятор уже умный, и понимает такую хитрую штуку, как статические расширения, так что беду легко можно вылечить, написав следующий класс (обращаем внимание на неуместное с виду слово this у параметра l):
И все вроде-бы клево, и работает зашибись. Класс статических расширений можно описывать где угодно. И компилить хоть в отдельную assembly.
А теперь вопрос: компилятор, чтобы скомпилить код, использующий статические расширения, должен эти расширения найти. И ведь находит, зараза! Он что, просматривает для этого все доступные ему библиотеки?
Исходники его смотреть уж больно неохота...
UPD 1 : Вообще-то, если компилятору нужен тип, а не метод, он тоже его ищет по всем библиотекам. Так что не такой уж и ужасный криминал. Но все же криминал: при поиске типа все, что нужно узнать, для того, чтобы решить, подходит тип или нет, у типа снаружи; при поиске расширения надо всем статическим классам залезть в потроха...
UPD 2 : Антон и Сержик немного успокоили:
Компилятор просматривает все статические классы в доступных сборках, которые доступны через юзинги текущего файла. В сборке сразу сказано, какие неймспейсы она экспортит (и какие из нее, соответственно, можно импортить).
Да, немного лучше. Хотя все равно не фонтан, конечно.
И вот мы пытаемся скомпилить код:
using System;
using System.Collections.Generic;
public class Foo
{
public static void Main()
{
var l = new List<int> {1, 2, 3};
foreach(int i in l.Where(x => x > 1))
Console.WriteLine(i);
}
}
И получаем облом. Понятное дело, фреймворк-то у Mono всего-лишь второй, в нем у списка никакого Where нету. Но компилятор уже умный, и понимает такую хитрую штуку, как статические расширения, так что беду легко можно вылечить, написав следующий класс (обращаем внимание на неуместное с виду слово this у параметра l):
public static class EnumExt
{
///Filtering lambda
public delegate bool Test<T>(T value);
///Filtering method
public static IEnumerable<T> Where<T>(this IEnumerable<T> l, Test<T> t)
{
foreach(T el in l)
if(t(el))
yield return el;
}
}
И все вроде-бы клево, и работает зашибись. Класс статических расширений можно описывать где угодно. И компилить хоть в отдельную assembly.
А теперь вопрос: компилятор, чтобы скомпилить код, использующий статические расширения, должен эти расширения найти. И ведь находит, зараза! Он что, просматривает для этого все доступные ему библиотеки?
Исходники его смотреть уж больно неохота...
UPD 1 : Вообще-то, если компилятору нужен тип, а не метод, он тоже его ищет по всем библиотекам. Так что не такой уж и ужасный криминал. Но все же криминал: при поиске типа все, что нужно узнать, для того, чтобы решить, подходит тип или нет, у типа снаружи; при поиске расширения надо всем статическим классам залезть в потроха...
UPD 2 : Антон и Сержик немного успокоили:
Компилятор просматривает все статические классы в доступных сборках, которые доступны через юзинги текущего файла. В сборке сразу сказано, какие неймспейсы она экспортит (и какие из нее, соответственно, можно импортить).
Да, немного лучше. Хотя все равно не фонтан, конечно.
no subject
Date: 2007-08-30 02:46 pm (UTC)Я тут узнал, что случилось страшное - в С++ тоже лямбды собираются добавить:
http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_expression
no subject
Date: 2007-08-30 02:55 pm (UTC)А с импортом и namespace - сорри, не очень понял.
no subject
Date: 2007-08-30 03:00 pm (UTC)Он просматривает все классы в доступных сборках, которые доступны через юзинги текущего файла, которые являются статическими классами и в которых есть нужный экстеншен метод.
no subject
Date: 2007-08-30 07:18 pm (UTC)Думаю, что давно пора было добавить нормальный NULL в стандарт. Кроме того, как человек. активно использующий и иногда пишущий шаблоны, я достойно оценю auto и concept (вкупе с concept_map).
no subject
Date: 2007-08-30 07:25 pm (UTC)no subject
Date: 2007-08-31 09:23 am (UTC)Это ж синтаксический сахар только, под ним ничего содержательного нет (я декомпилил и посмотрел, вызывается как обычный статический метод, естественно), так что сильно ничего и не нарушится. И слава Богу :).
no subject
Date: 2007-08-31 06:38 pm (UTC)no subject
Date: 2007-09-03 08:15 am (UTC)