Re[19]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 08:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


Да, проделал.

G>

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


Это он от скромности написал. Библиотека вполне рабочая.

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


Это не кого не трогает. Ты оценил работу в 1000 долларов.

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

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

Это без разницы. Страдает не работодатель, так клиенты.

G>Ох как не хочется про бизнес тебе рассказывать.


Да, да. Тут ты совершенно прав. Не учи отца е.....я.

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

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

Да ты успешный бизнесмен! Что ты делаешь в форуме для программистов?

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

G>Датыче? С чего ты взял что я толком чего-то не знаю?

Дык ты сам всем только что это изложил оценив работу цена которой баксов 100 в 1000.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.12.10 09:00
Оценка:
Здравствуйте, VladD2, Вы писали:

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

G>>Я уже давно на себя работаю.
VD>Это без разницы. Страдает не работодатель, так клиенты.
Кто тебе сказал что страдают клиенты?

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

G>>Датыче? С чего ты взял что я толком чего-то не знаю?
VD>Дык ты сам всем только что это изложил оценив работу цена которой баксов 100 в 1000.
Re[19]: Веб и динамика? Веб и статика+метапрограммирование.
От: Ziaw Россия  
Дата: 24.12.10 09:03
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Да и в чет проблема? Пользуйся другими провайдерами.


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

Что было сказано?

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


Что будет делать средний рсдновец, если указал на факт, но люди усомнились? Напишет тест, по результатам либо извинится, что ляпнул глупость либо докажет свою правоту в этом вопросе. Но DarkGray не из таких.
Re[30]: Веб и динамика? Веб и статика+метапрограммирование.
От: Ziaw Россия  
Дата: 24.12.10 09:12
Оценка:
Здравствуйте, DarkGray, Вы писали:

Z>>А от тебя я все еще жду реальные примеры применения МП. Ведь у тебя множество исследовательских проектов применяющих МП. Не обязательно код, у тебя же наверняка NDA Просто проблема, способ решения.


DG>

DG>проблема:
DG>в стандартной трехзвенке — для описания бизнес-логики приходится использовать три с половиной языка: c#, sql, js и xpath
DG>решение:
DG>введение единого языка для описания бизнес-логики — который транслируется во все эти три с половиной языка


DG>

DG>проблема:
DG>последовательная-синхронная запись — подвешивает программу на операциях коммуникации с внешними источниками и длительных вычислениях.
DG>запись в виде cps — сложна в понимании, изменении и поддержке.

DG>решение:
DG>код записывается как последовательный-синхронный, но автоматически преобразуется в cps


DG>

DG>проблема:
DG>удобная объектно-ориентированная запись бизнес-логики приводит к большому кол-ву запросов к базе

DG>решение:
DG>поддержка двухфазной модели выполнения бизнес-логики:
DG>на первой фазе пробегом по дереву БЛ определяется какие данные она требует и склеивание в единый запрос, данные запрашиваются и складываются в кэш
DG>на второй фазе — БЛ исполняется поверх кэша


Гениально! Имея рабочий прототип решения этих задач можно смело выбивать миллионные гранты из MS Research. Они бедные над удобным синтаксисом распараллеливания бьются-бьются. Можно оказывается забить и писать как синхронный, который потом сам заработает асинхронно.

Признаю, я не дорос до твоего уровня, сливаюсь.
Re[17]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.12.10 09:25
Оценка: -1
VD>А за каким хреном надо было преобразовывать действия в текстовую форум? Просто формируй свои действия сразу в виде запросов и делать ничего не придется.

потому что они из браузера такие приходят.

VD>В худшем случае, если оставить текстовое представление, придется завести хэш-таблицу в которой смапить кортеж field * op (и field * isAscElseDesc) на соответствующую лямбду.

VD> Вот рабочий код для добавления сортировки (фильтрация делается аналогичным образом):

вот только он неправильный, и сортировка будет всегда по последнему кортежу: потому что orderby и thenby это не одно и тоже.

сложные вещи ты обошел:
преобразованием значения из строки в тип поля — не привел.

