Re[12]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.10 17:16
Оценка:
Здравствуйте, DarkGray, Вы писали:

S>>Вот тут линк должен очень-очень сильно помочь.


DG>.net-ный linq очень плохо помогает при условных запросах.

DG>когда конечный запрос собирается из кусочков на основе ввода пользователя (например, по каким полям фильтровать и сортировать)

Как раз для таких запросов линк подходит очень хорошо. Мы можем делать примерно так:
var query = from x in xs where x.Prop1 == 123 select x;
var query = condition ? query.Where(x => x.Prop2 == "abc")
                      : query.Where(x => x.Prop3 == "xyz");

При этом генерируется специализированный запрос который работает весьма шустро.

DG>зы

DG>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.

Это все зависит от провайдера. Возьми BLToolkit и у тебя все будет летать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.10 17:40
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>по сравнению с тем, что идея linq может предложить.


DG>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода


Во как? А мужики то и не знали (с). Вот тебе примерчик:

def data = [(2, "xyz"), (1, "abc"), (3, "dfg"), (0, "qwerty")];
def query = data.Where((_, y) => y != "qwerty");
def random = Random(7);

repeat (5)
{
  def query = if (random.Next(2) == 1)  query.OrderBy((x, _) => x) 
              else                      query.OrderByDescending((x, _) => x);
  WriteLine(query.NToList());
}

Выводит:
[(3, dfg), (2, xyz), (1, abc)]
[(1, abc), (2, xyz), (3, dfg)]
[(1, abc), (2, xyz), (3, dfg)]
[(3, dfg), (2, xyz), (1, abc)]
[(3, dfg), (2, xyz), (1, abc)]


Еще раз повторяю линк как раз позволяет очень красиво комбинировать запросы (собирать их из частей). Причем делается это все статически-типизированно и очень удобно.

DG>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)


Какие потоки? Что ты выдумываешь? Лучше пруф-линк дай к своим словам.

Z>> Ну вот еще одна проблема, которую легко решает МП.


DG>так здесь как раз удобны inline-"макросы", которые как раз возвращают несколько выражений


DG>например, можно сделать так:

DG>
DG> world.Managers.MyOrderBy({Name:asc, Money: desc})
DG>

DG>а склейку кортежа сделать доп функциями
DG>при этому MyOrderBy — возвращает последовательность из OrderBy.ThenBy

Это прекрасно делает синтаксическое расширение. Зачем для этого еще макросы городить? Оно конечно в немерле тоже через макрос сделано. Но аналог в шарпе вшит в язык и делает тоже самое.

Тут вопрос в другом. При наличии хорошей макрос-системы не пришлось бы внедрять в язык сам синтаксис.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.12.10 18:02
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода

Сложно написать компарер?

DG>>>зы

DG>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.
Z>>Ну вот еще одна проблема, которую легко решает МП. Впрочем тулкит вроде сам кеширует компилированные запросы.
DG>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)
Каких потоков? провайдеры в одном потоке работают.
На каком-то древнем бенчмарке (не найду ссылку) 50мс удалось получить на 1000 запросов. Те около 50мкс на запрос, это при нетривиальном запросе.
Угадай какой процент от общего времени работы составляет время компиляции Linq в SQL.
Re[23]: Веб и динамика? Веб и статика+метапрограммирование.
От: Кэр  
Дата: 23.12.10 19:00
Оценка: -1 :))) :))
Vlad2, Wolfhound, ну давайте я вам сэкономлю время.

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

Единственная полезная мысль, которая есть в последнем сообщении — это про ограничение синтаксиса. Это выглядит интересно. Все остальное вообще не в канву о том, о чем мы разговарием с Антоном. Если модератор и местный буйный будут продолжать себя вести как капризные дети — я найду другие места, где можно поговорить на технические темы с умными людьми. Dixi.
Re[24]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.10 19:13
Оценка: +2 -1
Здравствуйте, Кэр, Вы писали:

Кэр>Если модератор и местный буйный будут продолжать себя вести как капризные дети — я найду другие места, где можно поговорить на технические темы с умными людьми. Dixi.


Какая утрата для нашего комьюнитии!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Веб и динамика? Веб и статика+метапрограммирование.
От: Кэр  
Дата: 23.12.10 19:20
Оценка: -1 :)
Здравствуйте, VladD2, Вы писали:

VD>Какая утрата для нашего комьюнитии!


