- 1
Поцаны, шестой уровень вложенности - это ок или говнокод?
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
Поцаны, шестой уровень вложенности - это ок или говнокод?
У вас обычно сколько?
subaru 08.11.2017 18:39 # +2
AnalPerOral 08.11.2017 18:57 # −2
SemaReal 08.11.2017 19:24 # −2
всегда проще свой написать
d_fomenok 08.11.2017 19:25 # −2
Зачем свой писать? Достаточно нанять индуса и он всё сделает за тебя
SemaReal 08.11.2017 19:28 # −3
он по-русски не понимает
santa_microbe 13.11.2017 10:57 # +1
CHayT 13.11.2017 11:01 # +2
Напитон!
SemaReal 08.11.2017 18:42 # +2
или return с инвертнутым условием
Her 08.11.2017 19:13 # 0
subaru 08.11.2017 22:47 # 0
Zuzik 08.11.2017 22:58 # 0
roman-kashitsyn 08.11.2017 23:07 # +7
согласен, не использовать неймспейсы -- тупо.
Zuzik 08.11.2017 23:47 # 0
SemaReal 08.11.2017 23:48 # 0
SemaReal 08.11.2017 23:38 # +1
Zuzik 08.11.2017 23:49 # 0
SemaReal 08.11.2017 23:57 # 0
Her джавист вероятно
subaru 09.11.2017 00:33 # 0
> шарпик
> джава
SemaReal 09.11.2017 00:35 # 0
Кстати, Namespaces плюс видимость на уровне модуля в тыщу раз пижже чем никому не нужные пакеты.
Джава в очередной раз оказалась хуже шишарпа
subaru 09.11.2017 00:37 # 0
SemaReal 09.11.2017 00:42 # 0
На самом деле даже не в C# , а в .NET.
Полное имя класса, известное .NET, обычно звучит как System.Foo.Bar.Buz.
То, что C# позволяет сделать using и не писать полное имя это, по сути, сахар.
В общем всё как с пакетами в JVM, но в отличие от JVM они не влияют на доступ
subaru 09.11.2017 00:41 # 0
SemaReal 10.11.2017 04:55 # 0
Zuzik 08.11.2017 19:19 # −1
Steve_Brown 09.11.2017 13:08 # 0
subaru 09.11.2017 19:32 # 0
roman-kashitsyn 09.11.2017 19:45 # +3
subaru 09.11.2017 19:47 # 0
bormand 09.11.2017 19:51 # +2
roman-kashitsyn 09.11.2017 20:01 # 0
bormand 09.11.2017 20:14 # +2
bormand 10.11.2017 04:34 # 0
SemaReal 10.11.2017 04:53 # 0
>>вложенные функции.
даже боюсь думать во что это разворачивается
bormand 10.11.2017 05:05 # +1
И правильно делаешь... На х86 оно требует исполняемый стек, чтобы сгенерить на нём трамплин, который передаст адрес родительского фрейма в функцию.
SemaReal 10.11.2017 05:07 # 0
То-есть они реально физически в стеке хранят код процедур вместе с параметрами?
Где-то между EBP и ESP (ну или просто где-то по ту стоону от EBP если fpo)
bormand 10.11.2017 05:18 # +5
В момент взятия адреса локальной функции на стек помещается трамплин (что-то в духе mov ecx, ebp и jmp на настоящую реализацию). И адрес этого трамплина ты получаешь вместо адреса функции. Именно поэтому такое "замыкание" превращается в тыкву после выхода из родительской функции.
Костыль тот ещё...
inkanus-gray 10.11.2017 10:56 # 0
SemaReal 10.11.2017 18:21 # 0
bormand 10.11.2017 18:41 # +3
inkanus-gray 10.11.2017 19:28 # +1
Dummy00001 10.11.2017 17:01 # 0
просто числа вместо итераторов. что-то типа `std::find_if( 0, xs.size(), <predicate>)` должно работать.
или я что-то в дискуссии не уловил?
roman-kashitsyn 10.11.2017 17:05 # +1
> <predicate>
Няшная == C (без плюсов)
Как ты предикат в сишечке напишешь, который в локальные переменные смотрит? Разве что хаки с void* context и кастами использовать.
Dummy00001 10.11.2017 17:14 # 0
http://man7.org/linux/man-pages/man3/bsearch.3.html
народ на макросах извраты воротит для строгости типов - но это отдельный мрак.
roman-kashitsyn 10.11.2017 17:16 # 0
Ну вот борманд и предлагает
Dummy00001 10.11.2017 17:24 # 0
это древнее расширение, которое много конпилеров умели/умеют. древние срачи на тему этого расширения тоже видел. не брали в стандарт потому что много народа возмущалось что это будет плодить локальные нереюзабельные функции. типа, если нужна функция - то запихни ее куда официально, что бы и другие могли пользоватся.
но так как в кресты это уже взяли - то не вижу смысла почему в ц аналога не включат.
roman-kashitsyn 10.11.2017 17:42 # +4
Удивляет, что шаблонов до сих пор нет в Ц стандарте. В кресты давно уже взяли, почему в Ц аналога до сих пор нет?
Dummy00001 10.11.2017 18:01 # +1
inkanus-gray 10.11.2017 19:50 # 0
bormand 10.11.2017 22:58 # +2
... подумали сишкостандартизаторы и прикрутили очередной уродливый и бесполезный частный случай - tgmath.h
CHayT 10.11.2017 23:02 # +1
Лучше фортран, я совершенно серьёзно.
SemaReal 10.11.2017 23:15 # 0
roman-kashitsyn 10.11.2017 23:35 # +2
Если тебе не важен ПИРФОМАНС, то можно. На чём-то вроде хаски в теории можно что-то шустрое написать, но на практике сложно и муторно.
Типично:
inkanus-gray 10.11.2017 19:48 # 0
Значит, по идее можно прикрутить шаблоны к Plain Си.
roman-kashitsyn 10.11.2017 20:09 # +3
Я бы прикрутил уже только для того, чтобы посмотреть, как у @j123<цифры> пукан подгорит.
inkanus-gray 10.11.2017 20:19 # 0
fluttr 14.11.2017 22:06 # +1
А я думал, что шаблоны в крестах есть реализация параметрического полиморфизма.
CHayT 14.11.2017 23:44 # 0
OOP в стиле Java -- это subtyping (система типов, позволяющая неявно заменять значения определённого типа значениями его подтипов). Параметрический полиморфизм -- возможность определять термы с типом, зависящим от типов-переменных. Это ближе к Generic'ам
SemaReal 15.11.2017 00:10 # 0
Вот такая функция параметрический полиморфизм или нет?
roman-kashitsyn 15.11.2017 00:40 # 0
СНауТ ровно это и сказал. Параметрический полиморфизм с выводом типов был уже в начале 70 реализован в ML, когда этих ваших «C#» и «Java» ещё и в проекте не было.
SemaReal 15.11.2017 00:44 # +1
В джаве и генериков-то не было до пятой версии. Везде generic pointer был, всмысле Object.
Почему люди, когда делали Java и C#, не осилили по началу даже вывод типов?
Не умели? Жалели время на компиляцию?
Почему императивные мейн-стрим языки отстают от ML на пол века?
roman-kashitsyn 15.11.2017 00:54 # +1
Практически все современные гибридные языки не могут пользоваться Хиндли-Милнером. Для каждого придумывается наколеночная эвристика. То, что есть в C# и прочих Scala -- тухленькая имитация.
> Почему императивные мейн-стрим языки отстают от ML на пол века?
Я задаюсь тем же вопросом. Я слабо понимаю, куда всё движется по всем фронтам. JavaScript в браузере вместо Lisp-машин? Java и ООП вместо ML и модулей? Это прогресс? SRLY?
SemaReal 15.11.2017 01:04 # 0
>> Я слабо понимаю, куда всё движется по всем фронтам
Да, у меня тоже есть ощущение что всё в какой-то момент стало хуже.
Возможно бум доткомов и популяризация веба привлекла массу php и javascript прогр людей, далеких от глубокого понимания, и они начали радостно изобретать инструменты, которые в других средах давно уже существуют.
В самыхглавных мейнстримовых языках даже модульности нормальной нет.
Вот это же какая-то битва с надувными мельницами в грязи:
https://habrahabr.ru/post/312022/
1024-- 15.11.2017 08:24 # 0
> https://habrahabr.ru/post/312022/
выбрал инструмент под задачу
@
послал транспитухов, тайпитухов, питухJS, моду и 2016 напитон
Давайте уже сделаем модным среди веб-модников выбирать инструмент под задачу. 2017 кончаются, а они пердолятся с инструментами и не пишут код.
1024-- 15.11.2017 08:28 # 0
А можете простенько на качественном уровне пояснить, почему так получается?
Нельзя ли в алгоритм вывода вставить куда-нибудь вместо "тип" - "самый старший предок типа", чтобы всё заработало? А, или тогда получится, что мы в некоторых случаях обрежем возможность использовать поля/методы потомков, если автоматом выберем родителя.
roman-kashitsyn 15.11.2017 12:51 # +1
Во-первых, не всегда понятно, о какой иерархии идёт речь. Какой тип у f?
Я не совсем понимаю, что значит "возвращать самого старшего предка". Наименее специфичный тип ты возвращать не захочешь, это будет какой-нибудь Object. Наиболее специфичный тоже возвращать не айс:
Вот тут мы намеренно хотим скрыть специфичный тип.
В хиндли-милнере каждая функция имеет один наиболее общий тип; при добавлении сабтайпинга у каждой функций может быть множество типов, происходит комбинаторный взрыв вариантов. Т.е. в теории это может работать, на практике это медленно и сложно. Поэтому в OCaml такое "своеобразное" ООП (там подтип определяется не явным наследованием, а совместимостью интерфейса, по аналогии с модулями), а мейнстрим довольствуется локальными эвристиками.
CHayT 15.11.2017 13:56 # 0
Лол, я хотел что-то подобное написать, но решил, что понятие неравенства применительно к типам -- это слишком большие вореции.
CHayT 15.11.2017 01:07 # 0
Вики говорит, что Simula появилась несколько раньше.
CHayT 15.11.2017 00:46 # 0
Так ООП, он как скрипач -- не нужен.
> Spam(name: T) -> List<T>
Это эльфийский сигнатура функции или её тело?
SemaReal 15.11.2017 00:48 # 0
Ну пусть будет тело. А это важно?
CHayT 15.11.2017 01:00 # 0
няпример:
(Проебать 1 аргумент типа T, и вернуть пустой список).
bormand 10.11.2017 18:54 # +1
З.Ы. В паскале тоже была реализация вложенных функций (не полноценных замыканий, они тоже дохли на выходе из родительской). И там, емнип, нельзя было такую функцию куда-попало передать.
inkanus-gray 10.11.2017 19:09 # 0
bormand 10.11.2017 19:10 # 0
Ну если только вызывать - то и гцц трамплины не генерит. Но нахуй они тогда нужны? Просто чтобы поменьше переменных передавать? Как-то уныло.
inkanus-gray 10.11.2017 19:21 # 0
bormand 10.11.2017 19:32 # 0
Статики же... Если модуль на мегабайты не раздувать - никому они не помешают, имхо.
inkanus-gray 10.11.2017 19:36 # 0
У ООП аналогичная фишка: экономия аж на целом одном аргументе функций (во все методы неявно передаётся self).
bormand 10.11.2017 19:37 # +2
Скажи это петону.
inkanus-gray 10.11.2017 19:39 # 0
SemaReal 10.11.2017 19:43 # 0
Или главный смысл ООП в неявной передаче указателя на объект?
inkanus-gray 10.11.2017 19:44 # +1
SemaReal 10.11.2017 19:45 # +1
roman-kashitsyn 10.11.2017 19:40 # +3
В петоне передаётся неявно. Явно только принимается.
SemaReal 10.11.2017 19:38 # 0
SemaReal 10.11.2017 19:21 # 0
>>вложенных
орлы?
inkanus-gray 10.11.2017 19:24 # +2
Что не так?
SemaReal 10.11.2017 19:27 # 0
Но просто мелкий был. Надо скачать паскаль и проверить, может быть
SemaReal 11.11.2017 20:13 # 0
https://s18.postimg.org/6m2pl15x5/fail.png
Небось в дельфями попутали?
PS: там возврат выше конечно, но если его убрать все равно не работает
SemaReal 11.11.2017 20:23 # 0
https://ibb.co/dsBxYG
inkanus-gray 11.11.2017 20:41 # 0
Мой код скопировать слабо́?
Что-нибудь объявлять ПОСЛЕ слова begin можно было только в Алголе. Ну ещё в няшной можно объявлять переменные после фигурной скобки.
P.S. Ещё в качестве подсказки: локальные переменные в Паскале объявляются между заголовком функции и словом begin. Там же объявляются и вложенные функции.
SemaReal 11.11.2017 20:44 # 0
Там перед begin же блок с переменными, видимо то что будет сразу класться на стек, наверное потому там и функция
inkanus-gray 11.11.2017 20:45 # 0
SemaReal 11.11.2017 20:48 # 0
Где-то же она живет, значит можно всегда найти offset ее относительно близжайшего адреса, способного стать началом сегмента (кратный 10h наверное) и ввернуть far адрес.
и jmp туда сделать
inkanus-gray 11.11.2017 21:03 # 0
inkanus-gray 11.11.2017 21:10 # 0
SemaReal 11.11.2017 21:48 # 0
COWuTEJIbTBOEuMAMKu 12.11.2017 04:12 # 0
SemaReal 11.11.2017 20:17 # 0
SemaReal 11.11.2017 20:44 # 0
bormand 10.11.2017 19:00 # +4
Тогда и статики стоило запретить, они ж нереюзабельны.
Stallman 10.11.2017 19:31 # +5
gost 11.11.2017 13:56 # 0
SemaReal 11.11.2017 20:06 # 0
Вообще говоря иммутабельность лучше мутабельности почти всегда (кроме руби, где мутабельны даже строки)
d_fomenok 11.11.2017 12:39 # 0
Но чем же это?
FrauSchweinhund 11.11.2017 13:32 # +4
inkanus-gray 11.11.2017 13:43 # +3
SemaReal 11.11.2017 20:26 # +4
Врата в ад откроются сразу же
inkanus-gray 11.11.2017 21:14 # 0
dxd 12.11.2017 12:06 # 0
В каждой функции по инклюду.
COWuTEJIbTBOEuMAMKu 12.11.2017 17:53 # 0
inho 09.01.2018 20:07 # 0
subaru 09.01.2018 20:10 # 0
COWuTEJIbTBOEuMAMKu 09.01.2018 23:47 # 0