Re[19]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 15:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


R>>Ну это только в таких развитых языках как немерле. А на С++ достаточно и этого:

R>>
R>> case expr::Call:
R>>     if ("max" == e.name) Math.Max(e.intArg1, e.intArg2);
R>>     else if ("min" == e.name) Math.Min(e.intArg1, e.intArg2);
R>>     else throw InvalidOperationException(e);
R>>

WH>Нет никаких intArg1 и intArg2. Call содержит список ибо функции бывают с разным колличеством ургуметов.

union решает эту проблему — под каждый тип функции своё кол-во аргументов с нужными типами



R>>Так это и тут выглядит как "ужасное нагромаждение кода". То, что это удалось запихнуть в 3 строчки, не является показателем хорошести кода. Вполне возможно, что я предпочёл запись этого кода в 10 строк.

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


Во-первых, это не ровное место. Скорее всего тут содержится какая-то логика. Какая именно, к сожалению, не представляется возможным понять.
С С напротив, логика максимально прозрачная — есть только тривиальные конструкции. Именно поэтому С является "интернациональным" языком общения между разработчиками. Львиная доля всех алгоритмов и научных статей использует именно С (иногда С++, pascal, java), но никогда функциональные языки (если это только не статья по функциональным языкам), т.к. автор не хочет на ровном месте терять большую часть читателей.
Поэтому же С используют крупнейшие опен-сорц проекты — linux, postgresql и т.д.



R>>Писать на С я не призываю. Я лично пишу на С++ и мне нравится. Компилятор контролирует код не меньше, чем в других современных языках, а учитывая распространённость С++, возможно, что и больше.

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


Зато влияет на детектирование ошибок компилятором — о чём я и говорил.


R>>Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.

WH>Ну-ну. В данном случае никаких предупреждений не будет ибо в С++ не редко пишут код в котором намеренно пропускают выполнение за приделы case.


Я привык больше верить своим глазам:

warning: enumeration value `x3' not handled in switch



R>>Код на немерле не падает "у клиента"? Даже если неправильно указать индекс?

WH>Там небудет индексов на ровном месте.

Какая разница на каком месте? На любом месте что будет?



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[16]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 15:40
Оценка:
Здравствуйте, remark, Вы писали:

R>И не замена union'ам?


Ага. Варианты это замена юнионам. Вот только типобезопасная и удобная.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 15:40
Оценка: :)
Здравствуйте, remark, Вы писали:

WH>>И это весьма примитивный пример.

WH>>При попытке повторить это у тебя будет ужасное нагромаждение кода
WH>>
WH>>| Call (OpCode ("=="), [nested_cond,
WH>>    Parm where (expr = TExpr.TypeConversion(TExpr.Literal(Literal.Bool(true)), _, _))], _) =>
WH>>    emit_branch(nested_cond.expr, else_label)
WH>>


R>Так это и тут выглядит как "ужасное нагромаждение кода". То, что это удалось запихнуть в 3 строчки, не является показателем хорошести кода. Вполне возможно, что я предпочёл запись этого кода в 10 строк.


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

R>Писать на С я не призываю. Я лично пишу на С++ и мне нравится.


А что таогда приводишь не типобезопасные примеры на С? Приводи типобезопасные на С++. Благо с некоторым трахом он это позволяет делать.

R> Компилятор контролирует код не меньше, чем в других современных языках,


Ну, меньше конечно. Но даже не в этом суть. Тут речь то ведь была о паттерн-матчинге. О том, чего ни в С ни в С++ даже в проекте нет (смотрим этот самы 0х).

R> а учитывая распространённость С++, возможно, что и больше.


Забавная логика. Это же как же распространенность влияет на типобезопасность?
Ты о чем вообще?

R>Индексы я использую редко. Что будет, если ошибусь? Исключение или ассёрт скорее всего.


Скорее AV.

R> Вообще индексы я использую редко. Они сами по себе провоцируют ошибки. Обнаружение большинства ошибок я стараюсь переносить на фазы компиляции/линковки/стартапа. Имхо смысл иметь исключение, где по сути должен быть ассёрт не много.


А. Ну-ну. С++ это тот самый язык где можно жить без индексов. В прочем можно конечно итераторы везде на зло врагам использовать, но вот ошибок от этого сильно меньше не становится.

R>Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.


Какой такой не полный switch? 1. Это ведь не Шарп где default обязателен. 2. Ты if использовал. Иначе откуда else? Вот в Немерле if без else попросту невозможен. А в твоих любимых плюсах у тебя будет банальная логическая ошибка которая приведет к банальному подению в рантайме. Причем с огромной вероятностью попрортишь память (что вообще невозмоно в безопасных языках).

R>Код на немерле не падает "у клиента"? Даже если неправильно указать индекс?


AV точно не будет. Рантайм все проконтролирует. Да и Немерле тот язык где как раз можно отлично жить без индексов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 15:42
Оценка: :)
Здравствуйте, remark, Вы писали:

R>union решает эту проблему — под каждый тип функции своё кол-во аргументов с нужными типами

За то создает огромное колличество других.
union не типобезопасный!

R>Во-первых, это не ровное место. Скорее всего тут содержится какая-то логика. Какая именно, к сожалению, не представляется возможным понять.

Нет там никакой логики.
Просто сравнение с образцом.

R>С С напротив, логика максимально прозрачная — есть только тривиальные конструкции.

В С логики максимально спрятана за кучуй присяданий.

R>Именно поэтому С является "интернациональным" языком общения между разработчиками.

R>Львиная доля всех алгоритмов и научных статей использует именно С (иногда С++, pascal, java), но никогда функциональные языки (если это только не статья по функциональным языкам), т.к. автор не хочет на ровном месте терять большую часть читателей.
Я думаю тут все проще: автор банально ничего другого не знает.

R>Поэтому же С используют крупнейшие опен-сорц проекты — linux, postgresql и т.д.

Они его используют исключительно по историческим причинам. Ну написали когдато пара ребятишек мега ОСь UNIX и для того чтобы ее было проще портировать написали переносимый ассемблер ака С. И все начали это безобразие куда попало переносить...
Правда потом ребята поняли свои ошибки и сделали и болие другую ОСь и создали для этого болие другой язык но миллионы мух досихпор продолжают тащить то самое безобразие которое получилось у этих ребят в начале.

R>Зато влияет на детектирование ошибок компилятором — о чём я и говорил.

Бред.

R>Я привык больше верить своим глазам:

R>

R>warning: enumeration value `x3' not handled in switch