Ну если вы отвалите подальше от меня — уже будет полегче
Re[22]: Веб и динамика? Веб и статика+метапрограммирование.
От: yoriсk.kiev.ua  
Дата: 23.12.10 19:36
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Потом ДАЛ — это "ненастоящая" статическая типизация, в том-то и проблема. Сколько раз уже нарывались на то, что кто-нибудь залезет в модель того же Linq2Sql, чего-нибудь там добавит, поправит — и все, рассинхрон. *Без тестов* тоже фиг найдешь ошибку.


А почему вы не генерите dbml при каждом запуске билда на сервере? Будет просто complile error с конкретным указанием что не совпадает без всяких там тестов(точнее компиляция и будет тестом).
Re[15]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.12.10 20:55
Оценка: :)
DG>>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода

VD>Во как? А мужики то и не знали (с). Вот тебе примерчик:


а теперь напиши полный вариант для следующей элементарной задачи:

от пользователя приходит список кортежей для фильтрации и сортировки.
вид кортежа фильтрации:
string field;
string op;
string value;


вид кортежа сортировки:
string field;
bool isAscElseDesc;


пример запроса пользователя:
filters: 
{field:'name', op:'starts', value='василий'}, 
{field:'birthday', op:'>=', value='10.01.1974'}, 
{field:'company', op:'==', value='rsdn'},

orders:
{field:'name', isAscElseDesc:true},
{field:'birthday', isAscElseDesc:false},


зы
в усложненной версии: filter-ы объединяются в группы and/or
filters: 
{op='and'
 {op='or',
   {field:'name', op:'starts', value='василий'}, 
   {field:'name', op:'starts', value='дмитрий'}, 
 }
 {field:'birthday', op:'>=', value='10.01.1974'}, 
 {field:'company', op:'==', value='rsdn'},
}

orders:
{field:'name', isAscElseDesc:true},
{field:'birthday', isAscElseDesc:false},
Re[16]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.12.10 21:11
Оценка: :)
Здравствуйте, DarkGray, Вы писали:

DG>>>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода


VD>>Во как? А мужики то и не знали (с). Вот тебе примерчик:


DG>а теперь напиши полный вариант для следующей элементарной задачи:


DG>от пользователя приходит список кортежей для фильтрации и сортировки.

DG>вид кортежа фильтрации:
DG>
DG>string field;
DG>string op;
DG>string value;
DG>


DG>вид кортежа сортировки:

DG>
DG>string field;
DG>bool isAscElseDesc;
DG>


DG>пример запроса пользователя:

DG>
DG>filters: 
DG>{field:'name', op:'starts', value='василий'}, 
DG>{field:'birthday', op:'>=', value='10.01.1974'}, 
DG>{field:'company', op:'==', value='rsdn'},

DG>orders:
DG>{field:'name', isAscElseDesc:true},
DG>{field:'birthday', isAscElseDesc:false},

DG>


DG>зы

DG>в усложненной версии: filter-ы объединяются в группы and/or
DG>
DG>filters: 
DG>{op='and'
DG> {op='or',
DG>   {field:'name', op:'starts', value='василий'}, 
DG>   {field:'name', op:'starts', value='дмитрий'}, 
DG> }
DG> {field:'birthday', op:'>=', value='10.01.1974'}, 
DG> {field:'company', op:'==', value='rsdn'},
DG>}

DG>orders:
DG>{field:'name', isAscElseDesc:true},
DG>{field:'birthday', isAscElseDesc:false},

DG>


Напиши один раз десериализатор этого json в ET и пользуй.

За 1000 баксов я тебе такой напишу, нужен?

Еще за 1000 напишу сериализатор подмножества ET в такой json.


ЗЫ. Вообще удивляюсь как люди не любят трогать пространство имен System.Linq.Expression можно очень простыми средствами динамическую генерацию кода делать.
Re[15]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.12.10 21:29
Оценка:
DG>>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода
G>Сложно написать компарер?

не сложно. но мы до сих пор говорим про удобную и эффективную среду разработки?

DG>>>>зы

DG>>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.
Z>>>Ну вот еще одна проблема, которую легко решает МП. Впрочем тулкит вроде сам кеширует компилированные запросы.
DG>>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)
G>Каких потоков? провайдеры в одном потоке работают.
G>На каком-то древнем бенчмарке (не найду ссылку) 50мс удалось получить на 1000 запросов. Те около 50мкс на запрос, это при нетривиальном запросе.
G>Угадай какой процент от общего времени работы составляет время компиляции Linq в SQL.

