- 1
Поцаны, шестой уровень вложенности - это ок или говнокод?
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
Поцаны, шестой уровень вложенности - это ок или говнокод?
У вас обычно сколько?
всегда проще свой написать
Зачем свой писать? Достаточно нанять индуса и он всё сделает за тебя
он по-русски не понимает
Напитон!
или return с инвертнутым условием
согласен, не использовать неймспейсы -- тупо.
Her джавист вероятно
> шарпик
> джава
Кстати, Namespaces плюс видимость на уровне модуля в тыщу раз пижже чем никому не нужные пакеты.
Джава в очередной раз оказалась хуже шишарпа
На самом деле даже не в C# , а в .NET.
Полное имя класса, известное .NET, обычно звучит как System.Foo.Bar.Buz.
То, что C# позволяет сделать using и не писать полное имя это, по сути, сахар.
В общем всё как с пакетами в JVM, но в отличие от JVM они не влияют на доступ
>>вложенные функции.
даже боюсь думать во что это разворачивается
И правильно делаешь... На х86 оно требует исполняемый стек, чтобы сгенерить на нём трамплин, который передаст адрес родительского фрейма в функцию.
То-есть они реально физически в стеке хранят код процедур вместе с параметрами?
Где-то между EBP и ESP (ну или просто где-то по ту стоону от EBP если fpo)
В момент взятия адреса локальной функции на стек помещается трамплин (что-то в духе mov ecx, ebp и jmp на настоящую реализацию). И адрес этого трамплина ты получаешь вместо адреса функции. Именно поэтому такое "замыкание" превращается в тыкву после выхода из родительской функции.
Костыль тот ещё...
просто числа вместо итераторов. что-то типа `std::find_if( 0, xs.size(), <predicate>)` должно работать.
или я что-то в дискуссии не уловил?
> <predicate>
Няшная == C (без плюсов)
Как ты предикат в сишечке напишешь, который в локальные переменные смотрит? Разве что хаки с void* context и кастами использовать.
http://man7.org/linux/man-pages/man3/bsearch.3.html
народ на макросах извраты воротит для строгости типов - но это отдельный мрак.
Ну вот борманд и предлагает
это древнее расширение, которое много конпилеров умели/умеют. древние срачи на тему этого расширения тоже видел. не брали в стандарт потому что много народа возмущалось что это будет плодить локальные нереюзабельные функции. типа, если нужна функция - то запихни ее куда официально, что бы и другие могли пользоватся.
но так как в кресты это уже взяли - то не вижу смысла почему в ц аналога не включат.
Удивляет, что шаблонов до сих пор нет в Ц стандарте. В кресты давно уже взяли, почему в Ц аналога до сих пор нет?
... подумали сишкостандартизаторы и прикрутили очередной уродливый и бесполезный частный случай - tgmath.h
Лучше фортран, я совершенно серьёзно.
Если тебе не важен ПИРФОМАНС, то можно. На чём-то вроде хаски в теории можно что-то шустрое написать, но на практике сложно и муторно.
Типично:
Значит, по идее можно прикрутить шаблоны к Plain Си.
Я бы прикрутил уже только для того, чтобы посмотреть, как у @j123<цифры> пукан подгорит.
А я думал, что шаблоны в крестах есть реализация параметрического полиморфизма.
OOP в стиле Java -- это subtyping (система типов, позволяющая неявно заменять значения определённого типа значениями его подтипов). Параметрический полиморфизм -- возможность определять термы с типом, зависящим от типов-переменных. Это ближе к Generic'ам
Вот такая функция параметрический полиморфизм или нет?
СНауТ ровно это и сказал. Параметрический полиморфизм с выводом типов был уже в начале 70 реализован в ML, когда этих ваших «C#» и «Java» ещё и в проекте не было.
В джаве и генериков-то не было до пятой версии. Везде generic pointer был, всмысле Object.
Почему люди, когда делали Java и C#, не осилили по началу даже вывод типов?
Не умели? Жалели время на компиляцию?
Почему императивные мейн-стрим языки отстают от ML на пол века?
Практически все современные гибридные языки не могут пользоваться Хиндли-Милнером. Для каждого придумывается наколеночная эвристика. То, что есть в C# и прочих Scala -- тухленькая имитация.
> Почему императивные мейн-стрим языки отстают от ML на пол века?
Я задаюсь тем же вопросом. Я слабо понимаю, куда всё движется по всем фронтам. JavaScript в браузере вместо Lisp-машин? Java и ООП вместо ML и модулей? Это прогресс? SRLY?
>> Я слабо понимаю, куда всё движется по всем фронтам
Да, у меня тоже есть ощущение что всё в какой-то момент стало хуже.
Возможно бум доткомов и популяризация веба привлекла массу php и javascript прогр людей, далеких от глубокого понимания, и они начали радостно изобретать инструменты, которые в других средах давно уже существуют.
В самыхглавных мейнстримовых языках даже модульности нормальной нет.
Вот это же какая-то битва с надувными мельницами в грязи:
https://habrahabr.ru/post/312022/
> https://habrahabr.ru/post/312022/
выбрал инструмент под задачу
@
послал транспитухов, тайпитухов, питухJS, моду и 2016 напитон
Давайте уже сделаем модным среди веб-модников выбирать инструмент под задачу. 2017 кончаются, а они пердолятся с инструментами и не пишут код.
А можете простенько на качественном уровне пояснить, почему так получается?
Нельзя ли в алгоритм вывода вставить куда-нибудь вместо "тип" - "самый старший предок типа", чтобы всё заработало? А, или тогда получится, что мы в некоторых случаях обрежем возможность использовать поля/методы потомков, если автоматом выберем родителя.
Во-первых, не всегда понятно, о какой иерархии идёт речь. Какой тип у f?
Я не совсем понимаю, что значит "возвращать самого старшего предка". Наименее специфичный тип ты возвращать не захочешь, это будет какой-нибудь Object. Наиболее специфичный тоже возвращать не айс:
Вот тут мы намеренно хотим скрыть специфичный тип.
В хиндли-милнере каждая функция имеет один наиболее общий тип; при добавлении сабтайпинга у каждой функций может быть множество типов, происходит комбинаторный взрыв вариантов. Т.е. в теории это может работать, на практике это медленно и сложно. Поэтому в OCaml такое "своеобразное" ООП (там подтип определяется не явным наследованием, а совместимостью интерфейса, по аналогии с модулями), а мейнстрим довольствуется локальными эвристиками.
Лол, я хотел что-то подобное написать, но решил, что понятие неравенства применительно к типам -- это слишком большие вореции.
Вики говорит, что Simula появилась несколько раньше.
Так ООП, он как скрипач -- не нужен.
> Spam(name: T) -> List<T>
Это эльфийский сигнатура функции или её тело?
Ну пусть будет тело. А это важно?
няпример:
(Проебать 1 аргумент типа T, и вернуть пустой список).
З.Ы. В паскале тоже была реализация вложенных функций (не полноценных замыканий, они тоже дохли на выходе из родительской). И там, емнип, нельзя было такую функцию куда-попало передать.
Ну если только вызывать - то и гцц трамплины не генерит. Но нахуй они тогда нужны? Просто чтобы поменьше переменных передавать? Как-то уныло.
Статики же... Если модуль на мегабайты не раздувать - никому они не помешают, имхо.
У ООП аналогичная фишка: экономия аж на целом одном аргументе функций (во все методы неявно передаётся self).
Скажи это петону.
Или главный смысл ООП в неявной передаче указателя на объект?
В петоне передаётся неявно. Явно только принимается.
>>вложенных
орлы?
Что не так?
Но просто мелкий был. Надо скачать паскаль и проверить, может быть
https://s18.postimg.org/6m2pl15x5/fail.png
Небось в дельфями попутали?
PS: там возврат выше конечно, но если его убрать все равно не работает
https://ibb.co/dsBxYG
Мой код скопировать слабо́?
Что-нибудь объявлять ПОСЛЕ слова begin можно было только в Алголе. Ну ещё в няшной можно объявлять переменные после фигурной скобки.
P.S. Ещё в качестве подсказки: локальные переменные в Паскале объявляются между заголовком функции и словом begin. Там же объявляются и вложенные функции.
Там перед begin же блок с переменными, видимо то что будет сразу класться на стек, наверное потому там и функция
Где-то же она живет, значит можно всегда найти offset ее относительно близжайшего адреса, способного стать началом сегмента (кратный 10h наверное) и ввернуть far адрес.
и jmp туда сделать
Тогда и статики стоило запретить, они ж нереюзабельны.
Вообще говоря иммутабельность лучше мутабельности почти всегда (кроме руби, где мутабельны даже строки)
Но чем же это?
Врата в ад откроются сразу же
В каждой функции по инклюду.