Re[3]: чем плохи шаблоны?
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.12 23:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вообще то сделали на спирит. Правда дефакто не более чем демонстрация принципиальной возможности


Демонстрация отличается от реальной реализации примерно так же как теория от практики .

Ради прикола сравни говногод который у них получился с вот этим. И, как говорится, почувствуйте разницу. А когда заработает ParserGenerator, как следует, разговоры о Спирите даже смешными не будут казаться. Шутка ли? Полностью декларативный парсер с возможностью динамического расширения да еще и рвущий лучше генераторы парсеров написанных на С++ по скорости. Примерчик использования.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: чем плохи шаблоны?
От: CodingUnit Россия  
Дата: 05.02.12 07:18
Оценка: +1
Здравствуйте, Alexey F, Вы писали:

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


AF>Итааак...


>>А как запустить шаблон из шаблона, с новыми аргументами?

AF>Это я уже показал: http://rsdn.ru/forum/nemerle/4603395.1.aspx
Автор: Alexey F
Дата: 04.02.12


Да, алгоритм вам удался, получаются многие алгоритмы на шаблонах, но до каких же извращений вы дошли ребята. Я хоть и программлю на С++ по работе, но мне все же больше интересней работа с Н во время компиляции и перевод его в АСТ С++ и генерация кода. Так можно делать больше вещей во время компиляции и генерировать что нужно.
Re[4]: чем плохи шаблоны?
От: FR  
Дата: 05.02.12 07:41
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Так о каких таких шаблонах идет речь, если не о С++ и где там чисто функциональный язык и хвостовая рекурсия?


Если на самом деле хочется сравнить мощность шаблонов и макросов то лучше посмотреть на лучшую по моему на данный
момент их реализацию, то есть на язык D:

http://www.d-programming-language.org/template.html
http://www.d-programming-language.org/template-mixin.html
http://www.d-programming-language.org/function.html#interpretation
Re[10]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 07:50
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Здравствуйте, Alexey F, Вы писали:


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


AF>>Итааак...


>>>А как запустить шаблон из шаблона, с новыми аргументами?

AF>>Это я уже показал: http://rsdn.ru/forum/nemerle/4603395.1.aspx
Автор: Alexey F
Дата: 04.02.12


CU>Да, алгоритм вам удался, получаются многие алгоритмы на шаблонах, но до каких же извращений вы дошли ребята. Я хоть и программлю на С++ по работе, но мне все же больше интересней работа с Н во время компиляции и перевод его в АСТ С++ и генерация кода. Так можно делать больше вещей во время компиляции и генерировать что нужно.


Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.
Re[8]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 07:56
Оценка:
Здравствуйте, VladD2, Вы писали:

WH>>Если у меня вдруг появится настроение я даже машину Тьюринга на шаблонах могу изобразить.

VD>Это вряд ли. Что будешь в качестве непрерывной ленты использовать?
Не забывай с кем разговариваешь...
template<class H, class T>
struct TypeList
{
    typedef H Head;
    typedef T Tail;
};
struct NullType{};

template<class LeftItemsArg, class ItemArg, class RightItemsArg>
struct Tape
{
    typedef LeftItemsArg  LeftItems;
    typedef ItemArg       Item;
    typedef RightItemsArg RightItems;

    template<class NewItemArg>
    struct Replace
    {
        typedef Tape<LeftItems, NewItemArg, RightItems> Value;
    };
};

template<class ItemsArg, class DefaultItemArg>
struct PopItem;

template<class ItemArg, class TailArg, class DefaultItemArg>
struct PopItem<TypeList<ItemArg, TailArg>, DefaultItemArg>
{
    typedef ItemArg Item;
    typedef TailArg Items;
};

template<class DefaultItemArg>
struct PopItem<NullType, DefaultItemArg>
{
    typedef DefaultItemArg Item;
    typedef NullType       Items;
};

template<class TapeArg, class DefaultItemArg>
struct MoveLeft
{
    typedef PopItem<typename TapeArg::LeftItems, DefaultItemArg> NewLeftItems;
    typedef Tape<typename NewLeftItems::Items, typename NewLeftItems::Item, TypeList<typename TapeArg::Item, typename TapeArg::RightItems> > Value;
};

