Re[51]: Как скрестить ужа и ежа или статическую и утиные тип
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.07 22:45
Оценка: -2
Здравствуйте, eao197, Вы писали:

E>Задай себе как-нибудь этот вопрос.


Я как-то не привык считать что по моему замечанию все должны начать дергаться.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Как скрестить ужа и ежа или статическую и утиные тип
От: Kisloid Мухосранск  
Дата: 24.01.07 09:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Назови мне хотя бы дин язык программирования для которого нельзя было бы построить LL(k)-парсер.


Дык, я ничего не имею против LL(k) парсеров.
Мой пост был лишь ответной реакцией на это твое высказывание. Т.к. я считаю его некорректным.

Это не так. С заглядываниями вперед LL(k)-парсеры могут распознавать такие же грамматки если не больше.

LL(k) парсеры в принципе не могут иметь большую выразительную мощность чем LR(1) для детерминированных КС грамматик. По той простой причине, что LR(1) покрывает все множество детерменированных КС языков. Вот. А если пойти дальше и посмотреть на недетерминированные, то насколько мне известно кроме CYK еще ничего круче не придумано, хотя может мои знания уже устарели. Проблема в CYK, то что ее алгоритимческая сложность O(N^3) то есть для практики не применима.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[24]: Как скрестить ужа и ежа или статическую и утиные тип
От: runtime2  
Дата: 24.01.07 11:34
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Это для всяких плееров на managed-языке нужно писать только GUI. А вот возьмём такую простую штуку как IDE (куда уж её до MP3-декодера). Пусть в ней должны быть autocompletion + подстветка типов + рефакторинг + навигация по коду (это только касательно работы с кодом, а в хорошей IDE должно быть много чего ещё). Для этого нужно иметь как минимум хороший парсер языка с восстановлением. Парсер можно написать на C++ — с таким же успехом я могу написать его на ассемблере. Дальше — больше. Нужно иметь хороший текстовый редактор, чтобы он умел проставлять в тексте маркеры с состояниями и чтобы можно при модификации текста прробежать парсером только по небольшому кусочку. Например, при модификации тела функции распарсить только одну функцию и чуть-чуть подправить AST редактируемго текста. Ну что, слабо написать всё это на C++? Я верю, что можно. А вот выгодно ли?


Интересно, а парсер IDE C# на чем написан?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[35]: Как скрестить ужа и ежа или статическую и утиные тип
От: Kisloid Мухосранск  
Дата: 24.01.07 12:05
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>LR(1)-парсеры не распознают не то что весь класс КС-грамматик, они распознают даже далеко не весь класс однозначных КС-грамматик.


LR-grammars generate exactly the DCFLs
The family of LR(1)-languages is exactly the family of deterministic languages.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[25]: Как скрестить ужа и ежа или статическую и утиные тип
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.07 14:21
Оценка: :))) :)
Здравствуйте, runtime2, Вы писали:

R>Интересно, а парсер IDE C# на чем написан?


Сейчас IDE уже не применяют. Сейчас рулит SATA.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Как скрестить ужа и ежа или статическую и утиные тип
От: IT Россия linq2db.com
Дата: 24.01.07 14:36
Оценка:
Здравствуйте, runtime2, Вы писали:

R>Интересно, а парсер IDE C# на чем написан?


На плюсах, как и сам компилятор C#.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[44]: динамическая абстрактная фабрика на D
От: FR  
Дата: 24.01.07 15:45
Оценка: 15 (1)
Здравствуйте, VladD2, Вы писали:


VD>Ну, так повтори. Интересно глянуть.


Пока повторить так чтобы можно было передавать параметры в конструкторы не получилось, но повторить тот вариант что у Александреску оказалось на D не сложно (без стратегий для создания, их добавить не сложно, да и для D они и не нужны в общем), в общем на D писать шаблонный код на самом деле намного проще чем в C++:

import std.stdio;
import std.typetuple;

// фабрика

class _abstract(AT...)
{
    T create(T)()
    {
        const i = IndexOf!(T, AT);
        static assert(i >= 0 && i < AT.length);
        return cast(T)do_create(i);
    }

    Object do_create(int i)
    {
        return null;
    }
}

