Пост-антисрач: обсудим любимые языки программирования
Собственно, сабж.
А то всю неделю посты-флудилки какие-то скверные — скандалы/интриги/расследования еще туды-сюды, но три последних случая уже за гранью.
Давайте пообщаемся, как порядочные люди. Надоело читать унылые перекидывания шкурками.
И чтоб не быть голословным, мой список, в примерном порядке от самых лучших к менее лучшим, хотя сравнивать иные довольно сложно:
1) ObjectPascal — сделан людьми и для людей, имхо, лучший из языков общего назначения.
2) C# — всё то, что хотел бы иметь в ObjectPascal, но не мог иметь за отсутствием.
3) Basic (процедурный, не ООП) — теплый и пушистый, язык детства :-)
4) Компонентный Паскаль (он же Оберон, но не совсем Оберон) и D — это типа платонической любви, любить люблю, но использовать почти не использую :-(
Ваши варианты и предпочтения?
PS: Упреждая вопрос — С и С++ я не то, чтобы совсем не люблю, да и использовать приходится повсеместно — но считаю их порождением укуренных 70-х, сотворенными ради стёба над разработчиками и крайне сложными для практического использования в серьезных проектах. Субъективно, конечно.
А то всю неделю посты-флудилки какие-то скверные — скандалы/интриги/расследования еще туды-сюды, но три последних случая уже за гранью.
Давайте пообщаемся, как порядочные люди. Надоело читать унылые перекидывания шкурками.
И чтоб не быть голословным, мой список, в примерном порядке от самых лучших к менее лучшим, хотя сравнивать иные довольно сложно:
1) ObjectPascal — сделан людьми и для людей, имхо, лучший из языков общего назначения.
2) C# — всё то, что хотел бы иметь в ObjectPascal, но не мог иметь за отсутствием.
3) Basic (процедурный, не ООП) — теплый и пушистый, язык детства :-)
4) Компонентный Паскаль (он же Оберон, но не совсем Оберон) и D — это типа платонической любви, любить люблю, но использовать почти не использую :-(
Ваши варианты и предпочтения?
PS: Упреждая вопрос — С и С++ я не то, чтобы совсем не люблю, да и использовать приходится повсеместно — но считаю их порождением укуренных 70-х, сотворенными ради стёба над разработчиками и крайне сложными для практического использования в серьезных проектах. Субъективно, конечно.
272 комментария
Ха-ха
Питон говно
Хотя, сам язык в принципе прикольный, особенно его идейно правильная объектная модель,
но то куда его сейчас пытаются пропихнуть это просто пушка.
Слушай, а тыж погромист? Ты должен знать почему у Джираи призыв — язык, у Орочимару призыв — язык, а у Цунаде призыв — кусман текста.
Спойлер
Я бы поспорил. У меня на Дуньке система автополива растений, и поворотный стол для предметной съёмки в процессе сборки. Моя, теперь уже бывшая контора вообще клепала сотни девайсов на Дуне на продажу, и весьма успешно. Я уже не первый раз слышу мнение о том, что Ардуино — это несерьёзная платформа, и чисто на поиграться, но не понимаю, с чего оно возникло (факты и практика говорят о пригодности для серьёзных целей)
А с чем? Я не говорил что ардуино прям только для свистелок-перделок. Кому-то поиграться, а кто-то умный дом на ней собирает. Ты ведь и сам знаешь что на ардуине проще и быстрее собирать чем брать отдельно МК и с нуля обвешивать его железками и прошивать аки синхрофазотрон.
Я так понял, что не всё и страшно, достаточно начать с минимальной обвязки и кустарной схемы прошивки через COM или LPT.
Сам еще не дошел, правда :-)
Вроде как PonyProg для начинающих дружелюбен.
Но опять же сам еще не дошел.
А залоченный МК это неизбежные потери. Я сразу себя пять штук по полтиннику взял самых простых, на первые шаги. Часть спалю по-любому.
Тогда надо смотреть всякие AVR-IDE и прочую подборку.
Нужно начать, я так думаю. Как с LPT играться закончу, займусь.
Примеры аналогичного кода в Интернет искал?
Потому эти работы и сложные. Чисто схемы — там проблемы железные. Чисто софт — там биты и байты ищем. А тут нужно держать всё и сразу в голове.
Я помню, что таймеры точного времени должны как-то инициализироваться.
Мне обошлось:
Arduino nano — 287,80
Gps модуль GY-NEO6MV2 — 335,20
OLED дисплей — 206
Еще я другую антенну ради сравнения с штатной заказал за 178,59
Питать можешь от тех же крон или сборки пальчиковых батареек (как это реализовано в навигаторах Garmin)/
Корпус — любая коробка которая тебе приглянется.
По той же причине, по которой сишники ругались на Delphi с момента его появления.
Снобизм.
На С++/WinAPI нужно страдать и превозмогать, читать сотни страниц руководства и вызовов, а тут любой школьник мышкой повозил, приложение собрал и уже продаёт его.
МегаПрога
Ясень пень, Си и его потомки — это промышленный стандарт, сам много чего пишу, по желанию и по необходимости.
Допустим, у меня есть желание написать какую-нибудь хуйню для uefi на русте.
Скорее всего я найду какой-нибудь враппер, написанный какими-то васянами ради лулзов, с непонятными доками, ссылки на которые протухли еще во времена царя гороха.
У руста такие проблемы сейчас и правда есть. Но это дело времени, новые языки в принципе не могут со старта иметь сразу миллионы либ с доками на все случаи жизни, сами языки от этого хуже не становятся
И вообще возьми да сделай свой враппер с качественными доками, чо
Ну, если ты, конечно, не кровавый ынтырпрайз с программистами, работающими за еду, у которых срок сдачи проекта вчера и пилить либы с доками просто некогда. К счастью, тот же руст (ну и, может, даже гошечка) демонстрирует, что такие кровавые ынтырпрайзы не у всех, и пилить либы с доками всё же есть кому, и я буду надеяться, что однажды руст переплюнет эти ваши сишечки и тебе завезут нормальный uefi враппер)
85к строк за один день не пишутся, так что народ определённо видит преимущества.
Круто, чо. Это за сколько там лет существования Раста?
Касаемо потери функционала — ну, если способность написать непонятную хуйню, которая крашится через раз со случайной ошибкой для тебя важная фича, то руст тебе не зайдет, да.
А да, читаю наперекосяк, кроссплатформенность. Ну это вообще странно ставить C++ в достоинство, ибо с кроссплатформенностью там боль, с LLVM или без.
Эм, я еще не углублялся очень уж глубоко, но проекты на 1000-2000 строк у меня под Linux собирались без проблем, то, что исходно для Windows делал.
Если, конечно, не было #include <Windows.h>
Даже Java не идеал, хотя я запускал много и оно работало хорошо.
Да, с «абсолютно» я чутка погорячился. Что не отменяет того, что, например, тот же руст очень даже сравним (если у измеряльщиков руки не кривы, а то всякое бывало)
«Порождение укуренных» — это кресты.
А еще мне вполне себе нравится жаба, лол. Кроме дженериков, дженерики там эквивалентны затычке, и толку от них куда меньше чем от крестовых шаблонов, не смотря на то что они типа не Ъ полиморфизм и все такое. Хуй знает зачем они там вообще нужны.
Но все же, именно после жабы до меня начало доходить в чем мякотка ооп.
А еще я люблю пыхтончик.
понячий куб
Уж лучше так, чем про заявления, домогательства, пьяных оргов и озабоченных юзеров.
PS: Мой пост содержит некоторую иронию, но только некоторую.
А мне и норм, всё равно спать не хочу.
Инкапсуляция, наследование, полиморфизм. Больше ничего не нужно.
Остальное — это толстые справочники паттернов, чтобы не изобретать велосипеды. Мартин Фаулер вам в помощь.
Если ты работаешь в компонентно-ориентированном подходе, например, мост тебе нахрен не сдался.
Вот я сейчас страдаю *возможно, даже начну реализовывать) насчет универсального движка, который мог бы использовать OpenGL и DirectX, а на уровне функции рендера — вызывать обобщенный Frame->Render().
И как тут без двух иерархий параллельных?
Но у меня так не получается.
Тут главное просто понимать, что ООП, мягко говоря, не всегда оптимален, и интересоваться, как можно сделать еще.
Спойлер
Не стоит мне этого говорить, наверное, но мой любимый язык — это, пожалуй, C++. Гибкий и мощный, он дает большую свободу, хоть и не полную; но язычок этот с острым нравом. Внешне безобидный код может вызвать неопределенное поведение только так, и если не знать язык во всех тонкостях, он может изрядно попортить нервы. Кроме того, если в нем сильно отдаляться от идеологии zero overhead, то он будет не самым лучшим помощником. Если бы меня заставили дать совет по плюсам — не недооценивайте и не переоценивайте его. Горячо посоветовать писать на нем также не могу.
В силу недостатка опыта знаю я языков очень немного. Окромя плюсов, их всего-то: C, MATLAB и немного Python. Pascal забыл после школы. По совету одного умного человека отсюда решил начать изучать Go, и мое отношение к плюсам стало более уравновешенным. (Но меня дико смущает, что гошные бинарники большие получаются. Ну не должен Hello World весить под мегабайт, не должен!)
Фиг знает, но у меня ощущение, что каждый второй понилюб — айтишник, а каждый пятый — профессиональный разработчик :-)
Словно форум анимешников.
Я акцент сделал именно на этом слове не просто так!
Грубо, когда ты пишешь Writeln('Hello'); это лучше, чем пять строк ассемблерного кода. В пять раз ниже вероятность ошибки.
С++ — больше я ни на чём сейчас даже Hello World написать не смогу.
Выдам просто свои впечатления:
С — идеально для байтоебских задач, большие программы целиком писать бы не стал;
С++ — мой любимый и основной язык. Дает хороший контроль над ресурсами, есть много годных и отполированных либ практически подо все, что угодно;
С# — как по мне, тонны лишнего кода приходится писать из-за жестко вшитого классового подхода. Не показался ничем интереснее С++;
Питон — охрененный инструмент для написания всяких простых обработок;
Lua — как Питон, только ЕЩЕ проще. Хороший скриптовый язык;
Java — сейчас не знаю, когда писал на ней давным-давно была очень тяжелой и неудобной.
Веб-языков особо не касался, так что про них сказать ничего особо не могу. Кроме PHP. Это пиздец язык-помойка.
Чисто теоретически, на нём можно написать скрипт, под воздействием которого странные программюги становятся не странными.
Фортран и ассемблер
Что не избавляет от знания кучи всего от бейсиков и С++ до извращений тира Питона, Рапиры и одного из первй языков ИИ — Форта. Аду не знаю, сразу говорю…
Спойлер
С C++ связаны тёплые воспоминания первого опыта в ООП, но он тупо слишком громоздкий. Ну и основная (для меня) проблема этого языка — сборка. Почему то никогда ничего не хочет с первого раза подключаться...
WebBrowser вставляешь в форму, запускаешь локальный http-сервер внутри C# и побеждаешь.
Я так делал и было очень удобно. Плюс, когда клиент возжелал сделать сайт такой же — почти ничего не переделывал, только собрал CGI на C#.
Qt с его библиотеками стоит довольно близко, но там порог вхождения выше.
У хороших вещей порог вхождения действительно обычно выше
Я в курсе, но я прикладник-бизнесмен, мне чем быстрее сделать и сдать, тем быстрее получу денежку и накормлю семью ужином.
А считать оперативку в 2018, когда линейка на гигабайт стоит как бургер — ну не показатель.
Ты накормил одну свою семью, а миллионы других семей по всему миру нервничают и недоедают из-за недостаточной производительности элементарнейших программ, не надо так
И тем доволен.
«Нельзя ли то, что они недоедают, собирать и присылать нам?»©
Вопрос, конечно, достаточно старый — но по факту, чем проще и быстрее разработка, тем более эффективна отрасль. Я тоже люблю ковырять asm для linux, радуясь, как я легко впихиваю в 2Кб целую программу с GUI.
Вот только для клиентов я пишу на C#, потому что на asm я буду делать её тридцать лет и три года.
Если бы сейчас делали строго на технологиях нативного кода и нативных же интерфейсов — софт стоил бы сотни нефти и писался бы годами, да и программистов было бы в 100 раз меньше. Примерно на уровне начала 90-х была бы отрасль. Никому бы не понравилось.
И зачем мне тратить кучу времени, чтобы выучить кустарный интерфейс только для конкретной платформы, когда я могу выучить стандартный HTML и писать под что угодно?
Я не сотка баксов, чтобы меня все любили.
За деньги делаешь как надо.
Всё ж просто.
А то гениальных программистов много, а Windows только одна.
Кроме того, я вообще не понимаю этой практики написания «типа десктопных» приложений на html/css/js, особенно если речь идет о каком-нибудь сраном мессенджере. Ну если ты такой весь из себя веб-мачо, или тебе просто лень писать нормальный гуй на кутях, ну напиши ты сайт. Один фаерфокс всяко-разно будет занимать меньше памяти чем полтора.
В чем-то уступающий тому же Qt или Java, в чём-то превосходящий.
Это настолько здоровенный костыль, что прям не костыль уже, а фича.
Зато офигенные возможности по настройке GUI — нарисовал черно-белое, отправил дизайнеру, он сделал CSS-файл и опа — твой невзрачный проект уже смотрится как ёлочка нарядная.
Сравнить это с унылыми интерфейсами Java.
В Qt есть подобное (можно ставить CSS для компонент), но куда менее удобное на прикладном уровне.
В 2008 — 256Мб? Аскетичненько. XP по минимуму занимает 128 в памяти, на софт всего 128 остаётся.
Ставил клиентам всегда по 512, везде были благодарны как слоны, ибо подкачка в те благостные времена тормозила как улитка на склоне.
Вот на этом школьном ноутбуке вроде бы 512МБ оперативки, 2010-2012
(Фоточек компьютера с 256МБ оперативки, на который даже убунта 12.04 отказывалась ставиться, не осталось)
Мои клиенты за такими машинками не работают, потому что чтобы стать клиентом и заказать что-то — нужно как минимум иметь деньги на заказ, а раз ест деньги на заказ, то есть деньги и на новое железо.
Отсюда следует простое и очевидное правило — музыку заказывает тот, кто платит.
В глубине души (где-то очень глубоко) меня тоже печалит тот факт, что задачи, которые успешно решались в конце 90-х на компах с 32мегабайта ОЗУ, ныне требуют гигабайтов оперативы. Но так устроена эта отрасль.
Даже 32-битная система держит три гига, а где сейчас 32-битные видим? Почти нигде.
А софт, который будет жрать не гигабайт, а скажем, в десять раз меньше — очевидно, и стоить будет в десять раз дороже :-) и если я клиента поставлю перед выбором, платить мне сотку — или платить десятку, но докупить память, что он сделает?
Это потому что ты застрял в 90-х и игнорируешь современные библиотеки и инструменты разработки) Да хотя бы взять Python с PyQt — пусть он тоже весьма прожоривый, но жрать будет всяко раз в пять-десять меньше относительно браузерного аналога.
Впрочем, тебе же норм, зато ты можешь затребовать в десять раз дороже. Ну вот примерно за это я тебя и ненавижу :3
Если реально для разработки нужно использовать серверную конфигурацию базы данных — ставится второй ПК, только для базы.
Я тоже пытался одно время запихивать всё на один комп, потом понял, что иметь три машины — одну для базы, одну для файлов и одну для разработки — зверски удобно. Учитывая то, что простенький комп стоит меньше, чем мне платят за один заказ — вложение копеечное, зато ты точно видишь, где у тебя проблемы. Если сервер базы начинает орать как резаный — значит, всё с GUI хорошо, это база тормозит. А если сервер базы молчит, а вместо окошек пятна цвета Рарити — твой интерфейс не справляется.
Qt я знаю и использую, только с С++. И там, где нужен быстрый надежный интерфейс, переносимый — его и применяю. Только это дорого и долго, и мало где реально нужно (реально — значит, что затраты времени моего и денег клиента оправдано).
Еще раз, бизнес диктует требования. Для себя любимого я вообще порой на QuickBasic пишу, ибо приятно.
И нет, это не для разработки, а просто репликация основной базы данных
На PyQt — легко и быстро. Говорю же, ты застрял в 90-х)
Почаще говори это клиентам, и некоторые даже будут давать. А еще лучше включать стоимость закупок новой техники в счет разработки ПО.
То есть, таки серверная задача?
Убедил, я потрачу некоторое время на изучение современных нативных средств и библиотек.
Конечно быстрее, но это не значит, что нужно делать только так.
Если что, я не упертый фанатик, я просто предельно рационален в этих вопросах, ибо моё время — мои деньги, а оператива и камни клиентов — проблема клиентов.
Там, где задача требует нативного кода и быстрых компактных систем — я делаю именно так. Но такое бывает раз в пятилетку.
Может это не он застрял, а отрасль под которую он ПО делает.
IT-отрасль не менялась лет 20 — нужно ввести данные, обработать их (чаще всего, суммирование или получение количества), и передать куда-то.
Просто раньше это был FoxPro и всякие dBaseIV, данные на мегабайты и передача по нуль-модему, а сейчас .NET со SQL, данные на терабайты и передача по толстому кабелю.
Если не брать в расчет игры и мультимедию, то изменения больше вокруг удобства и мощностей, чем принципиально новых задач. Ну еще BigData можно притянуть за уши как новую сферу, и то лишь благодаря переходу количества в качество, как дедушка Энгельс писал.
В универе я встречался со страстной девушкой, но она была чересчур эмоциональной. Каждый пустяк превращался в страшную драму и грозил ей самоубийством. Я решил жениться на стабильной женщине. По окончании универа в встретил очень стабильную девушку, но она оказалась ужасно скучной. Она была абсолютно предсказуемой и никогда не теряла голову. Жизнь с ней превратилась в рутину, и я решил жениться на девушке с
изюминкой. Девушка с изюминкой оказалась слишком шебутной. Она постоянно кидалась в крайности, заставляя меня чувствовать то суперсчастливым, то супернесчастным. Она была суперэнергичной, но без целей в жизни. Я решил женится на той, у которой есть настоящие амбиции в жизни. Тогда я нашел себе умную, амбициозную девушку и женился на ней. Она оказалась настолько умной и амбициозной, что развелась со мной через год и отсудила себе все, что я имел. Теперь я поумнел и стал мудрым, и ищу себе женщину с большими сиськами.
За последние 20 лет успел пописать на куче всего: Pascal/ObjectPascal/Basic/C/C++/C#/Java/Perl/PHP/Python и понять что любовь всей жизни у меня одна — JavaScript.
Он — как английский в мире языков программирования:
— его знают почти все
— даже на ломаном можно изъясниться и тебя скорее всего поймут
— он есть везде
— для того, чтобы им пользоваться, не нужно вообще ничего устанавливать и настраивать в обязательном порядке — это всегда неотъемлемая часть как минимум браузера, а браузер — неотъемлемая часть любой современной пользовательской ОС
— ему нет альтернативы в сети (и слава богу)
— нет языка гибче
— это вечная разминка для мозгов, позволяющая держать их в тонусе
И о шуточках
Сможешь так на асме? =) Так еще только разве что на брейнфаке можно.
* сейчас, наверное, таких спартанских процессоров уже нет. Но когда-то они были, если верить тому, что я узнал из интернета.
Гибкость языка программирования, в том смысле в котором большинство людей понимает этот термин, прямо таки обратна необходимости делать на нём вещи через задницу, потому что других способов сделать это нету.
А в чем отличие языка описания алгоритмов от языка программирования?
Практически каждый императивный язык программирования является языком описания алгоритмов, но не каждый язык описания алгоритмов является языком программирования — только те, которые могут порождать рабочие программы.
Я не специалист по микропроцессорной архитектуре, но вроде бы деление было доступно начиная аж с 386-ых.
Не уверен, что в процессорах более современных есть какие-то проблемы с этим.
Возможно, это я просто такой тупой и не знаю всех тонкостей программирования на C. Чтоб писать на нём хоть что-то минимально рабочее — знать и уметь нужно больше чем с ассемблером. А что тогда говорить про ещё более абстрагированные от железа языки?
Это даже не полноценный язык, поскольку он написан на луа, и включен в мод на гаррисмод в составе wiremod ((
Имхо, самый не любимый это C. Чтобы начать писать нужно покрыться свитером, щетиной, хардкором и безумием. Сначала кажется просто, но когда код становится сложней хело ворлд, то проще жопой могилу выкопать для себя и всех живых в радиусе 5км.
А крестики хорошие хоть уже немного устаревшие, ибо в большинстве случаях возня ради 1% производительности/памяти/чсв особо не роляет.
Современные яп и фреймворки позволяют быстро сделать софт, что в современных реалиях является более главной задачей, чем написать абсолютных код.хотя когда банальный чатик жрет 4гб оперативки жопа начитает гореть
Объективности ради, С — это кроссплатформенный Ассемблер, работает на низком уровне и везде, что конечно, круто.
Осмотрев все сегодняшнее языковое многообразие, вижу, что для создания оконной программки под винду, которая бы не использовала всяких дотнетов, джава-машин и сиплюсплюс-рантайм-фигни, лучше дельфи ничего нет. Все остальное сложное и замороченное, а тут запустил — и все уже готово, только свою логику впихуй. Возможно лучше взять лазарус, шоб прям кроссплатформенно было. Он вроде работает, но я с ним мало игрался. (Ну да, сишарп тоже делает окошки похожим способом, и хоть и требует дотнет, но он и так на любой винде сегодня есть. Но чет не пошло у меня с ним. Пару раз брался поизучать и бросал. Сложно как-то, заморочено, на джаву похоже, а джава для меня вообще какая-то Ада — перегруженная и сложная).
А питон — «быстро сделать что угодно, не требующее гуи». Много чего встроено, библиотеки на все случаи жизни, а главное — почти любая проблема и любой вопрос «как сделать» гуглится, что для меня, не занимающегося программированием плотно и профессионально, очень большой плюс )
В C# много чего взяли от Delphi, на самом деле.
ЕМНИП, там даже люди из дельфийской команды работали.
1) Сохранение объекта в поток — одной строкой
(new BinaryFormatter()).Serialize(File.Create(«obj.dat»), obj);
2) Подсчет чего-то в обобщенной коллекции (например, единорогов с уровнем магии выше 100 в списке пони):
list.Count((pony)=>pony.isUnicorn() && (pony.MagicLevel>100));
3) Копирование объекта с данными:
var newpony = (Pony)pony.Clone();
4) Автоматическое удаление объекта по выходу за пределы его блока
using (var helper = new ponyHelper())
helper.doHelp(pony);
В топку дерево из сотни if then else на создание субклассов.
Производительность и расходы памяти, да. Но этого добра хватает, если бы наши отцы программисты узнали, что мы прошли путь от их 64Кб массива до 64 Гб для данных — они были бы в шоке.
2) Опять что-то непонятное, я не понимаю этот синтаксис.
3) Мой верх — процедурное программирование, объекты для меня черные ящики с процедурами, которые я никогда не создавал сам.
4) Обоже, опять объекты…
По-моему, так и должно быть. Это чёрный ящик, ты знаешь, для чего его используют люди, но не знаешь, что у него внутри.
Не знаю. Крутые программисты кругом постоянно говорят о классах, объектах и я почти никогда не понимаю о чем конкретно они говорят. Про саму концепцию ООП читал давно и несколько раз, но до сих пор не понимаю ее нужности. В моих маленьких программах она просто никогда не была нужна. Мне не нужно «копировать объект с данными», я не знаю для чего это нужно ) Я не знаю зачем сохранять объект в какой-то поток, потому что не знаю что такое «поток». Я не знаю что такое «обобщенная коллекция» и почему в ней сложно что-то подсчитать. Я не знаю что такое «блок» и почему я должен что-то удалять при выходе за его пределы )
В С# — таки объекты. Это жрет память и процессор, но открывает бездну возможностей в плане умножения слонов на ужей и складывания теплого с мягким.
Класс для меня это тип данных. record (в ваших сях struct вроде), в котором процедура может быть… полем? Я правильно это назвал? ) В общем, подпунктом.
В большинстве ООП языках для всех этих integer и прочих float эти понятия совпадают.
В Паскале это запись, в ruby это делается прописанием аттрибут-доступа в классе (ну или прописанием метода) Так что myCar.amount_of_wheels = 4 — это сколько колес у объекта myCar. А все, что идет в объекте myCar, его свойства и прочее, прописаны в классе Car.
Класс Car — множество натуральных чисел, делящихся на 35, допустим.
Объекты класса — это именно что числа, делящиеся на 35 (35, 70, и тп и тд)
Методы — это что можно делать с объектами. В этом случае можно умножать, складывать и прочее.
Нарф, я правильно все понял?
Нет, ну класс — это обычно тип данных. Что с этим творится в нетипизированных языках, типа жабаскрипта — вопрос сложный; но там класс, по сути, являет из себя функцию-фабрику, производящую инициализацию объекта, от которого потом вполне можно отпилить пару конечностей и заменить их клешнями.
В некоторых ООП языках всё является объектами, в других — не всё. Например, примитивные типы или функции зачастую ими не являются.
Неа. То что вы прописали — это может означать модульную систему. Многие модули так устроены: есть какой-то тип, к примеру, комплексных чисел, и кучка функций, работающих с этим типом(см complex.h). Но пока вместе с данными не хранится инфы на то, как их обрабатывать — объектами это и не пахнет.
void main(void)
{
a:; malloc (1); goto a;
}
{
a:; new int; goto a;
}
Мимо только начал sicp
Это кому-как. А у меня тёплым и ламповым был АП-Автокод. Да, древнее зло застало его на излёте, когда он плавно перетекал в «Аналитик».
Кто помнит эту прелесть?..
допустим ситуацию, функция f принимает foo, foo, int и возвращает bar, и у нас есть переменные var0 и var1 типа optional<foo> и num типа int. Тогда придется писать
вот было бы круто вместо этого иметь возможность написать
optional тут только как пример — их еще кучу можно придумать:
для var типа tuple<foo, bar>, f принимающей foo и возвращающей foof, f принимающей bar и возвращающей barf выражение f(mappedOver(var)) разворачивалось бы в tuple<foof, barf>(f(var[0]), f(var[1])),
то же для массивов, и в целом любых itable objects/ranges
для var0, var1 типа future<foo> и f принимающей и возвращающей bar — f(whenReady(var0), whenReady(var1)) превращался бы в который готов когда оба var0 и var1 готовы и содержит результат вызова f со значениями содержащимися в var0 и var1
для foos типа tuple<foo, foo>, bars типа tuple<bar, bar>, f принимающей foo, bar и возвращающей int
* f(mappedOver(foos,0), mappedOver(bars,0)) разворачивалось бы в tuple<int, int>( f(foos[0], bars[0]), f(foos[1], bars[1]) ) (т.е. мы развернули foos и bars по одному измерению),
* f(mappedOver(foos,0), mappedOver(bars,1)) разворачивалось бы в вычисление tuple of tuples, в котором на позиции [i][j] — результат выражения f(foos[i], bars[j]) (т.е. мы развернули foos и bars по двум разным измерениям)
и чтобы это можно было комбинировать в одном выражении: f(mappedOver(someTuple), ifPresent(someOptional), whenReady(someFuture)) или так f(ifPresent(mappedOver(someOptionalOfTuple)))
словом, было бы неплохо иметь возможность определять такое поведение для пользовательских типов. Пока что ни в одном языке такого не видел, хотя я их не так много знаю. Тут вылазит вопросо о взаимодействии таких операций между собой. Например, при вызове f(mappedOver(someTuple), ifPresent(someOptional)) результатом очевидно должен быть не tuple of optionals а optional of tuples — как определить взаимодействие или на крайняк порядок между этими преобразованиями выражений (которые вызываются выражениями mappedOver, ifPresent), и поддерживать их в условиях, когда новые может добавлять пользователь?
Это было бы не круто, потому что код становится менее читабельным из-за смеси условия и инструкции между собой. Взглянув на твою строчку, скажем, сложно понять, какое поведение будет, если обе ifPresent выдадут false, или одна из них выдаст false, или ни одной. В варианте же с предварительными проверками это очевидно — функция foo будет вызвана только если все выдадут true.
А если нет, то представь себе ситуацию, в которой тебе нужно пропустить какие-то данные через 4 операции, каждая из которых может пойти не так (так что они возвращают optional). В твоем случае это будет
код
а при помощи этой фичи:
Но вопрос: что будет, если у step_2 не сработает ifPresent()? Я не могу понять это по коду в одну строку, но без проблем пойму по коду с условиями.
Полагаю, такие возможности не вводят именно потому, что код становится менее понятным.
Да-да, всё что я сделал — приписал вопросительные знаки к твоему выражению, и это компилируется и работает)
Запустить онлайн: play.rust-lang.org/?version=stable&mode=debug&edition=2015&gist=9e1ab20d1499efd5c0d1265738e4521e
Pascalеобразованные. Они точные.
Я дилетант.
А так, нравятся питон и руби
Сидишь, медитируешь по нескольку минут на эту и подобные строчки, пытаясь понять — если условие выполняется, строчки таблицы включены или отключены?
А еще JS. Просто потому что очень гибкий и универсальный.
С другой стороны у него под капотом столько всего творится, что порой трудно предугадать его поведение в некоторых ситуациях.
Эх, как я по нему скучаю…