Код покажи.

R>

Черезмерное употребление алкоголя вредит вашему здоровью.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 15:55
Оценка:
Здравствуйте, FR, Вы писали:

FR>Boost большой,


Ага. Закрывает слишком много дырок языка.

FR> там есть вполне сопоставимые по сложности с ядром компилятора вещи. Да и занимается во многом тем же самым эмуляцией высокоуровневых фич


Можно смело утверждать, что он проще просто потому, что не все фичи он эмулирует.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 15:55
Оценка:
Здравствуйте, remark, Вы писали:

R>union решает эту проблему — под каждый тип функции своё кол-во аргументов с нужными типами


Ага. И вносит другую. Каждое обращение к юниону может положить программу, так как акромя внимания разработчика от ошибок с ним ничего уберечь не может.

Вот решиш ты изменить код и сделать 3 параметра вместо 2, забудешь сделать это в одном из мест и "пиши приплыли". А с вариантами таких проблем нет. Они не только типобезопасны (их просто нельзя использовать некорректно), но компилятор еще контролирует их использование. Так что он сам подскажет где следует сделать изменения.

R>Зато влияет на детектирование ошибок компилятором — о чём я и говорил.


Поверь на слово. ОКамл или Немрел выявляет на порядок больше ошибок во время компиляции. И в этих языках вообще нет возможности писать код который испортит память или сделает другую бяку. Так что количество ошибок при прграммировании на них просто не сопоставимо с оным при программировании на С++. Это качествнно разный уровень.

R>Я привык больше верить своим глазам:

R>

