Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Jack128, Вы писали:
J>>Enumerable.Range(0, 10).AsQueryable().Select(ToExpression(fun(i) { TestMacros.Cond(true, 1, 2) }));
J>>макрос ToExpression выдает ошибку conversion from Call (expr: TestMacros.Cond(true, 1, 2)) into 'expression tree' not supported
J>>но разве должен вызов макроса паковаться в вариант MacroCall ?
H>В MacroCall пакуются синтаксические макросы. Макрос в функциональной форме соответствует вызову функции и распознается в процессе типизации.
угу, точно. переделал на синтаксический макрос, терь другая проблема.
ToExpression (точнее LinqExprConvertion.ToExpr) не обрабатывает PExpr.Typed, я вроде добавил эту ветку, благо в ветке PExpr.Call практически аналогичнй код, и тут выплыла такая вещь:
вот этот код я скопировал для обработки PExpr.Typed
это макрос из немерЗдравствуйте, hardcase, Вы писали:
H>Здравствуйте, Jack128, Вы писали:
J>>как такое может быть???
H>Хм, как-то да выходит (Немерла нету под рукой). А что хочется получить-то?
Так низя. Макрос viewmodel делает тип для конкретной вьюхи. Не никакого смысла делать его IEnemerable. Тем более нет никакого смысла совать его в виде экспрешена в IQuerable (честно говоря у меня вообще нет понимания, как должен работать IQuerable для Enumerable.Range(0, 10)).
Один из вероятных правильных сценариев:
def Action() : ActionResult
{
def range = Enumerable.Range(0, 10).Select(i => new (i = 10));
viewmodel(range)
}
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Jack128, Вы писали:
J>>Enumerable.Range(0, 10).AsQueryable().Select(ToExpression(fun(i) { viewmodel(i = 10)})); // viewmodal — это макрос из NemerleOnRails http://code.google.com/p/nemerleonrails/source/browse/NRails.Macros/Mvc/ViewModel.n
Z>Так низя. Макрос viewmodel делает тип для конкретной вьюхи. Не никакого смысла делать его IEnemerable. Тем более нет никакого смысла совать его в виде экспрешена в IQuerable (честно говоря у меня вообще нет понимания, как должен работать IQuerable для Enumerable.Range(0, 10)).
да тривиально это работает, все экспрешены компилятся, а получившиеся делегаты отдаются на вход одноименным методам класса Enumerable
Z>Один из вероятных правильных сценариев: Z>
Z>def Action() : ActionResult
Z>{
Z> def range = Enumerable.Range(0, 10).Select(i => new (i = 10));
Z> viewmodel(range)
Z>}
Z>
для данного конкретного макроса вопрос решился, тем не менее интересует вопрос, насколько безопасно на вход одному макросу можно отдавать код, сгенерённый другим макросом.