LINUX.ORG.RU

В Си предложили добавить switch-case для строк

 , ,


0

3

Привет, чат!

Спустя много лет, в язык Си наконец предложено добавить возможность использовать выражение switch-case для строк. Например, можно будет писать вот такое:

const char *s = get_some_string();

switch(s) {
case "this":
  handle_this();
  break;
case "that":
  handle_that();
  break;
default:
  handle_other();
  break;
}

Таким образом, в Си будет чуть меньше способов отстрелить себе ноги.

Ссылка на предложение: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3895.pdf



Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от yorshka

Emacs отлично работать

Это да, если он работать, то работать отлично. А если пока ещё binutils нужно портировать, а то objdump какую-то чушь выдаёт, тогда как?

VIT ★★
()
Ответ на: комментарий от VIT

Одна из главных, файл на целевую платформу идёт через три шлюза.

Ну, то есть, как я и написал:

На удобном макбуке/сынкпаде не нравится запускать привычный редактор, надо обязательно потрахаться?

yorshka
() автор топика
Ответ на: комментарий от yorshka

Ладно, вы не очень в теме, оставим этот разговор. Просто примите как данное, на начальном этапе разработки не всегда можно «взять и скопировать» текст на целевую платформу. Когда столкнётесь, приходите, может и подкину пару советов. Так вот Си был разработан для начального программирования таких устройств, написания для них базового функционала, чтобы такие как вы потом просто запускали emacs на своём thinkpad или macbook или что там у вас.

VIT ★★
()
Последнее исправление: VIT (всего исправлений: 1)
Ответ на: комментарий от hummer

когда в C++?

Я видел несколько на макросах и constexpr. Например, https://github.com/falemagn/uberswitch:


// Enable nesting
#define UBERSWITCH_ALLOW_NESTING 1

// Include the tool 
#include <uberswitch/uberswitch.hpp>

// The holy grail of the switches: the string switch!
int string2num(std::string s) {
    uswitch (s) {
        ucase ("one"):
            return 1;

        ucase ("two"):
            return 2;

        ucase ("three"):
            return 3;

        // fallthrough works too
        ucase ("four"):
        ucase ("f0ur"):
            return 4;

        default: return -1;
    }
}
    
// More unexpected types work too
std::string pair2string(std::pair<int, int> p) {
    uswitch (p) {
        ucase (std::make_pair(1, 2)):
            return "12";

        // List initialization works too
        ucase ({3, 4}):
            return "34";

        default:
            return "Unknown pair";
    }
}

// You can actually switch over multiple items without packing them explicitly
// and the whole construct is constexpr!
constexpr const char* pair2string(int a, int b) {
    uswitch (a, b) {
        ucase (1, 2):
            return "12";

        ucase (3, 4):
            return "34";

        // And if you don't care about one of the items, you can use a wildcard
        ucase (uberswitch::any, 5):
            return "any5";
            
        // Fallthrough works as well.
        ucase (6, 7):
        ucase (8, 9):
            return "67 or 89";
            
        // And you can of course break out of the switch at any time.
        ucase (0, 0):
            break;
            
        default:
            return "Unknown (a,b)";
    }
    
    return "You found the code to break out!";
}

// Uberswitches can be nested if you define UBERSWITCH_ALLOW_NESTING to 1.
// In that case, fameta::counter will be used to get access to compile time scoped counters, which are needed for the nesting functionality.
constexpr const char* pair2string(int a, int b, int c) {
    uswitch (a, b) {
        ucase (1, 2):
            return "12";

        ucase (3, 4):
            return "34";

        default:
            // Starting a new uberswitch here!
            uswitch (a, c) {
                ucase (3, 5):
                    return "35";
                    
                // And you can of course also break out of a nested switch.
                ucase (0, 0):
                    break;

                default: 
                    return "Unknown (a,b)";
            }
            
            break;        
    }
    
    return "You found the code to break out!";
}

// Within the standard uberswitch the continue keyword acts just like the break keyword, which makes it unusable for its intended purpose.
// However, for those cases in which such a functionality is required, uberswitch_c and case_c can be used. 
// The trailing 'c' stands for 'context', which is an identifier or a number used as the first parameter of both and needs to be kept in synch between them. 
// Uberswitch_c and case_c cannot be used in constexpr functions and require c++17. This is a necessary cost to be able to use the continue keyword as it was intended.
std::string pairs_in_map(const std::map<int, std::string> &map) {
    std::string ret;
    
    for (const auto &p: map) {
        uswitch_c (M, p.first, p.second) {
            ucase_c (M, 1, "2"):
                ret.append("12");
                break;

            ucase_c (M, 3, "4"):
                ret.append("34");
                break;

            default:
                ret.append("[").append(std::to_string(p.first)).append(p.second).append("]");
                continue;
        }
        
        ret.append("-");
    }
        
    return ret;
}