проблема в одном из corner case в linq. а не во всем linq.

вроде бы, что после пересоздания datacontext-а некомпилированный запрос при первом выполнении отжирает 50 мс.

соответственно, если надо сделать 10 разных запросов, то это будет 500мс
Re[17]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.12.10 21:32
Оценка:
G>ЗЫ. Вообще удивляюсь как люди не любят трогать пространство имен System.Linq.Expression можно очень простыми средствами динамическую генерацию кода делать.

сделали так конечно.

меня просто удивляет, что на дворе 21-век, а такая простая задача решается только через громоздкий reflection и громоздкие expression-ы, и не решается средствами языка
Re[16]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.12.10 22:09
Оценка:
Здравствуйте, DarkGray, Вы писали:


DG>>>через linq — даже изменение порядка сортировки делается очень геморройно, т.к. для сортировки используется аж 4 метода

G>>Сложно написать компарер?

DG>не сложно. но мы до сих пор говорим про удобную и эффективную среду разработки?

Да, именно о не и говорим. Мы не говорим что кто-то всю работу сделает за тебя.

DG>>>>>зы

DG>>>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.
Z>>>>Ну вот еще одна проблема, которую легко решает МП. Впрочем тулкит вроде сам кеширует компилированные запросы.
DG>>>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)
G>>Каких потоков? провайдеры в одном потоке работают.
G>>На каком-то древнем бенчмарке (не найду ссылку) 50мс удалось получить на 1000 запросов. Те около 50мкс на запрос, это при нетривиальном запросе.
G>>Угадай какой процент от общего времени работы составляет время компиляции Linq в SQL.

DG>проблема в одном из corner case в linq. а не во всем linq.

DG>вроде бы, что после пересоздания datacontext-а некомпилированный запрос при первом выполнении отжирает 50 мс.
Так это не в Linq а в реализации провайдера. Бери BLToolkit, он всех по производительности в какашки рвет.

DG>соответственно, если надо сделать 10 разных запросов, то это будет 500мс

Не понял, нельзя 10 разных запросов через 1 DataContext?

ЗЫ Видимо ты путаешь с первой загрузкой метаданных. Она выполняется один раз на время жизни процесса.
Re[18]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.12.10 22:12
Оценка:
Здравствуйте, DarkGray, Вы писали:


G>>ЗЫ. Вообще удивляюсь как люди не любят трогать пространство имен System.Linq.Expression можно очень простыми средствами динамическую генерацию кода делать.


DG>сделали так конечно.


DG>меня просто удивляет, что на дворе 21-век, а такая простая задача решается только через громоздкий reflection и громоздкие expression-ы, и не решается средствами языка


А какими средствами языка она должна решаться? По сути ты получаешь строку извне. Дальше ты сам её должен парсить, язык тут не при чем.
Многие фреймворки обеспечивают автоматически парсинг входящих строк. Но так как формат запроса в json ты придумал сам вот и занимайся парсингом сам.
Re[17]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.12.10 22:27
Оценка:
G>Мы не говорим что кто-то всю работу сделает за тебя.

почему нет?

DG>>>>>>зы

DG>>>>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.
Z>>>>>Ну вот еще одна проблема, которую легко решает МП. Впрочем тулкит вроде сам кеширует компилированные запросы.
DG>>>>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)
G>>>Каких потоков? провайдеры в одном потоке работают.
G>>>На каком-то древнем бенчмарке (не найду ссылку) 50мс удалось получить на 1000 запросов. Те около 50мкс на запрос, это при нетривиальном запросе.
G>>>Угадай какой процент от общего времени работы составляет время компиляции Linq в SQL.

DG>>проблема в одном из corner case в linq. а не во всем linq.

DG>>вроде бы, что после пересоздания datacontext-а некомпилированный запрос при первом выполнении отжирает 50 мс.
G>Так это не в Linq а в реализации провайдера. Бери BLToolkit, он всех по производительности в какашки рвет.

DG>>соответственно, если надо сделать 10 разных запросов, то это будет 500мс

G>Не понял, нельзя 10 разных запросов через 1 DataContext?

если запроса определенного вида при первом запуске отжирает 50 мс.
то 10 запросов десяти разных видов отожрут 500мс,
при этом 10 запросов одного вида — отожрут только 50мс
и 1000 запросов одного вида — тоже отожрет только 50 мс (если база локальная, а запрос — маленький).