template fab(AT...)
{   
    class concrete_class(CT...) : _abstract!(AT)
    {
        override Object do_create(int i)
        {   
            foreach(ii, T; CT)
            {
                if(ii == i) return cast(Object)(new T);
            }            
        }

    }
    
    _abstract!(AT) concrete(CT...)()
    {
        return new concrete_class!(CT);
    }
}


// тестовые классы и интерфейсы

// базовые интерфейсы
interface Soldier { char[] info(); };
interface Monster { char[] info(); };
interface SuperMonster { char[] info(); };


// конкретные классы
class SillySoldier : public Soldier {char[] info() {return "SillySoldier";}};
class SillyMonster : public Monster {char[] info() {return "SillyMonster";}};
class SillySuperMonster : public SuperMonster {char[] info() {return "SillySuperMonster";}};    

class BadSoldier : public Soldier {char[] info() {return "BadSoldier";}};
class BadMonster : public Monster {char[] info() {return "BadMonster";}};
class BadSuperMonster : public SuperMonster {char[] info() {return "BadSuperMonster";}};    


void print(_abstract!(Soldier, Monster, SuperMonster) f1)
{
writefln(f1);
    
auto sl = f1.create!(Soldier);
auto mn = f1.create!(Monster);
auto sp = f1.create!(SuperMonster);    
writefln(sl.info());
writefln(mn.info());
writefln(sp.info());
    
writefln();    
}

void main()
{
auto f1 =  fab!(Soldier, Monster, SuperMonster)
            .concrete!(SillySoldier, SillyMonster, SillySuperMonster);
print(f1);
    
f1 = fab!(Soldier, Monster, SuperMonster)
            .concrete!(BadSoldier, BadMonster, BadSuperMonster);
print(f1);
}


С автоматическим выводом параметров конструктора пока не получается (буду ковырять еще), но можно легко добавить стратегии где вручную можно будет указать типы аргументов для конструкторов.
Re[26]: Как скрестить ужа и ежа или статическую и утиные тип
От: Андрей Хропов Россия  
Дата: 24.01.07 17:47
Оценка:
Здравствуйте, IT, Вы писали:

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


R>>Интересно, а парсер IDE C# на чем написан?


IT>На плюсах, как и сам компилятор C#.


Ну это смотря какой компилятор, Monoвский компилятор написан сам на С#: здесь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[26]: Как скрестить ужа и ежа или статическую и утиные тип
От: Cyberax Марс  
Дата: 24.01.07 18:27
Оценка: :)
VladD2 wrote:
> R>Интересно, а парсер IDE C# на чем написан?
> Сейчас IDE уже не применяют. Сейчас рулит SATA.
Это непосредственная работа с железом, и его используют только идиоты.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[45]: динамическая абстрактная фабрика на D
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.07 21:39
Оценка:
Здравствуйте, FR, Вы писали:

FR>С автоматическим выводом параметров конструктора пока не получается (буду ковырять еще), но можно легко добавить стратегии где вручную можно будет указать типы аргументов для конструкторов.


Это не так интересно.

Кстати, я по прежнему не вижу virtual или его аналогов. Фабрика по прежнему статическая?
И вообще, нельзя ли снабжать код комментариями, чтобы было понятно, что и зачем делается.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[46]: динамическая абстрактная фабрика на D
От: FR  
Дата: 25.01.07 06:09
Оценка:
Здравствуйте, VladD2, Вы писали:

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


FR>>С автоматическим выводом параметров конструктора пока не получается (буду ковырять еще), но можно легко добавить стратегии где вручную можно будет указать типы аргументов для конструкторов.


VD>Это не так интересно.


Кому как, по по сравнению с C++ на порядок проще сделать.

VD>Кстати, я по прежнему не вижу virtual или его аналогов.


В D все не статические и не шаблоные функции виртуальные, к тому же там есть override.

VD>Фабрика по прежнему статическая?


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

VD>И вообще, нельзя ли снабжать код комментариями, чтобы было понятно, что и зачем делается.