// The above function, given the following map as input:
//
//     std::map<int, std::string> m {
//         { 2, "4"},
//         { 1, "2"},
//         { 5, "6"},
//         { 3, "4"},
//         { 7, "8"}
//    };
//
// Produces the following output:
//
//     12-[24]34-[56][78]    
dataman ★★★★★
()
Ответ на: комментарий от VIT

Ладно, вы не очень в теме, оставим этот разговор.

Я очень в теме, к сожалению.

Просто примите как данное, на начальном этапе разработки не всегда можно «взять и скопировать» текст на целевую платформу.

Кабель порвался?

Так вот Си был разработан для начального программирования таких устройств, написания для них базового функционала, чтобы такие как вы потом просто запускали emacs на своём thinkpad или macbook или что там у вас.

Нет, Си был разработан чтобы наговнокодить недоОС. Такой вот костыльный, как тут упомянули, макроассемблер для PDP-11.

Только это всё было больше полувека назад и не имеет отношения к нынешним реалиям, потому что бэкенд для компилятора на Си всё равно не пишут и на целевой платформе его тем более никто не запускает. Существующие компиляторы (GCC, LLVM) уже давно на C++ и запускаются на билд-серверах. А новых ISA в последние лет 10 не выходило, RV был последней.

С разморозкой тебя, короче.

yorshka
() автор топика
Ответ на: комментарий от yorshka

Только это всё было больше полувека назад и не имеет отношения к нынешним реалиям

Только вы не работаете в проектах такого типа, только и всего. У меня сейчас оборудование установлено на втором этаже, я сижу на первом, задача - оценка производительности оборудования. Прямого доступа, конечно же, нет.

Я больше не хочу с вами общаться. Вы разговариваете непрофессионально.

VIT ★★
()
Ответ на: комментарий от bread

Адресы в Си — это уже абстракция (через MMU и кэши), просто небезопасная. Санитайзеры повышают уровень ещё выше. А само по себе понятие адреса не делает язык высокоуровневым. Повсюду есть адресы.

Абстрактная машина Си больше не описывает реальное железо, особенно если учитывать её целиком, не только адресы. Количество флагов компилятора не случайно так такое огромное. И этот факт тоже негативно сказывается на производительности и сложности, как и у любого другого языка высокого уровня.

Нет никакой низкоуровневой причины, объясняющей почему язык до сих пор не мог бы давать гарантии хотя бы на уровне Паскаля. Проверка границ, сильная типизация, запрет адресной арифметики, автоматическое управление памятью — все эти абстракции ничем не хуже тех, которые в Си уже используются.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 6)
Ответ на: комментарий от yorshka

Что значит зачем? Чтобы деление работало, например.

Я про строки в switch-case

Что такое «чистый язык без стандартных библиотек»?

Когда конструкции языка не требуют подключения библиотек и от них можно отказаться. -ffreestanding -nostdlib -nostartfiles -fno-builtin

Принцип: конструкции языка не требуют никаких библиотек с кодом для их реализации.

Например, в Си можно написать программу без всяких printf(). И даже, если указать линковщику, что будет точкой старта, то и без main():

void _start()
{
    /* low level code without printf() and other, even main() */
    while (1)
    {
        /* infinite loop */
    }
}

Это полноценная программа. Её можно откомпилировать без стандартных библиотек

gcc -ffreestanding -nostdlib -e _start -o nomain  nomain.c

Появление switch case со строками потребует включения функций работы со строками. Или через подключение стандартной библиотеки или через вставку дополнительного кода повсюду, где встретится эта конструкция.

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от yorshka

Кабель порвался?

Прямое подключение недоверенного (произведённого вне своего предприятия) оборудования к целевой платформе не всегда допустимо.

firkax ★★★★★
()
Ответ на: комментарий от yorshka

Ты @hateyoufeel? Уж больно похож по стилю общения и по темам. И текстовый редактор тот же (емакс). Если да, то добро пожаловать назад, было скучно.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