код с восстановлением операции по строке — тоже не привел.
Re[21]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 09:31
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Кто тебе сказал что страдают клиенты?


Логика. Когда исполнитель оценивает работу ~ в 10 раз дороже ее реальной стоимости, клиент от этого не может не страдать.

VD>>Дык ты сам всем только что это изложил оценив работу цена которой баксов 100 в 1000.

G>

Да — это очень смешно. Может ты и хороший бизнесмен (у меня нет данных, чтобы утверждать обратное), но программисты ты средний (это я могу утверждать точно). Зато горлопанишь так как-будто ты матерый профи.

Задача которую ты оценил в 1000 долларов решается на коленке за пол часа
Автор: VladD2
Дата: 24.12.10
. Никаких страшных конвертеров для этого писать не надо. Ты просто выбрал неверную реализацию. Я за время пока с тобой разговраиваю, еще успел баг в другом приложении пофиксить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Веб и динамика? Веб и статика+метапрограммирование.
От: Ziaw Россия  
Дата: 24.12.10 09:39
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


G>

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


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


Делает она не совсем то. Основное предназначение либы — работа с джейсоном, структура которого в компайлтайме либо не известна либо известна только частично.

Про наброски я не из скромности, как предположил Влад, а потому, что мою задачу либа пока решает недостаточно хорошо. Но как генератор и парсер джейсона вполне рабочая.

Сериализация у меня на последнем месте в приоритетах, просто потому, что не нужна пока.
Re[18]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 10:16
Оценка:
Здравствуйте, DarkGray, Вы писали:


VD>>В худшем случае, если оставить текстовое представление, придется завести хэш-таблицу в которой смапить кортеж field * op (и field * isAscElseDesc) на соответствующую лямбду.

VD>> Вот рабочий код для добавления сортировки (фильтрация делается аналогичным образом):

DG>вот только он неправильный, и сортировка будет всегда по последнему кортежу: потому что orderby и thenby это не одно и тоже.


Да, согласен. Это я упустил из виду.
Но учесть это не так сложно. Нужно создать еще один map в который заполнить преобразованием в ThenBy. Далее первый элемент кортежа обрабатывать по первому map-у, а остальные по второму.

DG>сложные вещи ты обошел:

DG>преобразованием значения из строки в тип поля — не привел.

Что тут сложного? Типы полей известны? Известны! Так что все сводится к такому же отображению на функции string -> TypeOfField.

DG>код с восстановлением операции по строке — тоже не привел.


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

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


G>>Кто тебе сказал что страдают клиенты?

VD>Логика. Когда исполнитель оценивает работу ~ в 10 раз дороже ее реальной стоимости, клиент от этого не может не страдать.
Тебе не понять. Продается не "работа", а "решение проблем". Второе стоит гораздо дороже. Но тебе видимо не понять.
Ты ведь оцениваешь работу опираясь на то что ты уже умеешь и знаешь, а для человека, который не умеет и не знает подобная работа будет иметь гораздо большую стоимость.
Короче тебе не понять и мы сильно уходим от темы.

VD>>>Дык ты сам всем только что это изложил оценив работу цена которой баксов 100 в 1000.

G>>

VD>Да — это очень смешно. Может ты и хороший бизнесмен (у меня нет данных, чтобы утверждать обратное), но программисты ты средний (это я могу утверждать точно). Зато горлопанишь так как-будто ты матерый профи.

Может сразу достанем линейки?

VD>Задача которую ты оценил в 1000 долларов решается на коленке за пол часа
Автор: VladD2
Дата: 24.12.10
. Никаких страшных конвертеров для этого писать не надо. Ты просто выбрал неверную реализацию. Я за время пока с тобой разговраиваю, еще успел баг в другом приложении пофиксить.

Ну ладно, достанем линейки. Я успел два проекта закрыть за время этого обсуждения и че?
Re[20]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.12.10 10:31
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


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


G>>

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


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


Z>Делает она не совсем то. Основное предназначение либы — работа с джейсоном, структура которого в компайлтайме либо не известна либо известна только частично.


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