template<class TapeArg, class DefaultItemArg>
struct MoveRight
{
    typedef PopItem<typename TapeArg::RightItems, DefaultItemArg> NewRightItems;
    typedef Tape<TypeList<typename TapeArg::Item, typename TapeArg::LeftItems>, typename NewRightItems::Item, typename NewRightItems::Items> Value;
};

typedef Tape<NullType, int, NullType> Tape1;
typedef MoveRight<Tape1, int>::Value Tape2;
typedef Tape2::Replace<char>::Value Tape3;
typedef MoveRight<Tape3, int>::Value Tape4;
typedef MoveLeft <Tape4, int>::Value Tape5;
typedef MoveLeft <Tape5, int>::Value Tape6;

int main(int argc, char* argv[])
{
    std::cout << typeid(Tape1).name() << std::endl;
    std::cout << typeid(Tape2).name() << std::endl;
    std::cout << typeid(Tape3).name() << std::endl;
    std::cout << typeid(Tape4).name() << std::endl;
    std::cout << typeid(Tape5).name() << std::endl;
    std::cout << typeid(Tape6).name() << std::endl;
    return 0;
}

Печатает
struct Tape<struct NullType,int,struct NullType>
struct Tape<struct TypeList<int,struct NullType>,int,struct NullType>
struct Tape<struct TypeList<int,struct NullType>,char,struct NullType>
struct Tape<struct TypeList<char,struct TypeList<int,struct NullType> >,int,struct NullType>
struct Tape<struct TypeList<int,struct NullType>,char,struct TypeList<int,struct NullType> >
struct Tape<struct NullType,int,struct TypeList<char,struct TypeList<int,struct NullType> > >
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: чем плохи шаблоны?
От: CodingUnit Россия  
Дата: 05.02.12 08:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.


Смотря что я хочу сделать, если я хочу на базе некоего ДСЛ, сделать код автомата на С++, или еще что то упростить во время компиляции, то могу весь разбор сделать на Немерле а на С++ сделать генерацию, АСТ конечно может вместить только базовые вещи, что в них общие, match будет цепочкой if, а код должен будет обращаться к типам из stl.
Re[11]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 08:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.

Для Н1 да.
Для Н2 это будет штатный режим работы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 08:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.

WH>Для Н1 да.
WH>Для Н2 это будет штатный режим работы.

Макросы стандартной библиотеки немерли не будут использовать стандартную библиотеку нет? Такое решение принято?
Re[9]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 08:38
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Не забывай с кем разговариваешь...

Вот так еще лучше.
Убрал элемент, которым заполнена лента по умолчанию в саму ленту.
Сделал объектно-ориентированный интерфейс ленте.
Добавил нормализацию ленты. Теперь если текущий элемент равен элементу по умолчанию и список пуст, то список остается пустым.
Таким образом, типы получаются короче. И что важно две ленты можно легко проверить на равенство.
template<class H, class T>
struct TypeList
{
    typedef H Head;
    typedef T Tail;
};
struct NullType{};

template<class TapeArg>
struct MoveLeftImpl;
template<class TapeArg>
struct MoveRightImpl;

template<class LeftItemsArg, class ItemArg, class RightItemsArg, class DefaultArg>
struct Tape
{
    typedef LeftItemsArg  LeftItems;
    typedef ItemArg       Item;
    typedef RightItemsArg RightItems;
    typedef DefaultArg    Default;
    typedef Tape<LeftItemsArg, ItemArg, RightItemsArg, DefaultArg> This;

    template<class NewItemArg>
    struct Replace
    {
        typedef Tape<LeftItems, NewItemArg, RightItems, Default> Value;
    };

    typedef typename MoveLeftImpl<This>::Value  MoveLeft;
    typedef typename MoveRightImpl<This>::Value MoveRight;
};

template<class ItemsArg, class DefaultItemArg>
struct PopItem;

template<class ItemArg, class TailArg, class DefaultItemArg>
struct PopItem<TypeList<ItemArg, TailArg>, DefaultItemArg>
{
    typedef ItemArg Item;
    typedef TailArg Items;
};

template<class DefaultItemArg>
struct PopItem<NullType, DefaultItemArg>
{
    typedef DefaultItemArg Item;
    typedef NullType       Items;
};