Сейчас набегут адепты графоманов, которые объявили бесконечные циклы UB.

firkax ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Появление switch case со строками потребует включения функций работы со строками. Или через подключение стандартной библиотеки или через вставку дополнительного кода повсюду, где встретится эта конструкция.

Так компилятор и так кучу дополнительного кода вставляет. От замены копирования массива на memcpy до SSE инструкций. Будет ещё один блок, вставляющий префиксное сравнение по switch. С точки зрения использования ничего не изменится: так, как это часть компилятора, то будет работать и в -ffreestanding -nostdlib.

monk ★★★★★
()
Ответ на: комментарий от monk

Я не знаю как вы, а я, например, пока ещё не имею достоверного подтверждения, что LoongArch действительно является новой ISA. Есть заявления от Huawei.

VIT ★★
()
Ответ на: комментарий от VIT

Другого языка может «пока» ещё не существовать под целевую платформу, а текстовый редактор, хотя бы в первоначальном виде, набросать надо, а то grep/sed/sort/tail уже задолбали.

Тогда конечно. Формально у меня была оговорка про «скорее всего» :)

anonymous_incognito ★★★★★
()

Енум в строку и обратно сделать не могут. Зато всякую срань прикручивают.

ckotctvo
()
Ответ на: комментарий от monk

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

VIT ★★
()
Ответ на: комментарий от VIT

Наличие в gcc

-march=arch-type
    loongarch64
        Generic LoongArch 64-bit processor.
    la464
        LoongArch LA464-based processor with LSX, LASX.
    la664
        LoongArch LA664-based processor with LSX, LASX and all LoongArch v1.1 instructions.
    la64v1.0
        LoongArch64 ISA version 1.0.
    la64v1.1
        LoongArch64 ISA version 1.1.
    la32v1.0
        LoongArch32 ISA version 1.0.
    la32rv1.0
        LoongArch32 Reduced ISA version 1.0.

не аргумент?

monk ★★★★★
()
Ответ на: комментарий от VIT

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

Для портирования достаточно проверок в стиле замены строк в switch на вызов функции в виде while ( *p1 && *p1 == *p2 ) ++p1, ++p2; return *p1 == *p2.

monk ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Когда конструкции языка не требуют подключения библиотек и от них можно отказаться

А ты не знаешь, требуют ли они или нет, когда пишешь что-то сложнее бесконечного цикла. Если ты используешь float, тебе может потребоваться softfloat на машинах без FPU. Если ты работаешь с длинными числами (длинее чем машинное слово), тебе требуется библиотека. Если ты хочешь умножение на платформе, где этого умножения нет, тебе требуется библиотека.

Появление switch case со строками потребует включения функций работы со строками. Или через подключение стандартной библиотеки или через вставку дополнительного кода повсюду, где встретится эта конструкция.

Ага. Только этого, как я написал выше, уже требуют существующие фичи языка. Типа, сорян, поезд уже ушёл.

yorshka
() автор топика
Ответ на: комментарий от VIT

Хочешь сказать, что это синонимы к какой-то другой ISA? И к какой? Если скомпилировать в la664 на каком процессоре кроме Loongson запустить можно будет?

monk ★★★★★
()
Ответ на: комментарий от VIT

Это минимальное рабочее решение. Для портирования достаточно. Если же брать нормальное оптимизированное, то на фоне объёма кода для оптимизации, который уже есть в GCC и LLVM, добавление будет практически незаметным.

monk ★★★★★
()
Ответ на: комментарий от VIT

Только вы не работаете в проектах такого типа, только и всего.

Какого? Ты не написал. Сыпешь тут только какими-то из пальца высосанными историями о том, что тебе дескать самому приходится binutils куда-то там портировать. Никакой конкретики, только влажные фантазии героя-ембеддщика, спасающего мир (нет).

У меня сейчас оборудование установлено на втором этаже, я сижу на первом, задача - оценка производительности оборудования. Прямого доступа, конечно же, нет.

У меня оборудование стоит в другом городе в паре тысяч километров от меня и подключено по rs232, JTAG и ещё пачке кабелей к хосту, на который у меня SSH. Всё ещё не понимаю, зачем мне на этой железке нужен текстовый редактор и зачем его туда портировать.

Я больше не хочу с вами общаться.

АЙ АЙ КИСА АБИДИЛАСЬ ЯКИЙ КОШЕМАР!!!11АДЫНАДЫНАДЫН