R>warning: enumeration value `x3' not handled in switch

Скажи, какой к черту switch если у тебя было else throw?
И какой к черту enumeration если ты строки сравниваешь?

ЗЫ

Ты начал изворачиваться. Это хороший показатель того, что ты и сам понимашь, что не прав.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: C++0x начали урезать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.07 15:55
Оценка: 4 (1)
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Можно вопрос немного в сторону выделенное нельзя разве записать покороче с использованием квазицитирования?

ДА>Хотя бы
TExpr.Literal(Literal.Bool(true))
замениить на
<[ true ]>

ДА>?

В Немерле квази-цитирование доступно только для PExpr, а Вольфхаунд использовал TExpr. И вообще, я думаю, что это просто пример.

Да и что тут говорить о таких высших материях как квази-цитирование если ставится под сомнения ползность базовых вещей вроде вариантов и паттернм-матчинга? Квази-цитирование основано на них и без них оно будет просто не полноценно.

К тому же я уверен, что аппоненты даже не понимаю как выглядит разбор и конструирование кода с искользованием квази-цитирование. Это просто другой уровень мышления.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: C++0x начали урезать
От: FR  
Дата: 14.12.07 16:27
Оценка: +1
Здравствуйте, VladD2, Вы писали:

FR>> там есть вполне сопоставимые по сложности с ядром компилятора вещи. Да и занимается во многом тем же самым эмуляцией высокоуровневых фич


VD>Можно смело утверждать, что он проще просто потому, что не все фичи он эмулирует.


Вообще конечно сравнение теплого с зеленым
Если сравнивать только компилятороэмуллирующие части буста, то да проще, если в целом то (теплое с зеленым) скорее наоборот.
Re[16]: C++0x начали урезать
От: Константин Л. Франция  
Дата: 14.12.07 16:45
Оценка:
Здравствуйте, VladD2, Вы писали:

[]

VD>Лично я когда разбираюсь с нетривиальными кусками даже не поддержкой IDE пользуюсь, а отладчиком. Там все типы известны. Более того там известны реальные данные и можно протросировать неясные участки. Это урощает понимание кода на любом языке.


Лезть в отладчик для определения типа это мощно. Вот вам и вывод типов (про такие же проблемы в с++ знаю, так что это палка о двух концах).

[]

VD>А вот Рефлектор на Немерле падает.


редко, но бывало

VD>Ну, и очень советую не Рефлектор использовать, а отладчик. Рефлекто он иногда помогает при отладке не тривиальных макросов. И то это от убогости родных тулзов.


Использовать отладчик для борьбы с выводом типов? Мдя...

ПС: я не против вывода типов. Просто вот не хочется пользоваться левыми тулзами, вместо того, чтобы прочитать аннотацию типа и спать спокойно.
Re[21]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 16:51
Оценка:
Здравствуйте, WolfHound, Вы писали:

R>>Я привык больше верить своим глазам:

R>>

R>>warning: enumeration value `x3' not handled in switch

WH>Код покажи.


enum X {x1, x2, x3};

int main()
{
  X x = x1;
  switch (x)
  {
    case x1: break;
    case x2: break;
  }
}



R>>

WH>Черезмерное употребление алкоголя вредит вашему здоровью.

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[22]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 17:04
Оценка:
Здравствуйте, remark, Вы писали:

R>
R>enum X {x1, x2, x3};

R>int main()
R>{
R>  X x = x1;
R>  switch (x)
R>  {
R>    case x1: break;
R>    case x2: break;
R>  }
R>}
R>

И как это относится к

забудешь else throw

Ы?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 17:04
Оценка: :)
Здравствуйте, VladD2, Вы писали:

R>>Писать на С я не призываю. Я лично пишу на С++ и мне нравится.


VD>А что таогда приводишь не типобезопасные примеры на С? Приводи типобезопасные на С++. Благо с некоторым трахом он это позволяет делать.



Вот, пожалуйста. Меньше, кстати, получается:

struct BinIntCall {string name; int a1, a2;};
struct BinOp {string name; any a1, a2;};

void to_str(any e)
{
    if (double* d = any_cast(e)) cout << *d;
    else if (BinIntCall* c = any_cast(e)) cout << c->name << "(" << c->a1 << "," << c->a2 << ")";
    else if (BinOp* c = any_cast(e)) to_str(c->a1); cout << c->name; to_str(c->a2);
    else throw 0;
}





1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[16]: C++0x начали урезать
От: EvilChild Ниоткуда  
Дата: 14.12.07 17:10
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Concepts эту задачу решают. Некий аналог классов типов Хаскеля.
now playing: Braincell — Networks
Re[23]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 17:12
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>И как это относится к

WH>

забудешь else throw

WH>Ы?


Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.



Стремянки из if-else-if не обязательно использовать вообще...



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[21]: C++0x начали урезать
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 14.12.07 17:46
Оценка:
Здравствуйте, WolfHound, Вы писали:

R>>Поэтому же С используют крупнейшие опен-сорц проекты — linux, postgresql и т.д.