G>ЗЫ Видимо ты путаешь с первой загрузкой метаданных. Она выполняется один раз на время жизни процесса.


не совсем верно, в linq2sql создается она на каждое создание datacontext-а, но это можно побороть если закэшить MappingSource и передавать его в конструктор datacontext-а

http://blogs.msdn.com/b/gisenberg/archive/2008/05/20/linq-to-sql-optimizing-datacontext-construction-with-the-factory-pattern.aspx

However, constructing a DataContext object is a relatively expensive operation. 99.9% of this performance hit is spent building out the MappingSource object that gets used by your DataContext. Consider that, in a stock scenario, your application goes out and builds out the MappingSource object every single time that the DataContext object is created. Typically, this is something that will happen very frequently.

Re[18]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.12.10 22:50
Оценка:
Здравствуйте, DarkGray, Вы писали:


DG>>>>>>>зы

DG>>>>>еще у нескомпилированного linq на каждый запрос куда-то уходит ровно 50мс, соответственно больше 20 запросов в секунду не сделать.
Z>>>>>>Ну вот еще одна проблема, которую легко решает МП. Впрочем тулкит вроде сам кеширует компилированные запросы.
DG>>>>>может, что-то даже делает, но 50мс никуда не деваются. (четкие 50 мс связаны скорее всего с какими-то потерями на переключение потоков)
G>>>>Каких потоков? провайдеры в одном потоке работают.
G>>>>На каком-то древнем бенчмарке (не найду ссылку) 50мс удалось получить на 1000 запросов. Те около 50мкс на запрос, это при нетривиальном запросе.
G>>>>Угадай какой процент от общего времени работы составляет время компиляции Linq в SQL.

DG>>>проблема в одном из corner case в linq. а не во всем linq.

DG>>>вроде бы, что после пересоздания datacontext-а некомпилированный запрос при первом выполнении отжирает 50 мс.
G>>Так это не в Linq а в реализации провайдера. Бери BLToolkit, он всех по производительности в какашки рвет.

DG>>>соответственно, если надо сделать 10 разных запросов, то это будет 500мс

G>>Не понял, нельзя 10 разных запросов через 1 DataContext?

DG>если запроса определенного вида при первом запуске отжирает 50 мс.

DG>то 10 запросов десяти разных видов отожрут 500мс
DG>при этом 10 запросов одного вида — отожрут только 50мс
DG>и 1000 запросов одного вида — тоже отожрет только 50 мс (если база локальная, а запрос — маленький).
Чушь вообще-то. Как провайдер виды запросов то отличать будет? Он каждый компилирует.

G>>ЗЫ Видимо ты путаешь с первой загрузкой метаданных. Она выполняется один раз на время жизни процесса.


DG>не совсем верно, в linq2sql создается она на каждое создание datacontext-а, но это можно побороть если закэшить MappingSource и передавать его в конструктор datacontext-а

Все равно не пойму где ты 50мс вял, я такого времени на создание DataContext не видел.

DG>http://blogs.msdn.com/b/gisenberg/archive/2008/05/20/linq-to-sql-optimizing-datacontext-construction-with-the-factory-pattern.aspx

DG>

DG>However, constructing a DataContext object is a relatively expensive operation. 99.9% of this performance hit is spent building out the MappingSource object that gets used by your DataContext. Consider that, in a stock scenario, your application goes out and builds out the MappingSource object every single time that the DataContext object is created. Typically, this is something that will happen very frequently.

и? Где ты тут 50мс увидел?
Да и в чет проблема? Пользуйся другими провайдерами.
Re[19]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 23.12.10 23:32
Оценка:
G>А какими средствами языка она должна решаться? По сути ты получаешь строку извне. Дальше ты сам её должен парсить, язык тут не при чем.

строка уже распарсена в последовательность кортежей.

а преобразовать последовательность кортежей в linq-последовательность — это уж точно языковая задача,
и сводится она к понятным примитивным операциям:
получить "ссылку" на поле по имени,
получить операцию по имени,
преобразовать строку в значение типа данного поля,
поле + операцию + значение склеить в выражение,
выражения склеить в where,
where подклеить ко всему linq-у выражению

зы
и речь идет о том, что это должно делаться за минимум действий и наглядный код, а не о том — можно это или нельзя сделать.
то, что на C#(а также на любом другом ЯП) можно решить любую задачу — это не обсуждается, это напрямую следует из полноты по тьюрингу.
Re[16]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 07:44
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>а теперь напиши полный вариант для следующей элементарной задачи:


