Скажу чего мне нехватает
Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++
Мне не так уж и много надо.
1. break [what]; continue [what];
возможность делать break(и continue) из любого скоупа, а не только цикла. Плюс параметризировать.
число говорит сколько скоупов оборвать, а назавание цыкла говорит какой первый встречающийся цикл оборвать. Через запятую перечисление последовательных обрывов.
например если написанно:
Скрытый текст
{
while(true)
{
break 2; // это ведет
}
} // сюдаwhile (true)
{
{
break while; // это ведет
}
} // сюдаdo
{
{
while (true)
{
for (;;)
{
break while, 1; // это ведет
}
}
} // сюда
} while(true);
{
while(true)
{
continue 2; // это ведет
}
// сюда
}
while (true)
{
{
continue while; // это ведет
}
// сюда
}
do
{
{
while (true)
{
for (;;)
{
continue while, 1; // это ведет
}
}
// сюда
}
} while(true);
2. ключевое слово loop (или любое другое имеющее такую же функциональность)
loop auto my_scope_var = get_the_var();
loop string my_scope_string;
Строка инициализации переменной выполняется один раз после входа в loop scope, а деструктор вызывается при выходе из него.
примеры:
Скрытый текст
string s;
ifstream fin("1.txt");
while (getline(fin, s)) // читаем по строкам
{
loop istringstream iss;
loop string s2; // эти переменные объявленны тут только для читабельности,
// их реальное место за пределами цикла, но при этом нет никакой причины чтобы они были бы там видны...
iss.str(s);
while (iss >> s2) // читаем прочитанную строку по словам
{
if (/*some condition*/)
{
continue while, while; // :) goto nextLine;
}
//...
}
nextLine:
}
for (;;)
{
if (not time to begin changes)
continue;
loop lock_t lock(m_mutex);
// допустим что все изменения в данном цикле должные делаться под одним замком,
// однако нет никакой причины закрывать его заранее
}
Здравствуйте, Caracrist, Вы писали:
C>Скажу чего мне нехватает C>Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++
Старый (мега)топик по поводу — "Выйти из двух циклов сразу"
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, Caracrist, Вы писали:
C>>Скажу чего мне нехватает C>>Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++
bnk>Старый (мега)топик по поводу — "Выйти из двух циклов сразу"
Здравствуйте, Caracrist, Вы писали:
C>Скажу чего мне нехватает
как немного надо человеку для счастья
C>1. break [what]; continue [what]; C>возможность делать break(и continue) из любого скоупа, а не только цикла. Плюс параметризировать. C>число говорит сколько скоупов оборвать,
лучше — на сколько строк вниз переместиться. нет, лучше машинных инструкций... да, это тяжело. но зато как интересно будет!
C>2. ключевое слово loop (или любое другое имеющее такую же функциональность) C>примеры:
[ccode]
{string s;
string s2;
while (getline(fin, s)) // читаем по строкам
....
}}
[/code]
C>3. goto case; как в C#
Здравствуйте, Мишень-сан, Вы писали:
МС>Здравствуйте, BulatZiganshin, Вы писали:
МС>Я вместо этих извратов с break-continue предпочёл бы нормальные локальные функции.
а выход через несколько исключениями реализовать, и все необходимое by-ref передавать?
вся идея локальных скоупов в конструкторах/деструкторах, break/continue/loop/if-else и visibility других локальных переменных, можно от них отказаться, но по моему это не правильный путь.
Здравствуйте, Caracrist, Вы писали:
C>Скажу чего мне нехватает C>Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++
Заменить шаблоны макросами аля Немерл. Остальной сахар реализовать через них.
Нормальные сообщения об ошибках (полагаю, что с заменой шаблонов на макросы уйдут в прошлое и нечитаемые развертки стэка инстацирования).
Стандарт на объектные файлы.
Здравствуйте, Mazay, Вы писали:
M>Нормальные сообщения об ошибках (полагаю, что с заменой шаблонов на макросы уйдут в прошлое и нечитаемые развертки стэка инстацирования).
и чем же они заменятся?
вообще верит в макросы может только человек которыми ими никогда не пользовался. представь себе хотя бы отладку кода, используюшего макросы....
Здравствуйте, Mazay, Вы писали:
M>Заменить шаблоны макросами аля Немерл. Остальной сахар реализовать через них.
Поймите правильно, я не предлагаю использовать именно макросы Немерла. Я говорю, что полезной была бы возможность полноценной кастомизации синтаксиса языка на базе C с классами. Остальное будет реализовано в виде библиотек типа буста и stl. В C++ сообществе уже есть успешный опыт по кастомизации синтаксиса с помощью перегрузки операторов, шаблонов. Взгляните на BOOST_FOREACH, SCOPE_EXIT, boost::lambda. Если бы у разработчиков были более удобные инструменты , то эти улучшения было бы также удобно использовать как встроенные операторы. Какими будут эти средства — вопрос обсуждаемый, но макросы Немерла как минимум стоит рассмотреть.
Здравствуйте, BulatZiganshin, Вы писали:
M>>Нормальные сообщения об ошибках (полагаю, что с заменой шаблонов на макросы уйдут в прошлое и нечитаемые развертки стэка инстацирования).
BZ>и чем же они заменятся?
BZ>вообще верит в макросы может только человек которыми ими никогда не пользовался. представь себе хотя бы отладку кода, используюшего макросы....
Позовите Ви... Влада!
Они же в Немерле как-то отлаживаются. Там какие-то хитрые макросы, не такие как в сишном препроцессоре.
Здравствуйте, Caracrist, Вы писали:
C>Скажу чего мне нехватает C>Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++
Мне хотя бы constexpr и возможность манипулировать строками (массивами) во времени компиляции.
const int hash_abc = hash("abc"); // compile time :)
Здравствуйте, Mazay, Вы писали:
M>>>Нормальные сообщения об ошибках (полагаю, что с заменой шаблонов на макросы уйдут в прошлое и нечитаемые развертки стэка инстацирования).
BZ>>вообще верит в макросы может только человек которыми ими никогда не пользовался. представь себе хотя бы отладку кода, используюшего макросы....
M>Они же в Немерле как-то отлаживаются. Там какие-то хитрые макросы, не такие как в сишном препроцессоре.
и в C++ как-то отлаживаются шаблоны C++ — это как раз специализированные макросы, которые лишены хотя бы части их недостатков. с макросами будет только хуже. любые идеи универсальных препроцессоров упираются в диагностику и отладку
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, Mazay, Вы писали:
M>>>>Нормальные сообщения об ошибках (полагаю, что с заменой шаблонов на макросы уйдут в прошлое и нечитаемые развертки стэка инстацирования).
BZ>>>вообще верит в макросы может только человек которыми ими никогда не пользовался. представь себе хотя бы отладку кода, используюшего макросы....
M>>Они же в Немерле как-то отлаживаются. Там какие-то хитрые макросы, не такие как в сишном препроцессоре.
BZ>и в C++ как-то отлаживаются шаблоны C++ — это как раз специализированные макросы, которые лишены хотя бы части их недостатков. с макросами будет только хуже. любые идеи универсальных препроцессоров упираются в диагностику и отладку
Там, ЕМНИП, не простой текстовый препроцессор, а полноценная компайл-тайм логика. в D есть отголосок — компайл-тайм функции.
Вообще же мне не совсем понятно, в какую сторону несёт новый стандарт — вводят какой-то зоопарк сказочных конструкций (как пример — альтернативный typedef и новый формат декларации функций), но при этом выбрасывают такие вещи как концепты. О стандарте на ABI и полноценных модулях остаётся только мечтать.
Кстати, наткнулся как-то на интересную идею (где-то на форуме Nemerle кажется): расширить семантику типа void, в частн. позволить единственное значение этого типа — например (). И соответственно позволить конструкции вида return (); в функциях возвращающих void. Это позволило бы не писать для некоторых случаев делегирования в шаблонах отдельную специализацию.
Здравствуйте, Мишень-сан, Вы писали:
МС>Здравствуйте, Мишень-сан, Вы писали:
МС>Кстати, наткнулся как-то на интересную идею (где-то на форуме Nemerle кажется): расширить семантику типа void, в частн. позволить единственное значение этого типа — например (). И соответственно позволить конструкции вида return (); в функциях возвращающих void. Это позволило бы не писать для некоторых случаев делегирования в шаблонах отдельную специализацию.
Здравствуйте, Мишень-сан, Вы писали:
BZ>>и в C++ как-то отлаживаются шаблоны C++ — это как раз специализированные макросы, которые лишены хотя бы части их недостатков. с макросами будет только хуже. любые идеи универсальных препроцессоров упираются в диагностику и отладку
МС>Там, ЕМНИП, не простой текстовый препроцессор, а полноценная компайл-тайм логика. в D есть отголосок — компайл-тайм функции.
новое — это хорошо разрекламированное старое синтаксические макросы хорошо известны с 60-х, как и их недостатки
для того, чтобы у тебя в шаблонах/макросах не появлялось многоэтажных сообщений об ошибках, нужна типизация. те самые концепты. без них что угодно можно подставить куда попало
для отладки нужно дать отладчику инофрмацию о том какая строка сейчас выполняется и какие у нас есть переменные. а откуда она возьмётся, если текст подвергся обработке препроцессором? и получаешь ты то же самое, как при отладке в высокоуровневой программы на уровне ассемблера
современная реализация ЯП — это не только трансляция его в низкоуровневый код. это ещё куча средств (рефакторинга, диагностики, навигации, отладки, UI-дизайна и т.д.), облегчающая тебе работу. макросы, создаваемые пользователями, либо должны обеспечивать все те же уровни обработки (что уже становится сравнимо с созданием custom-компилятора), либо они будут оставаться чужеродным фрагментом на теле
Здравствуйте, BulatZiganshin, Вы писали:
BZ>для того, чтобы у тебя в шаблонах/макросах не появлялось многоэтажных сообщений об ошибках, нужна типизация. те самые концепты. без них что угодно можно подставить куда попало
Ну это-то понятно. Ему и нужен не текстовый препроцессор, а некий аналог Template Haskell.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
BZ>>для того, чтобы у тебя в шаблонах/макросах не появлялось многоэтажных сообщений об ошибках, нужна типизация. те самые концепты. без них что угодно можно подставить куда попало
K>Ну это-то понятно. Ему и нужен не текстовый препроцессор, а некий аналог Template Haskell.
настолько понятно, что ты ошибаешься
есть три типа макросов: простая текстовая подстановка а-ля #define. синтаксические макросы а-ля TH и C++ templates. и наконец "семантические макросы" а-ля C++ templates with concepts
фишка в том, что TH прверяет типы аргументов только на уровне "здесь должен быть какой-нибудь тип". это откладывает проверки до места фактического использования, получается compile-time dynamic typing. concepts, afair, реализовывали duck typing. а наиболее правильным я считаю, конечно же, static typing — в виде иерархий интерфейсов
и всё это решает только одну проблему макросов, а их множество...
Здравствуйте, BulatZiganshin, Вы писали:
BZ>и всё это решает только одну проблему макросов, а их множество...
Макросы, немакросы. В любом случае очевидно, что необходим более мощный механизм управления компиляцией. Навешивание синтаксических свистоперделок не выход.