WH> Они его используют исключительно по историческим причинам. Ну написали когдато пара ребятишек мега ОСь UNIX и для того чтобы ее было проще портировать написали переносимый ассемблер ака С. И все начали это безобразие куда попало переносить...
WH>Правда потом ребята поняли свои ошибки и сделали и болие другую ОСь и создали для этого болие другой язык но миллионы мух досихпор продолжают тащить то самое безобразие которое получилось у этих ребят в начале.

Можно про выделенное подробнее? Желательно, ссылки...
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[19]: C++0x начали урезать
От: Дьяченко Александр Россия  
Дата: 14.12.07 17:49
Оценка:
Здравствуйте, VladD2, Вы писали:

ДА>>Можно вопрос немного в сторону выделенное нельзя разве записать покороче с использованием квазицитирования?

ДА>>Хотя бы
TExpr.Literal(Literal.Bool(true))
замениить на
<[ true ]>

ДА>>?

VD>В Немерле квази-цитирование доступно только для PExpr, а Вольфхаунд использовал TExpr.


Про то что квази цитирование доступно только для PExpr что-то не сообразил.
А заменить
TExpr.TypeConversion(TExpr.Literal(Literal.Bool(true)), _, _))
на квази цитирование + преобразование PExpr -> TExpr или получится еще сложнее?

VD>И вообще, я думаю, что это просто пример.


Это кусок патча компилятора в файле ILEmitter который ты приводил в другой ветке (см. Re[11]: Принцип подстановки Барбары Лисков
Автор: VladD2
Дата: 01.01.07
ближе к концу).

VD>Да и что тут говорить о таких высших материях как квази-цитирование если ставится под сомнения ползность базовых вещей вроде вариантов и паттернм-матчинга? Квази-цитирование основано на них и без них оно будет просто не полноценно.

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

Не спорю, но я же говорил что вопрос немного в сторону.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[22]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 18:16
Оценка: 2 (1)
Здравствуйте, konsoletyper, Вы писали:

WH>>Правда потом ребята поняли свои ошибки и сделали и болие другую ОСь и создали для этого болие другой язык но миллионы мух досихпор продолжают тащить то самое безобразие которое получилось у этих ребят в начале.

K>Можно про выделенное подробнее? Желательно, ссылки...
http://en.wikipedia.org/wiki/Limbo_(programming_language)
И дальше по ссылкам.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[24]: C++0x начали урезать
От: WolfHound  
Дата: 14.12.07 18:16
Оценка:
Здравствуйте, remark, Вы писали:

R>

R>Если забуду "else throw" — компилятор предупреждает от неполных switch, отсутствии return, неопределённых виртуальных функциях.

R>Стремянки из if-else-if не обязательно использовать вообще...
Вот твой код:
case expr::Call:
     if ("max" == e.name) Math.Max(e.intArg1, e.intArg2);
     else if ("min" == e.name) Math.Min(e.intArg1, e.intArg2);
     else throw InvalidOperationException(e);

Переписывай без if-else-if ...
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[22]: C++0x начали урезать
От: EvilChild Ниоткуда  
Дата: 14.12.07 18:25
Оценка: 2 (1) +1
Здравствуйте, konsoletyper, Вы писали:

WH>>Правда потом ребята поняли свои ошибки и сделали и болие другую ОСь и создали для этого болие другой язык но миллионы мух досихпор продолжают тащить то самое безобразие которое получилось у этих ребят в начале.


K>Можно про выделенное подробнее? Желательно, ссылки...


Inferno & Plan 9?
now playing: Braincell — Cognition
Re[25]: C++0x начали урезать
От: remark Россия http://www.1024cores.net/
Дата: 14.12.07 19:11
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>
WH>case expr::Call:
WH>     if ("max" == e.name) Math.Max(e.intArg1, e.intArg2);
WH>     else if ("min" == e.name) Math.Min(e.intArg1, e.intArg2);
WH>     else throw InvalidOperationException(e);
WH>

WH>Переписывай без if-else-if ...


Да в принципе и так варнинг есть:

double eval(const expr* e)
{
    if (0 == strcmp("min", e->data.name) && 2 == e->data.count)
        return min(eval(e->data.params[0]), eval(e->data.params[1]));
    else if (0 == strcmp("max", e->data.name) && 2 == e->data.count)
        return max(eval(e->data.params[0]), eval(e->data.params[1]));
}


gcc:

control reaches end of non-void function


msvc:

'eval' : not all control paths return a value




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.