Так вроде тут вообще нечего комментировать, элементарный же код . А так все просто есть базовый шаблонный класс _abstract, и шаблон fab который генерирует его наследника concrete_class. Функция Object do_create(int i) виртуальная. Суть же работы простая при вызове специализированной одним из базовых классов функции create вызывается виртуальная функция do_create с индексом данного базового класса в списке типов базовых классов(AT). В concrete_class do_create переоределен так что возвращает экземпляр по индексу из списка конкретных классов.
Re[47]: динамическая абстрактная фабрика на D
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.07 08:48
Оценка:
Здравствуйте, FR, Вы писали:

FR>Так вроде тут вообще нечего комментировать, элементарный же код .


Сомет для того кто уже более-менее знаком с Ди коментировать и не чего. А лично для меня очень даже есть чего. Так что было бы неплохо дать подоробные коментарии.

Не думаю, что это сложнее чем написать все это.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[46]: Как скрестить ужа и ежа или статическую и утиные тип
От: Tonal- Россия www.promsoft.ru
Дата: 25.01.07 08:52
Оценка:
Здравствуйте, VladD2, Вы писали:
FR>>
FR>>public void Linq1() {
FR>>    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

FR>>    var lowNums =
FR>>        from n in numbers
FR>>        where n < 5
FR>>        select n;

FR>>    Console.WriteLine("Numbers < 5:");
FR>>    foreach (var x in lowNums) {
FR>>        Console.WriteLine(x);
FR>>    }
FR>>}
FR>>

Я правильно понял, что на Python-е это будет так:
numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
print "Numbers < 5:"
for x in (n for n in numbers if n < 5):
  print x


VD>Nemerle рулит

