Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Говностандартизаторы очередную хуйню изобретают. Нет чтоб нормальную гомоиконность сделать, чтоб через нее любую такую поебень синтезировать можно было, не изменяя говностандарт, не добавляя всяких новых statement. И почему они не хотят эту херню прикрутить тупо к switch? Что если у меня переменная называется inspect, мне ее что, переименовывать?
Давайте пропосал напишем, чтоб для стейтментов отдельные неймспейсы были, и чтоб можно было свои самопальные стейтменты написать на каком-то отдельном говноязыке (шаблоны под эту хуйню, как я понял, не подходят)? Ну чтоб у всех окончательно сорвало крышу от обилия хуйни.
О, паттерн-матчинг завезли! Полезная штука, жаль только, что, как всегда, получилось перегруженное, вербозное и костыльное говно.
Кстати, в 4.6 что-то знакомое:
Оператор сатурн нужен только там, где есть перегрузка по возвращаемому значению.
Именно её и не хватает в С++.
Хотя при наличии операторов для каста ее легко реализовать
А я предлагаю встроить констукции из языка «Парсер».
$n(2*2) — присвоить переменной n результат выражения 2*2, т. е. 4.
$s[2*2] — присвоить переменной s строку "2*2".
$x{$s} — выполнить код в фигурных скобках и присвоить результат переменной x.
5.3.2.6 Dereference Pattern
The dereference pattern has the following forms:
* ! pattern
* ? pattern
The first form matches value v if pattern matches *v.
The second form matches value v if v is contextually convertible to bool and evaluates to true, and pattern matches *v
> Что если у меня переменная называется inspect, мне ее что, переименовывать?
Вот кстати да. Ладно там «constexpr» заняли — такого идентификатора реальный пример вряд ли можно привести. Но блядь, «inspect» в любом крупном проекте есть! Они там совсем ёбнулись, чи шо, я не пойму?..
Но в них же идентификаторы функций не выделяются на фоне ключевых слов. Там только переменные выделили. А в «Алголе» можно было выделять и имена переменных, и имена функций.
Вот это нехорошо. С ФВП возникает какая-то питушня, когда есть такая разница. С пониманием функции как питуха первого класса вознивает какая-то питушня.
В перле вроде & можно. В Tcl зарезервированных слов нет, можно переопределить хоть if, хоть set, хоть proc (даже # можно (комментарий) но напрямую вызвать не получится).9
... раздался пронзительный голос со стороны параши.
Но комитет, как всегда, не обратил внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Компилятор — не человек, и сегодня ему предстоит очень трудная сборка. У него уже в течение полутора лет каждая сборка была очень трудной, и теперь его лексер был разработан настолько, что одно и то же выражение могло обозначать что угодно, в зависимости от контекста.
У меня был случай, когда у юзера распидорасило жопоскрипт из-за русского комментария («\n» затерялся). Сванговал в чём может быть проблема и воспроизвёл, оказалось у него в браузере была установлена какая-то японская кодировка.
Самое страшное в JS — подразумеваемая точка с запятой (забыл, как точно называется эта особенность).
Если, вставить лишний перенос строки, может случиться неожиданность. Допустим, фразу «return 42;» разбили переносом:
return
42;
Для JS «return» является законченным выражением (когда функция ничего не возвращает, как void в сишке), поэтому код будет интерпретироваться, как будто написано так:
return;
42;
Были реальные примеры, когда минимизаторы и обфускаторы JS портили код переносом в неудобном месте.
Почти да, но смотря что под ко-ко-контекстом понимать.
Если необходимую для вычислений память: У лексера контекст структурно проще. Смотрит он конструкцию 0+"123", и на подходе к двойке ему нужно помнить, что он вошёл в строку - это будет его контекстом. У парсера контекст будет "вот эта питушня вроде подошла под набор хитрожопых правил с рекурсией.
С другой стороны, название "КС" как бы намекает, что контекста нет, но это уже в другом смысле.
Кстати, в 4.6 что-то знакомое:
Какой калькулятор )))
Ой, пиздец. Почему бы не насыпать ещё больше спецсимволов, а?
Во-о-от, теперь — заебись! Именно так, по мнению этих говностандартизаторов, и должен выглядеть код на «Modern C++».
Именно её и не хватает в С++.
Хотя при наличии операторов для каста ее легко реализовать
$n(2*2) — присвоить переменной n результат выражения 2*2, т. е. 4.
$s[2*2] — присвоить переменной s строку "2*2".
$x{$s} — выполнить код в фигурных скобках и присвоить результат переменной x.
Красиво?
https://www.parser.ru/docs/lang/?vars.htm
Сейчас модно во всё пихать «Lua».
Помнишь mod_rewrite в apache, кстати?:)
https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
Я запутался. Уже и ТАКОЕ в крестах компилируется?
Впрочем в С# завезли. В Скале было. В Жабу скоро завезут.
Чем C++ хуже?
Ну типичный С++ way. Взяли нормальную идею и дико всё усложнили.
а как это читается?
Поскольку он пока ещё сохраняет остатки читабельности.
Они готовят С++ к мерджу в Perl 6
Вот кстати да. Ладно там «constexpr» заняли — такого идентификатора реальный пример вряд ли можно привести. Но блядь, «inspect» в любом крупном проекте есть! Они там совсем ёбнулись, чи шо, я не пойму?..
Но комитет, как всегда, не обратил внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Компилятор — не человек, и сегодня ему предстоит очень трудная сборка. У него уже в течение полутора лет каждая сборка была очень трудной, и теперь его лексер был разработан настолько, что одно и то же выражение могло обозначать что угодно, в зависимости от контекста.
Это парсеру потом надо пердолиться с вореантами и тормозить из-за этого.
Символ и символ.
Лексер понятию "контекст" не обучен, ибо конченный автомат.
А вот парсер должен контекстно-зависимые штуки понимать
Да?
Ситуация осложняется тем, что в js не так давно завезли новые алгебраические операторы.
А тебе еще жжётся?
Это вообще багор
Питушня свинцовой кастрюлей повисла над нами
Если, вставить лишний перенос строки, может случиться неожиданность. Допустим, фразу «return 42;» разбили переносом:
Для JS «return» является законченным выражением (когда функция ничего не возвращает, как void в сишке), поэтому код будет интерпретироваться, как будто написано так:
Были реальные примеры, когда минимизаторы и обфускаторы JS портили код переносом в неудобном месте.
Если необходимую для вычислений память: У лексера контекст структурно проще. Смотрит он конструкцию 0+"123", и на подходе к двойке ему нужно помнить, что он вошёл в строку - это будет его контекстом. У парсера контекст будет "вот эта питушня вроде подошла под набор хитрожопых правил с рекурсией.
С другой стороны, название "КС" как бы намекает, что контекста нет, но это уже в другом смысле.
Какой C++ )))
P.S. Идея для любителей понаотвечать на старые треды: если видите, что код читаемый и не содержит фич цпп2017+, пишите "Где здесь C++?"
Впрочем у них хватило ума switch не переименовывать. Там yield вместо break замутили.
https://openjdk.java.net/jeps/354
слово yield теперь есть в разных языках, и в каждом оно значит разное
Скажем,
@inspect