Чего вам не хватает в языке программирования и в IDE?

Тема в разделе "WASM.ZEN", создана пользователем xcode, 20 апр 2007.

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Ustus
    вообще-то это Booster спросил, а не я
    что касается перехода назад - он же не перепрыгивает через инициалиацию.. нк да, деструктор надо вызвать
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Сорри, промахнулся...
    А вообще есть такое понятие как "структурное goto", где-то я даже видел определение, только не могу вспомнить где, в "книге дракона" Ахо-Сети-Ульмана, что ли...
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Ustus
    И правда...

    Открываются новые возможности для написания неочевидного кода. :)
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    rmn
    ИМХО не стоит прятать циклы в дефайны. Если есть цикл - то он и должен выглядеть как цикл.

    Nouzui
    Семантика continue - для управления циклами, и добавление его в switch превратит switch'и в самые что ни на есть обычные циклы.
    В твоём примере получается _циклическая_ обработка сообщения - поэтому здесь нужно вставить цикл, и всё будет абсолютно логично, намного логичнее, чем continue внутри switch'а.
    Можно сделать так, как rmn, но я пишу так:
    Код (Text):
    1. do {
    2.    switch (message)
    3.    {
    4.       case WM_COMMAND:
    5.          if (LOWORD(wParam) == IDCANCEL)
    6.          {
    7.             message = WM_CLOSE;
    8.             continue;
    9.          }
    10.    }
    11. } while (false);
    Т.е. к твоему коду добавить всего 2 строки - и не надо нововведений в языке :)
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    break внутири свитча нелогичным не кажется
    не знаю, вкус и цвет, но мне больше нравится вариант с continue, чем с лишней оберткой. и, кстати, break внутри свитча обрывает свитч, а continue - продолжает внешний цикл. несостыковка. хотя я то уже привык..
    короче, добавление continue мне кажется вполне логичным
     
  6. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Nouzui
    По-моему, всё вполне логично. Break относится к свитчам. Continue к циклам. Свитч не есть цикл - это условный оператор. Цикл - это do/while/for, а никак не условный оператор.
    Насчёт несостыковки: ну не кажется же несостыковкой наличие локальных и глобальных переменных с одинаковыми именами? А чем же хуже break/continue?
    А превращать условный оператор в цикл - извращение. Вам же не приходит идея добавить continue ещё и в if? А почему же в switch'е он должен быть?
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в if? было бы можно, конеш, но тогда continue и break для циклов вообще потеряли бы всякий смысл.. вместе с самим оператором while
    а вот в свитче break действительно перестает действовать на внешний цикл, зато continue продолжает. тогда уж нужно было ввести для свитча свой оператор break'а, не пересекающийся с цикловым
    короче, бессмысленный спор. у меня switch даже не ассоциируется с условным оператором, для меня это нечто весьма своеобразное. и не нравится мне делать лишние обертки из пустых циклов, я лучше воспользуюсь goto
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Ну да, в принципе бессмысленный спор.
    Но, напоследок, выскажусь по поводу goto :)
    Единственно правильное применение goto в языке C++ - это выход из вложенных циклов. Здесь, действительно, без goto никак (можно сделать флаг, но это коряво и даже может создать тормоза).
    А вот во всех остальных случаях следует использовать for/while/do + continue/break. Это заметно улучшит читабельность кода и поможет компилятору с оптимизацией.
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Еще одно замечательное применение goto (и именно в таком виде он и встречается в исходниках винды):
    Код (Text):
    1. if (error in expression1) {
    2. rc = ERROR;
    3. goto done;
    4. }
    5. if (error in expression2) {
    6. rc = ERROR;
    7. goto done;
    8. }
    9. ......
    10. done:
    11.   if (rc == ERROR)
    12.     freeall();
    В противном случае будет такое количество вложенных if-ов, что в них до конца жизни не разберешься
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    green
    [q]IMHO, иногда использование goto уместно. Например, надо быстро выйти из многократно вложенных циклов. Рекомендуемое решение - генерация эксепшена - слишком тяжеловесное.[/q]
    Твоя мечта уже существует в некоторых языках в виде Break N и Continue N, где N - уровень "выложенности" (т.е. вложенности наоборот) цикла, который нужно прервать или принудительно исполнить.

    Мне же в Delphi не хватает определения целочисленных типов произвольной длины (чтобы можно было использовать всякие там int80, int128, да хоть бы int16384) и соответствующего контроля типов, чтобы при dword:=dword1*dword2 компилятор орал, как резаный, что при умножении 32-битных получается 64-битное. А еще хочу set'ы длиннее 256 элементов и перегрузку операторов. А к SP-Forth просто дайте мне нормальную документацию.
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот еще один пример, в котором я нахожу целесообразным применение goto:

    Код (Text):
    1. goto check:
    2. for(;;)
    3. {
    4.     <что-то долго делаем>
    5.  
    6. check:
    7.     <проверка условия из нескольких операций>
    8.     if(!<условие>)
    9.         break;
    10. }
    минусы - проблемы с объявлением локальных переменных внутри цикла
    альтернативные варианты:

    Код (Text):
    1. int func(...)
    2. {
    3.     <проверка условия из нескольких операций>
    4.     return <условие>;
    5. }
    6.  
    7. while(func(...))
    8. {
    9.     <что-то долго делаем>
    10. }
    Код (Text):
    1. while(<оп1>, <оп2>, <оп3>, <оп4>, <оп5>.. <условие>)
    2. {
    3.     <что-то долго делаем>
    4. }
    Код (Text):
    1. int flag= 0;
    2. do
    3. {
    4.     if(flag)
    5.     {
    6.         <что-то долго делаем>
    7.     }
    8.  
    9.     <проверка условия из нескольких операций>
    10.     flag= 1;
    11. }while(<условие>)
    с goto и break, конечно, получается совсем не структурно, но в ряде случаев это себя оправдывает
     
  12. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    CyberManiac
    Ленишься длинную арифметику написать :)
    (да, иногда хочется, чтобы компилятор всё за тебя написал - типа поиск в ширину, Дейкстру :)

    Тогда он у тебя будет орать на каждой операции умножения. Ибо переменной с нулевым размером не существует :)

    А как насчёт самому написать битовые операции над массивом байтов?

    Да, этого не хватает. Но мне кажется, рано или поздно перегрузка в Object Pascal появится.
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    maxdiver
    Перегрузку вроде прикрутили в последнем Delphi...
     
  14. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    maxdiver
    Да есть она у меня - но компилятор сделал бы это лучше.

    Вот тут не понял. Зачем нужны переменные длиной в 0 бит и откуда бы они взялись? Единственная проблема, которая теоретически тут могла бы возникнуть - это определение размерности константы (или необходимость принудительно указывать её тип).

    От этого в синтаксисе set of WideChar не прибавится. А хотелось бы :)

    green
    2007-ых Делфей не имею, чтобы посмотреть, а в 2006 точно нет.
     
  15. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    CyberManiac
    http://www.codegear.com/LinkClick.aspx?fileticket=ZfZ5RJXtI1s%3d&tabid=236&mid=808
    см. "LANGUAGE AND RUNTIME LIBRARY FEATURES"
     
  16. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    CyberManiac
    Ну а как компилятор отличит, "хорошое" умножение или "плохое"? Если мы умножаем dword на dword, то результат может получиться размером в 8 байт. И вообще, если умножаем N-байтное число на N-байтное, то результат гарантированно поместится только в 2N байт. Так как же компилятор поймет, что нужен warning? В любой операции умножения, хоть dword*byte, может произойти переполнение. От этого никуда не денешься.

    Хочется в RTL всё и сразу :)
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.242
    мне лично не хватает нейро интерфейса - вот это реальная тема:))
     
  18. xcode

    xcode Member

    Публикаций:
    0
    Регистрация:
    8 апр 2007
    Сообщения:
    105
    Спасибо всем кто откликнулся. Тема не закрыта, т.к. такие идеи по расширению языка и улучшению IDE есть и будут всегда. А кроме обсуждаемых здесь низкоуровневых фич, есть еще ООП, ФП...
    С goto порадовали. Мое мнение: goto нужен для специальных целей. Т.е. если нужно передать управление в конкретную область памяти, например. В обычных алгоритмах в принципе можно обходиться без goto.

    А вот такая идея с именованными блоками, думаю многим понравится:
    Код (Text):
    1. while(x<y) main_xy_loop
    2. {
    3.   for(int i=0; i<10; i++) i10_loop
    4.   {
    5.     while(!done) inner_loop
    6.     {
    7.       //...
    8.       if(condition) break main_xy_loop; // <---
    9.     }
    10.   }
    11. }
    И выход из вложенных циклов, и без goto. Еще несколько идей с именованными блоками:
    * после закрывающей скобки можно указыать имя блока. В этом случае, компилятор проверяет совпадение имен в начале и в конце. Своеобразный самоконтроль для программтсра и повышается наглядность навороченных циклов (видно какая скобка к чему относится)
    * низкоуровневые операции - получить адрес блока, размер блока sizeof(block_name). Кстати, хорошо бы sizeof распространить и на функции.
     
  19. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    xcode
    Это всё хорошо, но боюсь, в Стандарте такая вещь, как именованные блоки, вряд ли когда-нибудь появится. Ведь тогда все старые компиляторы станут несовместимыми и для них код всё равно придётся исправлять на "старый стиль".
    В абсолютном большинстве случаев все фичи, перед тем как добавляться в Стандарт, сначала появляются в популярных компиляторах в виде некоторых расширений. Если эти расширения оказываются популярными, то только тогда уже ставится вопрос о включении этой возможности в Стандарт.
    (Здесь есть одно исключение, но со знаком минус: в Стандарте ещё 10 лет назад были введены экспортируемые шаблоны, но долгое время их никто не поддерживал, и лишь несколько лет назад в компиляторе EDG появились экспортируемые шаблоны; остальные производители, похоже, включать поддержку экспортируемых шаблонов и не собираются)
     
  20. Guest

    Guest Guest

    Публикаций:
    0
    InteliSence это показывает когда скобку закрываешь в строке статуса появляется начало открываемой скобки, нужно лишь указать скобку в одной строке цикла "while() { ", но не помешали бы tip'ы в VS при наведении на скобку к чему она относится.
    По именованным циклам идея отличная.