template<class ItemArg, class ItemsArg, class DefaultItemArg>
struct PushItem
{
    typedef TypeList<ItemArg, ItemsArg> Value;
};

template<class ItemArg>
struct PushItem<ItemArg, NullType, ItemArg>
{
    typedef NullType Value;
};

template<class TapeArg>
struct MoveLeftImpl
{
    typedef PopItem<typename TapeArg::LeftItems, typename TapeArg::Default> NewLeftItems;
    typedef Tape
        < typename NewLeftItems::Items
        , typename NewLeftItems::Item
        , typename PushItem<typename TapeArg::Item, typename TapeArg::RightItems, typename TapeArg::Default>::Value
        , typename TapeArg::Default
        > Value;
};

template<class TapeArg>
struct MoveRightImpl
{
    typedef PopItem<typename TapeArg::RightItems, typename TapeArg::Default> NewRightItems;
    typedef Tape
        < typename PushItem<typename TapeArg::Item, typename TapeArg::LeftItems, typename TapeArg::Default>::Value
        , typename NewRightItems::Item
        , typename NewRightItems::Items
        , typename TapeArg::Default
        > Value;
};

typedef Tape<NullType, int, NullType, int> Tape1;
typedef Tape1::MoveRight Tape2;
typedef Tape2::Replace<char>::Value Tape3;
typedef Tape3::MoveRight Tape4;
typedef Tape4::MoveRight Tape5;
typedef Tape5::MoveLeft Tape6;
typedef Tape6::MoveLeft Tape7;
typedef Tape7::MoveLeft Tape8;
typedef Tape8::MoveRight Tape9;

int main(int argc, char* argv[])
{
    std::cout << typeid(Tape1).name() << std::endl;
    std::cout << typeid(Tape2).name() << std::endl;
    std::cout << typeid(Tape3).name() << std::endl;
    std::cout << typeid(Tape4).name() << std::endl;
    std::cout << typeid(Tape5).name() << std::endl;
    std::cout << typeid(Tape6).name() << std::endl;
    std::cout << typeid(Tape7).name() << std::endl;
    std::cout << typeid(Tape8).name() << std::endl;
    std::cout << typeid(Tape9).name() << std::endl;
    return 0;
}

struct Tape<struct NullType,int,struct NullType,int>
struct Tape<struct NullType,int,struct NullType,int>
struct Tape<struct NullType,char,struct NullType,int>
struct Tape<struct TypeList<char,struct NullType>,int,struct NullType,int>
struct Tape<struct TypeList<int,struct TypeList<char,struct NullType> >,int,struct NullType,int>
struct Tape<struct TypeList<char,struct NullType>,int,struct NullType,int>
struct Tape<struct NullType,char,struct NullType,int>
struct Tape<struct NullType,int,struct TypeList<char,struct NullType>,int>
struct Tape<struct NullType,char,struct NullType,int>
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 08:46
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Макросы стандартной библиотеки немерли не будут использовать стандартную библиотеку нет? Такое решение принято?

Н2 это не язык в привычном понимании этого слова.
Это скорее родственник MPS, XText итп но несравнимо более технологичный.
В поставке, конечно же, будет куча прикладных языков. В том числе язык являющейся надмножеством Н1.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 08:54
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Макросы стандартной библиотеки немерли не будут использовать стандартную библиотеку нет? Такое решение принято?

WH>Н2 это не язык в привычном понимании этого слова.
WH>Это скорее родственник MPS, XText итп но несравнимо более технологичный.
WH>В поставке, конечно же, будет куча прикладных языков. В том числе язык являющейся надмножеством Н1.

Вы не ответили на вопрос. Вопрос в том на сколько н2 привязана к нет. Как я понимаю жестко. Переделать генерацию кода это четверть работы.
Re[15]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 09:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вы не ответили на вопрос. Вопрос в том на сколько н2 привязана к нет. Как я понимаю жестко. Переделать генерацию кода это четверть работы.

Первые версии будут работать под .НЕТ. Но смогут генерировать код подо что угодно.
Те .НЕТ будет нужен только на машине разработчика и билд серверах.
В будущем планируется полностью отвязать его от платформы.
Благо ядру привязка к платформе не нужна.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: чем плохи шаблоны?
От: hardcase Пират http://nemerle.org
Дата: 05.02.12 09:10
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Итааак...