Парсер из чего во что?
Для парсинга на выходе должен быть конкретный тип, какой у тебя используется?
Re[21]: Веб и динамика? Веб и статика+метапрограммирование.
От: Ziaw Россия  
Дата: 24.12.10 10:35
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Парсер из чего во что?

G>Для парсинга на выходе должен быть конкретный тип, какой у тебя используется?

Аст джейсона. Который в свою очередь можно конструировать через макрос json.
Re[30]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 16:51
Оценка:
Здравствуйте, DarkGray, Вы писали:

У меня вопрос к Синклеру за что ты на этот набор букв оценку поставил?

Или тебя тоже завораживает набор терминов за уши притянутый к МП?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 16:59
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Ты ведь оцениваешь работу опираясь на то что ты уже умеешь и знаешь, а для человека, который не умеет и не знает подобная работа будет иметь гораздо большую стоимость.


Человек которому ты тут пытался продать решение не только у тебя не купит твою работу, но будет с пеной у рта отрицать саму возможность ее решения описанным тобой образом.

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

Заметь, ты против макросов, но сам предлагаешь решение основанное на мета-программировнии, что по сути те же макросы только в профиль. И это при том, что есть более простое решение без макросов.

G>Короче тебе не понять и мы сильно уходим от темы.


Со вторым согласен, первое меня не колышет.

G>Может сразу достанем линейки?


Лучше предмет измерения .

VD>>Задача которую ты оценил в 1000 долларов решается на коленке за пол часа
Автор: VladD2
Дата: 24.12.10
. Никаких страшных конвертеров для этого писать не надо. Ты просто выбрал неверную реализацию. Я за время пока с тобой разговраиваю, еще успел баг в другом приложении пофиксить.

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

Чё, разоряешься?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Веб и динамика? Веб и статика+метапрограммирование.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.12.10 17:31
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Ты ведь оцениваешь работу опираясь на то что ты уже умеешь и знаешь, а для человека, который не умеет и не знает подобная работа будет иметь гораздо большую стоимость.


VD>Человек которому ты тут пытался продать решение не только у тебя не купит твою работу, но будет с пеной у рта отрицать саму возможность ее решения описанным тобой образом.

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

То есть ты за компайл-тайм генерацию, но против рантайм генерации? Ты сам проявляешь блабнутость по полной программе.

Кстати я для решения задачи не предлагал заниматься кодогенерацией вообще. Я предлагал использовать System.Linq.Expression и говорил про еще одно полезное применение.

VD>Заметь, ты против макросов, но сам предлагаешь решение основанное на мета-программировнии, что по сути те же макросы только в профиль. И это при том, что есть более простое решение без макросов.

А я тебе говорил что я против макросов? Я все время говорил что
а)"это из пушки по воробъям" (с) ты сам признал это выше
б)требуется изучение нового фреймворка с AST компилятора, заместо уже известного мне System.Linq.Expression, а у меня тупо нет времени

VD>>>Задача которую ты оценил в 1000 долларов решается на коленке за пол часа
Автор: VladD2
Дата: 24.12.10
. Никаких страшных конвертеров для этого писать не надо. Ты просто выбрал неверную реализацию. Я за время пока с тобой разговраиваю, еще успел баг в другом приложении пофиксить.

G>>Ну ладно, достанем линейки. Я успел два проекта закрыть за время этого обсуждения и че?
VD>Чё, разоряешься?
Нет, НГ на носу, все хотят закрыть хвосты и я некоторый "бонус" себе получил.
Re[19]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.12.10 18:57
Оценка:
VD>В нем ничего нового не будет. Такое же отображение.
VD>Я же тебе не нанимался за тебя программы писать?

позиционировалось, что немерле МП-задачи позволит решать за пару копеек.

преобразование фильтрующего-выражение из текстовой формы в код, это копеечная задача.
и это именно МП: есть программа в текстовом виде, есть программа в виде C# — одну программу надо преобразовать в другую.