DG>от пользователя приходит список кортежей для фильтрации и сортировки.

DG>вид кортежа фильтрации:
DG>
DG>string field;
DG>string op;
DG>string value;
DG>


DG>вид кортежа сортировки:

DG>
DG>string field;
DG>bool isAscElseDesc;
DG>


DG>пример запроса пользователя:

DG>
DG>filters: 
DG>{field:'name', op:'starts', value='василий'}, 
DG>{field:'birthday', op:'>=', value='10.01.1974'}, 
DG>{field:'company', op:'==', value='rsdn'},

DG>orders:
DG>{field:'name', isAscElseDesc:true},
DG>{field:'birthday', isAscElseDesc:false},
DG>


А за каким хреном надо было преобразовывать действия в текстовую форум? Просто формируй свои действия сразу в виде запросов и делать ничего не придется.

В худшем случае, если оставить текстовое представление, придется завести хэш-таблицу в которой смапить кортеж field * op (и field * isAscElseDesc) на соответствующую лямбду. Вот рабочий код для добавления сортировки (фильтрация делается аналогичным образом):
using Nemerle.Collections;

using System;
using System.Collections.Generic;
using System.Console;
using System.Linq;

[Record]
class Person
{
  public Name     : string;
  public Birthday : DateTime;
  public Company  : string;
  
  public override ToString() : string
  {
      $"Person: $Name, $Birthday, $Company"
  }
}

module Program
{
  data : list[Person] = 
    [
      Person("Вася", DateTime(1976, 5, 15), "RSDN"),
      Person("Петя", DateTime(1967, 3, 1), "Мега"),
      Person("Петя", DateTime(1981, 1, 5), "Мега"),
      Person("Петя", DateTime(1953, 1, 12), "Мега"),
      Person("Аня", DateTime(1981, 12, 21), "Мега"),
      Person("Дуня", DateTime(1982, 12, 21), "Мега"),
    ];