yorshka
() автор топика
Ответ на: комментарий от monk

LoongArch от 2021.

The ISA has been referred to as «a fork of MIPS64r6» due to a perceived lack of changes judging from instruction listings.

yorshka
() автор топика
Ответ на: комментарий от monk

Есть подозрение - заметьте, подозрение, сейчас я не хочу делать каких-то заявлений, что это расширение Arm-v9 с нестандартным ядром. Но пока у меня нет возможности это проверить.

VIT ★★
()
Ответ на: комментарий от kaldeon

Всегда приятно встретить моих поклонников! ^___^

yorshka
() автор топика
Ответ на: комментарий от Stanson

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

VIT ★★
()
Ответ на: комментарий от VIT

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

А я согласен с этим оратором! Таким образом сишечка тупо сдохнет лет через 20 вместе с уже разлагающимися сишниками. Евгенический подход к проблеме языка Си мне даже нравится, в какой-то мере.

yorshka
() автор топика
Ответ на: комментарий от kaldeon

Абстрактная машина Си больше не описывает реальное железо,

Никогда не описывала. У неё противоположная задача - описать такую машину, которую можно впендюрить в любое железо.

запрет адресной арифметики

Делает бессмысленным само существование си.

r--r--r--
()
Ответ на: комментарий от anonymous_incognito

Да идите вы в жопу со своими «нормальными» строками, которые во всех реализациях представляют собой невменяемое убожество с набором таких же невменяемых функций, да ещё и с отдельным аллокатором для этих извращений. При этом занятно, что среди этих реализаций почему-то никогда не попадается простых (и не менее древних чем ASCIIZ) вариантов вроде длина+содержимое, для которых хотя бы не нужен специальный аллокатор.

Ваши «нормальные» строки с десятком каких-то непонятных счётчиков и индексов, сотней функций на каждый специальный чих, отдельным аллокатором, всякими извращениями для прямого доступа к собственно строке и т.п. нафиг в сишечке не упёрлись.

Stanson ★★★★★
()

Не совсем понял, как это уменьшит кол-во способов ногострела. Раньше, если передать NULL в strcmp() получим null pointer dereference и SIGSEGV на нормальных платформах. А теперь выполнение ветки default. В резутальтае, подобный switch-case просто так на if else не переделаешь. Если там в default заложили проверку на NULL, то нужно будет не забыть её вытащить вперёд до if else.

Ну, и strcmp() в мире unicode не всегда подходит, ведь не случайно добавили strcoll(). Ну дальше вылазит strcasecmp(), которую, может и не оптимально использовать в куче if else, но, иногда имеет смысл...

mky ★★★★★
()
Ответ на: комментарий от r--r--r--

Никогда не описывала. У неё противоположная задача - описать такую машину, которую можно впендюрить в любое железо.

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

запрет адресной арифметики

Делает бессмысленным само существование си.

Вот примерно так сишечка на GPU и работает, да. Абсолютно бессмысленная и беспощадная затея.