при чем проблема, что основные временные затраты уходят на борьбу с кодом:
то, что order-by выражется четырьмя методами.
то что для конвертации из строки в объект — для каждого типа необходимо вызвать разные методы,
одна и та же операция, но для разных типов — это тоже разные методы
и т.д.
Re[18]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 19:19
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>вот только он неправильный, и сортировка будет всегда по последнему кортежу: потому что orderby и thenby это не одно и тоже.


DG>сложные вещи ты обошел:

DG>преобразованием значения из строки в тип поля — не привел.

DG>код с восстановлением операции по строке — тоже не привел.


Убил еще час времени чтобы создать полный рабочий вариант воспроизводящий твое т.з.
Интересно как ты теперь будешь выкручиваться? Просто сделаешь вид, что не заметил ответ или найдешь фатальный недостаток?
using Nemerle.Collections;

using System;
using System.Collections.Generic;
using System.Console; // В Nemerle можно открывать не только пространства имен, но и классы!
using System.Linq;

using PersonQuery; // В Nemerle можно открывать не только пространства имен, но и классы!

[Record] // Этот макрос генерирует коструктор инициализирующий все поля класса
class Person
{
  public Name     : string;
  public Birthday : DateTime;
  public Company  : string;
  
  public override ToString() : string
  { // $-строка - это песня! :)
    $"Person: $Name, $(string(' ', 4 - Name.Length)) $(Birthday.ToShortDateString()), $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 print(query, msg)
    {
      WriteLine($"$msg:");
      WriteLine($<#..$(query; "\n")#>);
      WriteLine();
    }
    
    def myQuery = data.Where(p => p.Birthday < DateTime(1982, 1, 1)); // эмулируем основной запрос.
    print(myQuery, "Исходный запрос");
    
    def orderingInfos = [("name", true), ("birthday", false)];
    def filterInfos = [("name", "starts", "Пе"), ("birthday", ">=", "10.01.1955")];
    
    def filteredQuery = FilterInfoToQuery(myQuery, filterInfos);
    print(filteredQuery, "После добавления фильтра");

    def orderedMyQuery = OrderingInfosToQuery(filteredQuery, orderingInfos);
    print(orderedMyQuery, "После добавления сортировки");

    def orderedMyQuery2 = OrderingInfosToQuery(myQuery, orderingInfos);
    print(orderedMyQuery2, "После добавления сортировки к исходному запросу (демонстрирвет, что сортировка производится по двум полям)");
   _ = ReadLine();
  }
}

/// Модуль предоставляющий функции конвертации опписаний заданных в виде
/// в соответствующие кобмбинатроные функции.
module PersonQuery
{
  // Таблицы отображения.
  _personFieldOperMap : Hashtable[string * string, Person * string -> bool];
  _orderFirstMap  : Hashtable[string * bool, IEnumerable[Person]        -> IOrderedEnumerable[Person]];
  _orderFollowMap : Hashtable[string * bool, IOrderedEnumerable[Person] -> IOrderedEnumerable[Person]];
  
  this()
  {
    // Заполняем таблицы отображения...
    // Вот эту хрень любо-дорого заполнить на макросах!
    
    _personFieldOperMap = Hashtable();
    _personFieldOperMap["birthday", ">="]     = (p, value) => p.Birthday >= DateTime.Parse(value);
    _personFieldOperMap["birthday", "=="]     = (p, value) => p.Birthday == DateTime.Parse(value);
    _personFieldOperMap["birthday", "<="]     = (p, value) => p.Birthday <= DateTime.Parse(value);
    _personFieldOperMap["company",  "=="]     = (p, value) => p.Company == value;
    _personFieldOperMap["company",  "starts"] = (p, value) => p.Company.StartsWith(value);
    _personFieldOperMap["name",     "=="]     = (p, value) => p.Name == value;
    _personFieldOperMap["name",     "starts"] = (p, value) => p.Name.StartsWith(value);

    _orderFirstMap = Hashtable();
    _orderFirstMap["name",     true]  = query => query.OrderBy(_.Name); // "_.Name" - это синтаксис частичного применения. Это аналогично коду "p => p.Name"
    _orderFirstMap["name",     false] = query => query.OrderByDescending(_.Name);
    _orderFirstMap["birthday", true]  = query => query.OrderBy(_.Birthday);
    _orderFirstMap["birthday", false] = query => query.OrderByDescending(_.Birthday);
    _orderFirstMap["company",  true]  = query => query.OrderBy(_.Company);
    _orderFirstMap["company",  false] = query => query.OrderByDescending(_.Company);

    _orderFollowMap = Hashtable();
    _orderFollowMap["name",     true]  = query => query.ThenBy(_.Name);
    _orderFollowMap["name",     false] = query => query.ThenByDescending(_.Name);
    _orderFollowMap["birthday", true]  = query => query.ThenBy(_.Birthday);
    _orderFollowMap["birthday", false] = query => query.ThenByDescending(_.Birthday);
    _orderFollowMap["company",  true]  = query => query.ThenBy(_.Company);
    _orderFollowMap["company",  false] = query => query.ThenByDescending(_.Company);
  }