  Main() : void
  {
    def myQuery = data.Where(p => p.Birthday < DateTime(1982, 1, 1)); // эмулируем основной запрос.
    
    // orderingInfos содержит кортежи описывающие сортировки. По уму вместо 
    // текстового представления здесь нужно было сразу использовать список 
    // функций-преобразователей запросов.
    def orderingInfos = [("name", true), ("birthday", false)];
    
    def orderedMyQuery = OrderingInfosToQuery(myQuery, orderingInfos);
    //orderedQuery // теперь мы имеем запрос к которому добавлены нужные методы сортировки
    WriteLine($<#..$(orderedMyQuery; "\n")#>); // выводим результат на консоль разделяя строки переносом строки
   _ = ReadLine();
  }

    // Функция пребразования списка кортежей описывающих сортировк в запрос.
    OrderingInfosToQuery(query : IEnumerable[Person], orderingInfos : list[string * bool]) : IEnumerable[Person]
    {
      def map = Hashtable();
      // map отображает один кортеж описывающий сортировку на функцию 
      // добавляющую эту сортировку к запросу. Функция принимает IEnumerable,
      // но ничто не мешает использовать и IQueryble.
      map["name",     true]  = (query : IEnumerable[Person]) => query.OrderBy(_.Name);
      map["birthday", false] = (query : IEnumerable[Person]) => query.OrderByDescending(_.Birthday);
      //...
      def addOrdering(orderingInfo, query)
      {
        def addOrder = map[orderingInfo]; // получаем функцию добавляющую к запросу сортировку
        def newQuery = addOrder(query); // трансформируем запрос
        newQuery
      }
      def orderedQuery = orderingInfos.FoldLeft(query, addOrdering);
      orderedQuery
    }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 07:58
Оценка: -1 :)
Здравствуйте, gandjustas, Вы писали:

G>Напиши один раз десериализатор этого json в ET и пользуй.


G>За 1000 баксов я тебе такой напишу, нужен?


Кто же тебе даст 1000 за работу которую тот же Ziaw уже проделал
Автор: Ziaw
Дата: 10.12.10
?
Впрочем, спасибо! Это прикольная оценка того насколько ты дорого обходишься своей компании.
Вот смотри. Написать парсер JSON-а у Ziaw заняло около 3 часов (это без опыта использования парсера).
Чтобы написать преобразователь из кортежей в ЛИНК у меня ушло 20 минут.
Умножим это дело на 2 чтобы получить время с разными заморочками которые обычно встречаются на практике.
Итого мы получаем 8 рабочих часов. Твоя оценка этой работы 1000 долларов. Стало быть, если бы ты работал с нашей производительностью турда, то получал бы 20 000 долларов в месяц.
Уверен, что тебе столько не платят. Значит ты работаешь значительно медленнее. Если предположить, что ты получаешь около 80 000 рублей в месяц, то не трудно рассчитать, что на эту работу по твоим (скорее всего очень скромным) прикидкам ты оценил эту работу в неделю.

Вот тебе и ответ на вопрос зачем нужен немерле! Затем что люди его использующие в разы продуктивнее. И дело даже не в самом языке, а в том, что эти люди получают значительный опыт.

Вот такие пироги с котятами .

G>Еще за 1000 напишу сериализатор подмножества ET в такой json.


Ужас!

G>ЗЫ. Вообще удивляюсь как люди не любят трогать пространство имен System.Linq.Expression можно очень простыми средствами динамическую генерацию кода делать.


Удивительно другое... Вы не знаете толком даже те средства которые используете на практике (C#), но умудряетесь с пеной у рта очернять те технологии которые вы изучили намного более посредственно. Это не только удивляет, но и удручает .

ЗЫ

Ребята, заканчивайте нести тут околесицу. Лучше потратьте время на изучение того с чем боретесь. Я вам гарантирую, что ваш скил программиста от этого не только не пострадает, но и резко повысится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.12.10 08:30
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Напиши один раз десериализатор этого json в ET и пользуй.


G>>За 1000 баксов я тебе такой напишу, нужен?


VD>Кто же тебе даст 1000 за работу которую тот же Ziaw уже проделал
Автор: Ziaw
Дата: 10.12.10
?

Уже проделал говоришь?

По просьбе трудящихся выложил наброски будущей либы по работе с джейсоном.


Кстати в .NET FW есть DataContractJsonSerializer, который делает угадай что.

VD>Впрочем, спасибо! Это прикольная оценка того насколько ты дорого обходишься своей компании.

Я уже давно на себя работаю.

VD>Вот смотри. Написать парсер JSON-а у Ziaw заняло около 3 часов (это без опыта использования парсера).

VD>Чтобы написать преобразователь из кортежей в ЛИНК у меня ушло 20 минут.
VD>Умножим это дело на 2 чтобы получить время с разными заморочками которые обычно встречаются на практике.
VD>Итого мы получаем 8 рабочих часов. Твоя оценка этой работы 1000 долларов. Стало быть, если бы ты работал с нашей производительностью турда, то получал бы 20 000 долларов в месяц.
Ох как не хочется про бизнес тебе рассказывать.

VD>Уверен, что тебе столько не платят.

И больше платят


VD>Удивительно другое... Вы не знаете толком даже те средства которые используете на практике (C#), но умудряетесь с пеной у рта очернять те технологии которые вы изучили намного более посредственно. Это не только удивляет, но и удручает .

Датыче? С чего ты взял что я толком чего-то не знаю?
Re[20]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.12.10 08:55
Оценка: +1
Здравствуйте, DarkGray, Вы писали:

G>>А какими средствами языка она должна решаться? По сути ты получаешь строку извне. Дальше ты сам её должен парсить, язык тут не при чем.


DG>строка уже распарсена в последовательность кортежей.


DG>а преобразовать последовательность кортежей в linq-последовательность — это уж точно языковая задача,

DG>и сводится она к понятным примитивным операциям:

DG>получить "ссылку" на поле по имени,

Одна строка

var prop = Expression.Property(p, name)


DG>преобразовать строку в значение типа данного поля,

Одна строка
var value = Expression.Constant(Convert.ChangeType(s, p.Type));


DG>получить операцию по имени,

DG>поле + операцию + значение склеить в выражение,
Одна строка
var e = opTable[op](prop, value);




DG>выражения склеить в where,

Одна строка
var lambda = Expression.Lambda(typeof(Func<,>).MakeGenericType(new [] {p.Type, typeof(bool)}), e, p);


DG>where подклеить ко всему linq-у выражению

Одна строка
var query = whereMethod.MakeGenericMethod(new[] {p.Type});


В итоге 5 строк кода + лукап таблица + 4-5 строк для инициализации.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.