область видимости анонимных классов
От: Ziaw Россия  
Дата: 28.05.10 10:06
Оценка:
Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.

Я пока решил проблему сделав свою версию pnew. Но может быть это можно сделать прямо в new.

Кстати, лицензия позволяет использовать допиленные исходники библиотеки в своих проектах?
Re: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.10 11:51
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Я пока решил проблему сделав свою версию pnew. Но может быть это можно сделать прямо в new.


Поправь сам. Если будте что-то не так, то будем разбираться. На крайняк откатим.

Z>Кстати, лицензия позволяет использовать допиленные исходники библиотеки в своих проектах?


Все что публикцется в репозитории немерла идет под его лицензией. Так что можно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 28.05.10 14:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Поправь сам. Если будте что-то не так, то будем разбираться. На крайняк откатим.


Ок, внеси меня в комитеры. Заодно исправлю макросы логгирования в режиме интелисенса, с ними пришлось поступить так же (засунул в рельсы).
Re: область видимости анонимных классов
От: catbert  
Дата: 28.05.10 14:22
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.


Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ

Кстати, я бы в таком случае пользовался IAnonymous (но у него, конечно, есть свои проблемы).
Re[3]: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.10 15:21
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Ок, внеси меня в комитеры. Заодно исправлю макросы логгирования в режиме интелисенса, с ними пришлось поступить так же (засунул в рельсы).


Присылай гуглеый экаунт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.10 15:27
Оценка:
Здравствуйте, catbert, Вы писали:

C>Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ


Может как-то это дело декларативно задавать? Ну, скажем, если анонимный тип возрващается публичным методом публичного типа, то делаем его публичным.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 28.05.10 15:50
Оценка:
Здравствуйте, VladD2, Вы писали:

C>>Только если будешь делать, оставь опцию (и, желательно дефолт), чтобы они были приватными. Мне, к примеру, такие вещи не хочется выставлять из сборки напоказ


VD>Может как-то это дело декларативно задавать? Ну, скажем, если анонимный тип возрващается публичным методом публичного типа, то делаем его публичным.


Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)

У меня он не возвращается никакими методами. Да и метод такой может быть создан разве что макросом.

Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer. Несмотря на все прелести алг.типов и генерируемых конструкторов фича нужная. Кстати, как линк работает там где требется такой экспрешн? В тулките тоже многое на него завязано.
Re[4]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 28.05.10 15:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Присылай гуглеый экаунт.


ziminav на гмыле.
Re[4]: область видимости анонимных классов
От: catbert  
Дата: 28.05.10 16:10
Оценка: 2 (1) +1
Здравствуйте, Ziaw, Вы писали:

Z>Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)


Для каждого выражения нужно иметь возможность регулировать видимость автоматически. Но атрибут уровня сборки тоже хотелось бы иметь. Наверное, стоит newp добавить в стандартную библиотеку.

Но я, допустим, против общей видимости анонимных типов. В некоторых сценариях — типа твоего — они имеют смысл, но вообще они только портят API.

Z>Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer.


Если это про C#-овску конструкцию new Foo { Height = 6; Name = "Bar" }, то я где-то видел (сейчас в интернете не могу найти) простенький макрос:

namespace WithTest {

    // Object initializer syntax
    // Foo() with { Bar = 42; Buz = "hello" }
    public macro @with (obj, assignmentExprs) {
        def exprs = match (assignmentExprs) {
            | PExpr.Sequence(elements) => elements;
            | _ => throw Exception("'with' must be given a Sequence of assignment statements.");
        };

        def createTemp = <[ def temp = $obj ]>;
        def assignments(xs) {
            | <[ $(name : name) = $value ]> :: xs => <[ temp.$(name : name) = $value ]> :: assignments(xs);
            | [] => [ <[ temp ]> ];
            | _ => throw Exception("'with' must be given a Sequence of assignment statements.");
        };
        <[ { .. $( createTemp :: assignments(exprs) ) } ]>
    }

}


Я думаю, встроить его в код макроса new не составит проблемы.
Re[4]: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.10 17:40
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Может атрибутом уровня сборки? AnonymousTypesVisibility(Internal(default)|Public|Private)


Z>У меня он не возвращается никакими методами. Да и метод такой может быть создан разве что макросом.


Химия какая-то получается .

Z>Кстати, по хорошему этот макрос надо бы научить еще работать как object initializer. Несмотря на все прелести алг.типов и генерируемых конструкторов фича нужная.


Лучше сделать ее отдельно. Тут уже предлагали макру with похожую на бэйсиковскую фичу.