  /// Формирует LINQ-запрос фильтрующий данные в исходном запросе.
  /// query - исходный запрос.
  /// filteringInfos - список котежей описывающих фильрацию. 
  ///   Первое поле - имя поля в Person. 
  ///   Второе поле - бинарный оператор используемый для создания фильтрующего предиката.
  ///   Третье поле - значение используемое для сравнения (в предикате).
  public FilterInfoToQuery(query : IEnumerable[Person], filteringInfos : list[string * string * string]) : IEnumerable[Person]
  {
    def addFilter((field, op, value), query)
    {
      def predicate = _personFieldOperMap[field, op];
      query.Where(predicate(_, value))
    }

    filteringInfos.FoldLeft(query, addFilter) // производим свертку filteringInfos и формирование запроса
  }

  /// Формирует LINQ-запрос сортирующий данные в исходном запросе.
  /// query - исходный запрос.
  /// orderingInfos - список котежей описывающих сортировку. 
  ///   Первое поле - имя поля в Person. 
  ///   Второе поле - сортировка по возрастанию (true) или убыванию (false).
  public OrderingInfosToQuery(query : IEnumerable[Person], orderingInfos : list[string * bool]) : IEnumerable[Person]
  {
    def addOrdering(orderingInfo, query)
    {
      def addOrder = _orderFollowMap[orderingInfo]; // получаем функцию добавляющую к запросу сортировку
      def newQuery = addOrder(query); // трансформируем запрос
      newQuery
      // Разбиение на стадии и использование промежуточных переменных сделаны
      // чтобы более наглядно продемонстрировать, что делает этот метод.
      // Код этого метода вполне можно было бы записать в одну строку:
      // _orderFollowMap[orderingInfo](query)
    }
    
    def orderedQuery = 
      match (orderingInfos)
      {
        | [] => query // в случае пустого списка фильтрации возвращ исходный запрос.
        | [first] => _orderFirstMap[first](query) // если в списке только один элемент, добавляем тольтко OrderBy
        | first :: tail => tail.FoldLeft(_orderFirstMap[first](query), addOrdering) // иначе добавляем OrderBy для первого элемента и ThenBy для последующих.
      };
    
    orderedQuery // Возвращаем сформированный запрос как возвращаемое значение функции.
  }
}


Консольный вывод:
Исходный запрос:
Person: Вася,  15.05.1976, RSDN
Person: Петя,  01.03.1967, Мега
Person: Петя,  05.01.1981, Мега
Person: Петя,  12.01.1953, Мега
Person: Аня,   21.12.1981, Мега

После добавления фильтра:
Person: Петя,  01.03.1967, Мега
Person: Петя,  05.01.1981, Мега

После добавления сортировки:
Person: Петя,  05.01.1981, Мега
Person: Петя,  01.03.1967, Мега

После добавления сортировки к исходному запросу (демонстрирвет, что сортировка производится по двум полям):
Person: Аня,   21.12.1981, Мега
Person: Вася,  15.05.1976, RSDN
Person: Петя,  05.01.1981, Мега
Person: Петя,  01.03.1967, Мега
Person: Петя,  12.01.1953, Мега


К слову, о том где действительно рулит MP в виде макросов. Создание модулей вроде PersonQuery можно легко автоматизировать с помощью макросов. На вход он может получать описание класса, а на выходе выдавать модуль ИмяКлассаQuery содержащий все нужные вспомогательные методы. При этом можно даже генерировать как IEnumerable- и IQueryable-версию модуля.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Веб и динамика? Веб и статика+метапрограммирование.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.12.10 19:33
Оценка:
G>
G>var prop = Expression.Property(p, name)
G>


в общем виде — лучше PropertyOrField

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

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