P.S. Rust для GPU выглядит ещё калечнее :(

yorshka
() автор топика
Ответ на: комментарий от VIT

Филорастов, да и сами расты принципиально не способны существовать ни в каком виде, кроме как анти-сишечка или анти-что-то ещё.

Кураторами этой порнографии предполагается, что таким образом они смогут как-то перемочь то, к чему они анти- и незаслуженно занять его место. То, что это не работает, кураторам наплевать, их пастве тем более. Бабки на пропаганду выделяются, а остального они вообще не понимают.

Так что объяснять что-то тем, кто либо за деньги, либо по собственному скудоумию устраивает все эти анти- компании, совершенно бесполезно. Это клоуны, которые быстро закончатся в тот момент когда закончится финансирование их язычка. А финансирование закончится.

При этом действительно годные языки типа сишечки никуда не денутся. Так что смысла обращать внимания на эту пиар-компанию нет никакого.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Но эта пиар компания как раз и отвлекает инициативных, молодых, да ранних без большого ущерба для дела.

VIT ★★
()
Ответ на: комментарий от Stanson

При этом занятно, что среди этих реализаций почему-то никогда не попадается простых (и не менее древних чем ASCIIZ) вариантов вроде длина+содержимое …

Здрасьте! “CHARACTER*10 STR”, IBM, 1955.

VIT ★★
()
Ответ на: комментарий от VIT

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

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

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

VIT ★★
()
Ответ на: комментарий от shdown

freestanding implementations нет никакого strcmp

Прикол в том, что оптимизатор gcc определяет в ручную написанные (mem|str)cmp и подобные, и заменяет их вызовами библиотечных функций.

Был такой баг в багтрекере, интересно, исправили или нет.

Так что freestanding без оптимизации.

anonymous
()
Ответ на: комментарий от VIT

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

Stanson ★★★★★
()
Ответ на: комментарий от VIT

Интеллигенция - говно нации! Могу ещё разницу между интеллигенцией и интеллектуалами разъяснить. У меня тут специальная цитата на этот случай припасена.

Человек, который по каким-то придуманным причинам неспособен назвать дерьмо - дерьмом неизбежно работает на какистократию.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Если уже цитируете классика, то делайте это корректно. «Интеллигенция - это не мозг нации, а говно». При этом критикуя интеллигенцию как саботажников и «лакеев капитализма», он сам же и являлся ярким представителем интеллигенции, ну а чьи интересы он защищал мы все прекрасно знаем.

VIT ★★
()
Ответ на: комментарий от VIT

А я не цитировал вообще-то, а озвучивал своё мнение, пусть и сходное с некоей циатой. Я б кавычки поставил и автора указал.

Ну и Ленин ещё тот говнюк был. Но это не значит что он никогда не озвучивал годные мысли.

Все эти отмены дизлайков, CoC’и, толерантность и в том числе вот такое интеллигентское неприятие «плохих» слов - есть одно и то же и растёт из одного и того же места и для одной и той же цели. Расчистить худшим лесенку наверх.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Где это в современных реализациях строк во всяких новомодных язычках?

string_view в С++ как пример простого представления любого ранее определённого пользователем буфера под строку

GPFault ★★★
()
Ответ на: комментарий от VIT

Если уже цитируете классика, то делайте это корректно.

Воистину — cura te ipsum.

Корректная цитата из письма В.И. Ленина А.М Горькому (от 15 сентября 1919 года) выглядит так:

«Интеллектуальные силы» народа смешивать с «силами» буржуазных интеллигентов неправильно. За образец их возьму Короленко: я недавно прочел его, писанную в августе 1917 г., брошюру «Война, отечество и человечество». Короленко ведь лучший из «околокадетских», почти меньшевик. А какая гнусная, подлая, мерзкая защита империалистской войны, прикрытая слащавыми фразами! Жалкий мещанин, плененный буржуазными предрассудками! Для таких господ 10 000 000 убитых на империалистской войне — дело, заслуживающее поддержки (делами, при слащавых фразах «против» войны), а гибель сотен тысяч в справедливой гражданской войне против помещиков и капиталистов вызывает ахи, охи, вздохи, истерики.

Нет. Таким «талантам» не грех посидеть недельки в тюрьме, если это надо сделать для предупреждения заговоров (вроде Красной Горки) и гибели десятков тысяч. А мы эти заговоры кадетов и «околокадетов» открыли. И мы знаем, что околокадетские профессора дают сплошь да рядом заговорщикам помощь. Это факт.

Интеллектуальные силы рабочих и крестьян растут и крепнут в борьбе за свержение буржуазии и ее пособников, интеллигентиков, лакеев капитала, мнящих себя мозгом нации. На деле это не мозг, а говно.

«Интеллектуальным силам», желающим нести науку народу (а не прислужничать капиталу), мы платим жалованье выше среднего. Это факт. Мы их бережем."

Как видно из приведённой цитаты, столь уничижительную характеристику Ленин даёт не всей интеллегенции скопом, а лишь её части, «прислужничающей капиталу вместо того чтобы нести науку народу».

anonymous
()
Ответ на: комментарий от GPFault

Ага.

Давайте прилепим к кучке байт жирнющий vtbl от std::string с кучей дублирующих функций типа start/front (кстати, не понимаю нахрена в цепепе принято каждый раз функцию заново писать в таких случаях, вместо того, чтобы просто указатель на уже имеющуюся присвоить соответствующему полю vtbl, х.з. может оно компилятором оптимизируется как-то, но нафига?), и будем таскать это всё дальше по коду вместе с каким-нибудь смешным «asdf», который на порядок меньше этой всей красоты.

Я вот как раз об этом и говорю. И нет, std::string - это вообще ни разу не нормальная строка.

Stanson ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.