Z>Кстати, как линк работает там где требется такой экспрешн? В тулките тоже многое на него завязано.


Используются кортежи. Для них делается сопоставление параметров коструктора полям.

Анонимных типов в момент реализации линка не было, так что не знач будут ли они работать вместе с линком (через эспрешон-три), но это не долго "докрутить". Короче, как начнете плотно с SQL-ем работать, то доведем до готовности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.10 17:41
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>ziminav на гмыле.


Готово.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: область видимости анонимных классов
От: hardcase Пират http://nemerle.org
Дата: 28.05.10 18:30
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.


А как ты хочешь его именовать?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 29.05.10 03:04
Оценка:
Здравствуйте, hardcase, Вы писали:

Z>>Нельзя ли сделать их паблик? Возникают проблемы с передачей анонимных классов во вьюхи, т.к. те компилируются в рантайме в отдельную сборку.


H>А как ты хочешь его именовать?


Твоим макросом, он же выводит типы в модели. В том числе и анонимные.
Re[5]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 29.05.10 03:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Химия какая-то получается .


Ага, химия. В контроллере пишется такой код:

        public Index() : ActionResult
        {
            using (def db = Db())
            {
                def message = $"NRails env: '$(db.Env)'. We have $(db.Persons.Count()) persons."
                def taxonomies =  db.Doctors.Select(d => new (tax = d.Taxonomy, id = d.PersionId).ToList();
                
                model ( message = message, taxonomies = taxonomies )
            }
        }


А во вьюхе доступна model, в которой есть message : string, и taxonomies c труднопроизносимым типом.

Это одна из ключевых фич nrails. Больше всего в MVC напрягает создание типа для ViewModel на каждую вью. Потом начинает казаться, что пара вьюх могут использовать один и тот же тип, а рано или поздно приходят требования которые заставляют их различать. Вобщем геморой еще тот.

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

Впрочем этот механизм вместе с константами требует более тщательной обкатки и скорее всего будет перепроектирован после опытного использования.
Re[6]: область видимости анонимных классов
От: hardcase Пират http://nemerle.org
Дата: 29.05.10 08:56
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.


Кажется я понял что за проблема. Анонимный класс new () сейчас имеет модификатор internal а когда он появляется в model(), то публичное поле получает этот тип с модификатором internal. Надо подумать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: область видимости анонимных классов
От: Ziaw Россия  
Дата: 29.05.10 13:28
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Ziaw, Вы писали:


Z>>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.


H>Кажется я понял что за проблема. Анонимный класс new () сейчас имеет модификатор internal а когда он появляется в model(), то публичное поле получает этот тип с модификатором internal. Надо подумать.


Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.

А вообще, надо подумать, возможно анонимных типов будет достаточно для всего и макросу модель не придется генерить свой аналог. У меня пока не получается придумать красивый дизайн совмещения автосгенеренных методов указания вьюх и передачи им параметров. Почему-то все сводится к задаче генерации макросов
Re[8]: область видимости анонимных классов
От: hardcase Пират http://nemerle.org
Дата: 29.05.10 18:42
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.


В принципе добавить мета-атрибут настройки видимости анонимных классов вне сборки.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: область видимости анонимных классов
От: hardcase Пират http://nemerle.org
Дата: 29.05.10 19:55
Оценка: 14 (1)
Здравствуйте, Ziaw, Вы писали:

Z>Спасибо =) Я уже разбрался в проблеме, тип просто не виден в сборке вьюхи. Изначальный пост именно об этом. Думаю для начала сделать атрибут для установки области видимости анонимных классов.


Опцию добавил в ревизии 8889. Пример тут.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: область видимости анонимных классов
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.10 12:59
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.


ОК. Предположим экспортировали мы анонимные типы из сборки. А что делать в той сборке в которую они подключаются, если в ней так же используются такие же анонимные типы? Ведь будет же конфликт имен.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: область видимости анонимных классов
От: hardcase Пират http://nemerle.org
Дата: 31.05.10 15:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Ziaw, Вы писали:


Z>>А то, что внутри модели становится возможно передавать анонимные классы это побочный плюс. Даже без них фича нужная, хотя она работает и с ними.


VD>ОК. Предположим экспортировали мы анонимные типы из сборки. А что делать в той сборке в которую они подключаются, если в ней так же используются такие же анонимные типы? Ведь будет же конфликт имен.


Сейчас если анонимный класс есть — будет использоваться он (т.е. внешний). Защиту от этой неприятной ситуации я добавлю чуть позже
/* иЗвиНите зА неРовнЫй поЧерК */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.