VD>
VD>def numbers = array[5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
VD>WriteLine(numbers.Filter(_ < 5));
VD>

VD>или так
VD>
VD>def numbers = array[5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
VD>WriteLine($[x | x in numbers, x < 5]);
VD>

Круто!
А WriteLine при передаче в него списка что выводит? Каждый элемент в своей строчке?
И вывод строки "Numbers < 5:" как от не виден в вашем коде.
Если на это забить, то код на Python сокращается тоже до 2х строчек почти полностью идентичных вашем:
numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
print filter(lambda x: x < 5, numbers)

или
numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
print list(x for x in  numbers if n < 5)

В чём "рулёж" немла?
Re[14]: Как скрестить ужа и ежа или статическую и утиные тип
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.01.07 11:33
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Они бы учли интересы и убрали сами модады введя вместо этого строгое (не линивое) выполнение. Сделать это можно было пометкой участков кода неким блоком.


Строгое исполнение в Хаскеле есть. Монады для IO (ты ведь об этом?) введены не из-за ленивости (точнее, не только из-за нее), а из-за невозможности определить порядок исполнения, здесь сыграла роль чистота языка. Кстати, были предложения сделать IO с помощью потоков или CPS. Монады оказались более симпатичным и эффективным решением.
Re[47]: Как скрестить ужа и ежа или статическую и утиные тип
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.07 12:50
Оценка: +1
Здравствуйте, Tonal-, Вы писали:

T>Если на это забить, то код на Python сокращается тоже до 2х строчек почти полностью идентичных вашем:

T>
T>numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
T>print filter(lambda x: x < 5, numbers)
T>

T>В чём "рулёж" немла?

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

Предвижу вопрос "Когда питон не так же краток?". Сразу отвечаю. В питоне нет сопоставления с образцом и алгераических типов, так что в тех случаях когда эти возможности позволяют решать задачи проще Питон будет проигрывать.
За-то в Питоне есть встроенные регекспы и сплайсы для списков и массиво. Иногда это может дать более краткий код. В прочем, в случае необходимости к Немерлу прикручивается почти все что угодно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Как скрестить ужа и ежа или статическую и утиные тип
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.07 14:24
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Строгое исполнение в Хаскеле есть. Монады для IO (ты ведь об этом?) введены не из-за ленивости (точнее, не только из-за нее), а из-за невозможности определить порядок исполнения, здесь сыграла роль чистота языка.


Не чистота, а именно ленивость. Именно из-за этого нельзя гарантировать последовательнось исполнения.

L> Кстати, были предложения сделать IO с помощью потоков или CPS. Монады оказались более симпатичным и эффективным решением.


Не надо делать из языка икону для молебен. Язык — это прежде всего инструмент для работы. И Хаскель при всех его изысках инструмент для реальной жизни не пригодный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Как скрестить ужа и ежа или статическую и утиные тип
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.01.07 14:53
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

L>>Строгое исполнение в Хаскеле есть. Монады для IO (ты ведь об этом?) введены не из-за ленивости (точнее, не только из-за нее), а из-за невозможности определить порядок исполнения, здесь сыграла роль чистота языка.


VD>Не чистота, а именно ленивость. Именно из-за этого нельзя гарантировать последовательнось исполнения.


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

[getchar, getchar]

Т.к. язык чистый, то скорее всего второго вызова getchar не будет, т.к. он вернёт (должен! если исходить из чистоты языка) тот же самый результат, что и первый. И при чём тут лень?

Хорошо! Допустим, что такой оптимизации нет. Какой getchar будет выполнен первым? Для чистого языка нет разницы в какой последовательности выполнять параметры функции. В Хаскеле вообще нет такого понятия как последовательность вычислений, там всё декларативно, а последовательность реализуется библиотечными средствами. Это следствие чистоты, а не лени.

L>> Кстати, были предложения сделать IO с помощью потоков или CPS. Монады оказались более симпатичным и эффективным решением.


VD>Не надо делать из языка икону для молебен. Язык — это прежде всего инструмент для работы. И Хаскель при всех его изысках инструмент для реальной жизни не пригодный.


Ты с кем разговариваешь?
Re[48]: Как скрестить ужа и ежа или статическую и утиные тип
От: Tonal- Россия www.promsoft.ru
Дата: 25.01.07 14:59
Оценка:
Здравствуйте, VladD2, Вы писали:

T>>Если на это забить, то код на Python сокращается тоже до 2х строчек почти полностью идентичных вашем:

T>>
T>>numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
T>>print filter(lambda x: x < 5, numbers)
T>>

T>>В чём "рулёж" немла?

VD>Дык не кто не спорит, что иногда на Питоне можно писать так же кратко и выразительно как на Немерле.

VD>А пока что ты радушся тому, что сравнивашь компилируемый статически типизируемый язык со скриптом и находишь, что они в простейших случаях практичкски идентичны по выразительности.
Если я правильно помню, то и python и немерл этот синтаксис заимствовал из Haskell.
Так что радоваться надо именно за него.
А насчёт скрипта — можешь определение дать какой язык является скриптом, а какой нет?

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

Так же как Немерл в будет проигрывать там где статическая типизация ограничивает.
VD>За-то в Питоне есть встроенные регекспы и сплайсы для списков и массиво. Иногда это может дать более краткий код. В прочем, в случае необходимости к Немерлу прикручивается почти все что угодно.
К Python тоже прикручивается что угодно.
Re[46]: Как скрестить ужа и ежа или статическую и утиные тип
От: Tonal- Россия www.promsoft.ru
Дата: 25.01.07 15:07
Оценка: :)
Здравствуйте, VladD2, Вы писали:
VD>Nemerle рулит
VD>
VD>def numbers = array[5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
VD>WriteLine(numbers.Filter(_ < 5));
VD>

VD>или так
VD>
VD>def numbers = array[5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
VD>WriteLine($[x | x in numbers, x < 5]);
VD>

Кстати, для C++ с использованием лямбды это тоже в 2 строки пишеться:
const int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};
for_each(numbers, numbers + sizeof(numbers)/sizeof(int), _1 < 5 && cout<<_1<<endl);

Лямбда сейчас есть в Boost-е и готовиться в стандарт.
Re[38]: Как скрестить ужа и ежа или статическую и утиные тип
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 25.01.07 15:26
Оценка: 1 (1) -1
Здравствуйте, WolfHound, Вы писали:

WH>А вот еслибы он был сравним по мощьности с немерле то давно бы переписали. Ибо компилятор на языке с алгебраическими типами и сравнением с образцо писать сильно проще.


Кстати! Неоднократно замечаю, что на рсдн паттерн матчингу какую то мистическую роль ужасного упрощателя кода отводят. На самом деле на столь низком уровне пишут редко. Самым полезным оказываются ФВП. В частности при имеющейся библиотеке комбинаторов для парсинга при написании лексера и синтаксического анализатора паттерн матчинг не нужен вообще. Для задач парсинга, разумеется.

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