Это какойто ахтунг. Да и вообще все примеры шаблонов в C++ в этом топике какой-то ахтунг.
Сравнимо с ним по вырвиглазности наверно использование XSLT 1.0 для банальных распиливаний строк и сортировок всяческих. Причем если в XSLT можно подсунуть собственные расширения (в .NET или Java), реализующие необходимые примитивы (например для string.Split и Regex.Match), то в C++ ных шаблонах ничего подобного сделать нельзя и они оставляют тебя наедине с какой-то невнятной кашей уголков и ключевых слов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 09:36
Оценка: +2
Здравствуйте, hardcase, Вы писали:

H>Это какойто ахтунг. Да и вообще все примеры шаблонов в C++ в этом топике какой-то ахтунг.

Я тебе скажу как краевед: Все примеры шаблонов С++ выходящие за приделы обобщенных контейнеров полный ахтунг.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 09:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


H>>Это какойто ахтунг. Да и вообще все примеры шаблонов в C++ в этом топике какой-то ахтунг.

WH>Я тебе скажу как краевед: Все примеры шаблонов С++ выходящие за приделы обобщенных контейнеров полный ахтунг.

Если бы скорость компиляции шаблонов значительно подняли то появились бы аналоги for в немерли и удобство программирования было бы конечно не немерли но и не то что сейчас. Но это никто не делает так как все шаблоны делаются простыми и значит такая оптимизация не нужна. Тут проблема курицы и яйца.
Re[10]: чем плохи шаблоны?
От: FR  
Дата: 05.02.12 09:44
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это какойто ахтунг. Да и вообще все примеры шаблонов в C++ в этом топике какой-то ахтунг.


Угу.
В D правда гораздо лучше, большая часть глупых недостатков исправлены, плюс такая вещь как
CTFE многое что реализуется шаблонами в C++ делать обычными функциями в D.
Re[13]: чем плохи шаблоны?
От: para  
Дата: 05.02.12 10:25
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>>>Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.


WH>>Для Н2 это будет штатный режим работы.


А>Макросы стандартной библиотеки немерли не будут использовать стандартную библиотеку нет? Такое решение принято?


в данном случае не столько важно от чего зависят макросы.

важно то, что СГЕНЕРИРОВАННЫЙ ими код может НЕ ЗАВИСЕТЬ ни от чего
Re[14]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 10:41
Оценка:
Здравствуйте, para, Вы писали:

P>Здравствуйте, Аноним, Вы писали:


А>>>>Достаточно безумная мысль так как немерле слишком завязан на нет и придется перетаскивать кучу библиотек нет что делает вашу работу сложной если не реальной.


WH>>>Для Н2 это будет штатный режим работы.


А>>Макросы стандартной библиотеки немерли не будут использовать стандартную библиотеку нет? Такое решение принято?


P>в данном случае не столько важно от чего зависят макросы.


P>важно то, что СГЕНЕРИРОВАННЫЙ ими код может НЕ ЗАВИСЕТЬ ни от чего


супер. РЕАЛЬНО В ЭТО ВЕРИШЬ?
Re[15]: чем плохи шаблоны?
От: WolfHound  
Дата: 05.02.12 10:55
Оценка:
Здравствуйте, <Аноним>, Вы писали:

P>>важно то, что СГЕНЕРИРОВАННЫЙ ими код может НЕ ЗАВИСЕТЬ ни от чего

А>супер. РЕАЛЬНО В ЭТО ВЕРИШЬ?
Причем тут вера?
Код, который генерируют чуть менее чем все компиляторы, не зависит от самого компилятора.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: чем плохи шаблоны?
От: Аноним  
Дата: 05.02.12 11:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


P>>>важно то, что СГЕНЕРИРОВАННЫЙ ими код может НЕ ЗАВИСЕТЬ ни от чего

А>>супер. РЕАЛЬНО В ЭТО ВЕРИШЬ?
WH>Причем тут вера?
WH>Код, который генерируют чуть менее чем все компиляторы, не зависит от самого компилятора.

Но зависит от стандартной библиотеки, которая зависит от нет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.