      foreach (var pair in new[] 
      {
       //основные типы используемые при хранении данных
        new {type = typeof(string), value = "x"},
        new {type = typeof(int), value = "123"},
        new {type = typeof(double), value = "12.34"},
        new {type = typeof(double), value = "12,34"},
        new {type = typeof(bool), value = "true"},
        new {type= typeof(DateTime), value = "12.10.2010"},
        new {type = typeof(Guid), value = Guid.NewGuid().ToString()},
        new {type = typeof(TimeSpan), value = "12:11"}
      })
      {
        try
        {
          Console.WriteLine(Convert.ChangeType(pair.value, pair.type));
        }
        catch (Exception exc)
        {
          Console.WriteLine("error");
        }
      }

x
123
error
12,34
True
12.10.2010 0:00:00
error
error




G>В итоге 5 строк кода + лукап таблица + 4-5 строк для инициализации.


в реальности там ближе к строкам 100, если поддержать все нюансы.
но согласен, решение будет именно таким.

но есть следующие моменты:
1. сгенерить текстовый sql заняло бы меньше кода
2. вся проверки валидности выражения будут все равно на этапе runtime-а (так же как и для текстового sql), а не компиляции (хотя на этапе компиляции неизвестен только какой конкретно тип поля будет, но при этом известно множество типов, которые должны быть поддержаны, и что тип свойства, операции и значения — должен биться и т.д.)
3. большой разрыв между обычным кодом, и кодом генеренным. достаточно сложно переходить от одного к другому и обратно, использовать совместно и т.д.
Re[20]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 20:22
Оценка:
Здравствуйте, DarkGray, Вы писали:

VD>>В нем ничего нового не будет. Такое же отображение.

VD>>Я же тебе не нанимался за тебя программы писать?

DG>позиционировалось, что немерле МП-задачи позволит решать за пару копеек.


Это не задача для МП. И пишется это решение за час-другой.
Макросы позволяют автоматизированно генерировать.
В прочем, я напрягся (хотя после работы устал очень) и сделал тебе полную реализацию
Автор: VladD2
Дата: 24.12.10
.
Без макросов правда, но зато пример демонстрирует комбинаторные возможности немерла. Думаю, не ты один не понимаешь, что подобное возможно. Так что будет хорошим примером для новичков. Да и C#-щикам полезным будет. На шарпе конечно не так лаконично получится, но на нем этот код так же можно повторить.

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

DG>и это именно МП: есть программа в текстовом виде, есть программа в виде C# — одну программу надо преобразовать в другую.

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

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

DG>то, что order-by выражется четырьмя методами.

Ты недавно утверждал, что задача вообще не решается средствами линка.
Ну хотя бы раз признай что ты не пав.

Наличие OrderBy и ThenBy конечно несколько неудобно в таком сценарии использования, но совершенно не критично. Как раз чтобы скрыть эти неудобства и можно было бы использовать макры.

DG>то что для конвертации из строки в объект — для каждого типа необходимо вызвать разные методы,

DG>одна и та же операция, но для разных типов — это тоже разные методы
DG>и т.д.

Ну, ежу понятно. Еще нужна ассоциация между полем и типом (в строках то этой информации нет), и описание доступных операторов для каждого типа (а то и для каждого из полей). Но все это решаемые вопросы если ты хорошо владеешь простым приемом комбинирования функций.

ЗЫ

Я уже запасся покровном и готов с увлечением смотреть как ты будешь выкручиваться на этот раз!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 20:27
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Что будет делать средний рсдновец, если указал на факт, но люди усомнились? Напишет тест, по результатам либо извинится, что ляпнул глупость либо докажет свою правоту в этом вопросе. Но DarkGray не из таких.


Справидливости ради надо заметить, что есть ряд завсегдатых РСДН-а которые ни при каких условиях не признают свою неправоту. Я раньше тоже таким был, но понял, что это глупо. Если доводы оппонента корректы и они ломают твою логику, значит у тебя не верные посылки. И их нужно менять. Иначе можно верить в разные мифы.

Но таких людей много. От того и возникают вопросы вроде "дотнет тормоз", "в немерле ничего нет" и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Веб и динамика? Веб и статика+метапрограммирование.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.12.10 20:42
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


Я не вижу связи между твоим утверждением и моими словами, но на вопрос охотно отвечу.

1. Я против любой генерации кода, если на это нет разумных доводов.
2. Если есть решение проблемы без МП (метапрограммирования), и оно не уступает по значимым для нас характеристикам МП-решению, то я однозначно выберу решение без МП. МП создает дополнительный уровень абстракции, а абстракция хороша только там где она помогает решать проблемы. Влепливание уровня абстракции без особой нужды — это усложнение проекта без получения от этого бенефитов.
3. Я считаю, что если если есть выбор между МП во время компиляции/разработки или МП в рантайме, то лучшим выбором будет МП времени компиляции, так как это позволит избежать излишней динамики, а значит раньше выявлять ошибки, переложить массу вычислений на время компиляции и т.п. Скажу больше. Если нет возможности использовать МП времени компиляции, то зачастую остается возможность использовать МП времени развертывания. Это так же лучше чем МП в рантайме. Ну, и если не остается ничего друго, то допустимо и МП в рантайме. Но при этом нужно быть уверенным, что все другие методы хуже по тем или иным причинам.


G>То есть ты за компайл-тайм генерацию, но против рантайм генерации? Ты сам проявляешь блабнутость по полной программе.


Я предпочитаю первое второму. Практика показывает, что при правильной постановки задачи, почти все задачи удается свести к МП времени компиляции. Иначе я бы и не занимался немерлом. В прочем, Немерл не ограничен времени компиляции. Компилятор немерла является компонентом и его легко можно запускать в рантайме. Деревья выражений и другую технику тоже никто не отменял, конечно же. Я рассматриваю их все, с учетом приоритетов озвученных ранее.

G>Кстати я для решения задачи не предлагал заниматься кодогенерацией вообще. Я предлагал использовать System.Linq.Expression и говорил про еще одно полезное применение.


В некоторых случая — да. Но если задача решается применением комбинаторов
Автор: VladD2
Дата: 24.12.10
и такое решение не имеет нежелательных побочных эффектов, то я предпочту комбинаторы.

VD>>Заметь, ты против макросов, но сам предлагаешь решение основанное на мета-программировнии, что по сути те же макросы только в профиль. И это при том, что есть более простое решение без макросов.

G>А я тебе говорил что я против макросов?

Да, не раз. Но если ты изменил мнение, то наши позиции сближаются.

G>Я все время говорил что

G>а)"это из пушки по воробъям" (с) ты сам признал это выше

Ссылку в студию.

G>б)требуется изучение нового фреймворка с AST компилятора, заместо уже известного мне System.Linq.Expression, а у меня тупо нет времени


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

VD>>>>Задача которую ты оценил в 1000 долларов решается на коленке за пол часа
Автор: VladD2
Дата: 24.12.10
. Никаких страшных конвертеров для этого писать не надо. Ты просто выбрал неверную реализацию. Я за время пока с тобой разговраиваю, еще успел баг в другом приложении пофиксить.

G>>>Ну ладно, достанем линейки. Я успел два проекта закрыть за время этого обсуждения и че?
VD>>Чё, разоряешься?
G> Нет, НГ на носу, все хотят закрыть хвосты и я некоторый "бонус" себе получил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.