dluciv: (Default)
[personal profile] dluciv
Mono постепенно реализует фичи третьей версии языка C#.

И вот мы пытаемся скомпилить код:

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 : Антон и Сержик немного успокоили:
Компилятор просматривает все статические классы в доступных сборках, которые доступны через юзинги текущего файла. В сборке сразу сказано, какие неймспейсы она экспортит (и какие из нее, соответственно, можно импортить).
Да, немного лучше. Хотя все равно не фонтан, конечно.

Date: 2007-08-30 02:46 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Думаю, что при импорте добавляется (как с namespace происходит).

Я тут узнал, что случилось страшное - в С++ тоже лямбды собираются добавить:
http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_expression

Date: 2007-08-30 02:55 pm (UTC)
From: [identity profile] dluciv.livejournal.com
Ну лямбда в языках семейства Си - фуфло, а не лямбда. Где return нужен, там лямбды нормальной быть не может :).

А с импортом и namespace - сорри, не очень понял.

Date: 2007-08-30 03:00 pm (UTC)
From: [identity profile] dluciv.livejournal.com
Сорри, Сержик уже объяснил:

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

Date: 2007-08-30 07:18 pm (UTC)
From: [identity profile] scavenger-spb.livejournal.com
Занятная ссылка. Вечер прошел не зря :)
Думаю, что давно пора было добавить нормальный NULL в стандарт. Кроме того, как человек. активно использующий и иногда пишущий шаблоны, я достойно оценю auto и concept (вкупе с concept_map).

Date: 2007-08-30 07:25 pm (UTC)
From: [identity profile] scavenger-spb.livejournal.com
Думаю, что статические расширения вполне укладываются в схему ООП, если под интерфейсом класса подразумевать все функции, которые принимают объекты этого класса в качестве параметров. Кстати, такой взгляд на интерфейс класса дает основание для использования поиска Кенига в плюсах.

Date: 2007-08-31 09:23 am (UTC)
From: [identity profile] dluciv.livejournal.com
Черт его знает. Видишь, я даже интерфейс, а не класс, умудрился расширить методом с реализацией :).

Это ж синтаксический сахар только, под ним ничего содержательного нет (я декомпилил и посмотрел, вызывается как обычный статический метод, естественно), так что сильно ничего и не нарушится. И слава Богу :).

Date: 2007-08-31 06:38 pm (UTC)
From: [identity profile] scavenger-spb.livejournal.com
Думаю тут фишка только в том, чтобы заставить компилятор понять эту языковую конструкцию. И именно это расширение нужно для людей, а не для компилера.

Date: 2007-09-03 08:15 am (UTC)
From: [identity profile] dluciv.livejournal.com
Ясное дело. Она, в принципе, довольно приятная. Хотя концептуально плохая, конечно :).

February 2022

S M T W T F S
  12345
6789101112
13141516 171819
20212223242526
2728     

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 11th, 2026 04:14 pm
Powered by Dreamwidth Studios