LINUX.ORG.RU

Возврат значения из замыкания


0

4

Как вы считаете, если противопоставить, какое _и почему_ в абстрактном ЯП поведение оператора return внутри замыкания более правильное/оправданное: когда return только возвращает управление из замыкания или когда return вызванный внутри замыкания приводит ещё и к возврату из контекста, откуда было вызвано замыкание?

p.s. В качестве примера второго поведения - return из Proc в Ruby.

★★

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

Так ты не благодаря лиспу зарабатывал, а вопреки. Если бы владел более современными, мощными языками, заработал бы на порядок больше. Ты серьезно не знаешь, сколько зарабатывает Java senior/lead developer?

Столько же. В прикормленных местах - больше, но прикормленность от языка или технологии вообще мало зависит. Можно линуксовые ядра на волл-стрите или в чикаге конфигурировать за $1500 в день.

Java-специалисту топ-класса просто не придет в голову хвастаться на форуме тачками и шмотьем.

Мазду третью покупает Java-специалист, и потом спрашивает, чо она не едет. Ибо не шарит.

Лол, съемные полдома, велошмотки, китайский велосипед и подержаные тачки в кредит.

Велошмотки, в основном, английские и американские (канондейл, эндура). Велосипед американский. Тачки без кредитов. Полдома съёмные, потому что ещё не решил, где осяду. Но и своя недвижимость в России есть, если чо...

Ты мне ещё в упрёк поставь, что я свои машины сам ремонтирую. Типа, нищеброд.

И все это потреблядство - вершина стремления лисперов?

Я никуда не стремлюсь особо, но у меня это всё есть, и завелось без особых усилий.

Я, кстати, давно заметил, что у тебя есть пунктик - икра. Это очевидным образом свидетельствует о том, что сего продукта тебе в детстве не доставалось (т.е. родители нищебродствовали),

Родитель у меня в военной авиации служил, продуктов всяких разных было много.

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

Или, может, все-таки дописываем новые строчки в ту же накладную, а?

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

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

Но ведь сам объект «накладная», получается, мутабелен. И, более того, имеет состояния: сбор груза / погрузка / отправка / в пути / приземлился / разбор груза / таможня / доставлен.

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

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

Но ведь сам объект «накладная», получается, мутабелен.

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

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

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

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

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

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

если мы о информации о продуктах - то да. ты производишь операцию вытаскивания колбасы над холодильником, получаешь новый холодильник.

Мало того, ты каждый раз новый. Ты можешь гарантировать что не умираешь каждое планковское время?

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

Не-не-не, Девид Блейн, ты без quote давай. Тут товарищ распинался, что напишет функцию, полностью эквивалентную макросу.

А в чем проблема с quote? Где тут неэквивалентность? Попросил написать - тебе написали, а теперь какие-то странные предъявы.

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

Где пруф-то? Где бенчмарк?

Ну вот, тебе пруфы привели, а в ответ «не вижу, не слышу, я в домике, это все заговор!11!»

Может, придурок.

Нет, не может.

Элементарный случай-то.

Нет, это неразрешимый случай.

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

А если ее вынести из цикла, то код замедлится. По-этому компилятор ее и не выяснит. С чего бы компилятору замедлять код?

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

Но ведь это же не так. Функции это хорошо, методы - еще лучше, а макросы - фу-фу-фу, какашки.

А аргументы в пользу этого тезиса етсь? Пока что ты ни одного не привел.

Были какие-то страшилки о том, что-де с макросами можно запутать контрол-флоу, насрать в контекст и т.п. - но потом оказалось что функциями можно сделать все то же самое. Так чем плохи макросы?

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

И надо заметить, что даже без всяких стадий он бы мог написать cond как ленивую функцию.

Я ему об этом уже говорил. или можно было передать ветки лямбдами. Но у него ленивый порядок и лямбды - это тоже фу-фу-фу.

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

LTO, в том числе, позволяет инлайнить то, что на этапе компиляции заинлайнить нельзя, обо всех функциях речь не идет.

Что это ты за хуйню написал? При ЛТО инлайнинг происходит на стадии компиляции. А на стадиди компиляции можно заинлайнить только то, что можно заинлайнить на стадии компиляции. Еще раз, в рассматриваемом случае компилятор не будет ничего инлайнить, просто потому, что такой инлайнинг замедлит программу:

for (i = 0; i < 1000; i++){
   for (i = 0; i < 0; i++){
      if blah-blah blah ...
   }
}

если компилятор вынесет условие из внутреннего цикла, то программа только замедлится, т.к. условие при вынесении будет считаться, а без вынесения - его уберет dead code elimination. То есть если у нас есть такой код:

for (i = 0; i < 1000; i++){
   for (i = 0; i < n; i++){
      if blah-blah blah ...
   }
}
То тебе компилятор ничего сделать не сможет, выносить в данном случае предикат - это ошибка. А трассирующему джиту на эти проблемы похуй - просто потому что он и не выносит ничего. Просто когда внутренний цикл будет достаточно «горячим» он заинлайнит предикат. То есть тут принцип простой - если на первой итерации предикат успешен, то его не надо вызывать на последующих итерациях. Если итераций нет - то и вызовов предиката не будет.

Да, потенциально у jit'а больше возможностей по анализу и выбору оптимизаций, но его работа требует времени. И это тоже надо учитывать.

По-этому надо делать джит на простом ЯП (в результате он будет быстрый) и только на горячем коде. Если мы знаем, например, что джит данного участка кода займет примерно n микросекунд, то можно запустить джит тогда, когда код уже выполнялся примерно 10n микросекунд. В результате мы проебем в худшем случае 10% производительности в сравнении с интерпретацией (которая тоже должна быть быстрой и эффективной - язык-то простой).

В итоге хороший компилятор с LTO построит более эффективный код, чем код, созданный jit, + код jit-компиляции.

Нет, не построит. Код с тяжелыми лупами для трассирующего джита всегда будет быстрее чем любой код, сгенерированный обычным компилятором. Потому что на таких лупах время исполнения самого лупа значительно превышает время работы джита.

В общем, пока и мечтать не приходится, чтоб обогнать сишечку и иже с ней...

Так уже догнали и обгоняют, чего мечтать?

Видишь ли в чем дело - все хитрые оптимизации на статическом компиляторе очень и очень нетривиальны. Тут каждая оптимизация - это Ph.D тема, передний край CS и все такое. На каждый чих - неразрешимые задачи, и не то что неразрешимые - а и толковых эвристик нету. Основное преимущество трассирующего джита в этом плане состоит в том, что там где статическому компилятору надо делать что-то очень нетривиальное, трассирующий джит для достижения того же (и иногда даже лучшего) результата может вести себя просто как дубина (в сравнении офк).

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

Это все философия. Откуда ты знаешь, может аллах творит каждое мгновение мир заново? Ты это никак не сможешь доказать/опровергнуть.

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

Еще можно(если время есть) посмотреть на акторный пролог. Клевая штука. Вот такая мутабельность, как там - меня вполне устраивает.

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

«заинлайнит предикат» - и все? Раскрой тему, я надеюсь, что не так тебя понял. Компилятор тоже заинлайнит предикат. А потом еще раз посмотрит на получившийся после инлайнинга код и соптимизирует его.

По поводу «не во время компиляции» - имелось в виду, что на стадии линковки.

Что значит догоняет и обгоняет? Какой язык? Какой компилятор? Какой тест? Я хочу проверить. У меня тут сервера и работающий код. И я использую разные языки(даже на питоне у меня некоторые демоны крутятся, сейчас будет один на scala), но когда мне нужна скорость, мне приходится брать, сука, убогую сишечку(ну ++ иногда). Ибо нихуя больше не справляется, erlang разве что - но он не всегда удобен и программеров адекватных хуй найдешь. Go еще не готов для продакшана, D - тоже, да и не лучше С++. Rust все еще самоэксперементирует. Так что мне брать?

Опять же, как обгоняет, если есть llvm тоже с jit?

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

В твоей голове электрохимические сигналы распространяются по синапсам (непрерывно меняя их состояние), и вызывают каскады реакций в нейронах (что меняет их состояние).

Даже в твоём сознании (если ты не бот, что, в общем-то, совсем не факт) есть только модели того, что творится в твоей голове, которые, возможно, частично и описывают происходящие там процессы. Но даже в этом случае мы получаем РАСПРОСТРАНЕНИЕ сигналов и, самое важное, РЕАКЦИИ. До состояний тебе и дела быть не должно - твоя модель этого состояния всё равно будет иметь мало общего с реальностью. Основное - это РЕАКЦИЯ.

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

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

Это у меня для тебя плохие новости, если ты из одной фразы нагенерил такую туеву хучу полного бреда.

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

«заинлайнит предикат» - и все?

После чего вычислит его (т.к. аргумент известен) и уберет if (т.к. значение условия известно и можно вместо всего ифа поставить сразу нужную ветку).

Во время компиляции же аргумент неизвестен. И компилятор сделать ничего не в состоянии.

Опять же, как обгоняет, если есть llvm тоже с jit?

При чем тут ллвм? Речь о трассирующих джитах.

Что значит догоняет и обгоняет? Какой язык? Какой компилятор? Какой тест?

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

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

Ты каждую итерацию собрался компилировать и подставлять туда известное значение? Или у тебя предикат bla-bla-bla не зависит от внутреннего счетчика? Если не зависит, то компилятор точно так же, вынесет эту проверку за цикл после инлайнинга предиката(и при необходимости вставит два варианта внутреннего цикла - на успешный предикат и на не успешный). Давай мы раскроем твое bla-bla-bla и ты распишешь, что будет происходит в случае jit'а.

И ты не ответил, что мне брать? Мне не нравится сишечка, но у меня нет выбора(да, если докупят еще железа, то может хватит и scala, но железо итак хорошее...).

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

Ты каждую итерацию собрался компилировать и подставлять туда известное значение?

Нет, только горячий код.

Или у тебя предикат bla-bla-bla не зависит от внутреннего счетчика?

Да.

Если не зависит, то компилятор точно так же, вынесет эту проверку за цикл после инлайнинга предиката

Правда? То есть вот был код:

for (int i = 0; i < 1000; i++){
}
а компилятор «соптимизировал» и стал код:
for (int i = 0; i < 1000; i++){
   blah-blah;
}
? а ничего, что после оптимизаии код стал медленнее, чем до нее?

Давай мы раскроем твое bla-bla-bla и ты распишешь, что будет происходит в случае jit'а.

В случае джита когда внутренний цикл выполнится определенное количество раз (чтобы трейсер счел код «горячим»), код внутреннего лупа скомпилируется джитом, причем все незименяемые внутри кода переменные будут считать константами (например i). тогда predicate(i) - то же константа и при компиляции будет сделан constant folding. в резуьтате получим if const branch1 branch2 - будет еще раз сделан фолдинг и внутри цикла останется тупо branch1. ну или branch2 - в зависимости от того, какое у нас i на таекущей итерации.

И ты не ответил, что мне брать?

Не понял в каком смысле что брать?

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

Где бы эти самые тесты для lua взять...

На шутауте же есть. Осталось только взять оттуда код и запустить на луаджите.

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

Если бы владел более современными, мощными языками

Это Java-то современный и мощный? Вот даунище. Java - тупой и примитивный.

Никто стае макак в 200 рыл современный и мощный язык не доверит. Так что Java в индустрии как раз к месту.

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

А, я по привычки на одноядерки даже не глянул.

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

Ты серьезно не знаешь, сколько зарабатывает Java senior/lead developer?

Не говори ему этого, иначе депрессия неизбежна. ЛОР без такого клоуна будет скучнее.

Java-специалисту топ-класса просто не придет в голову хвастаться на форуме тачками и шмотьем.

Ладно бы тачками. Вольвой, господа, позорной вольвой!

И все это потреблядство

Какое же это потреблядство? Это даже на жалкие потуги не тянет. Ладно бы яхтой за сто лямов хвастался.

psikh
()
Ответ на: комментарий от mv

Можно линуксовые ядра на волл-стрите или в чикаге конфигурировать за $1500 в день.

Ты и в самом деле не в курсе, сколько платят за Java. Тебя ждет шок.

Полдома съёмные, потому что ещё не решил, где осяду.

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

Ты мне ещё в упрёк поставь, что я свои машины сам ремонтирую. Типа, нищеброд.

Это всего лишь очередной симптом красноглазия.

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

А в чем проблема с quote?

В том, что это очевидный синтаксис, который нельзя спрятать.

Где тут неэквивалентность?

Синтаксис не совпадает.

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

Редкостный идиот. Предикат повторяется N раз во внутреннем цикле, при этом является инвариантом этого цикла. Выносить его при таких условиях не просто можно, но нужно.

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

Были какие-то страшилки о том, что-де с макросами можно запутать контрол-флоу, насрать в контекст и т.п. - но потом оказалось что функциями можно сделать все то же самое.

У тебя какие-то больные фантазии. Где это оказалось, что функциями можно сделать тоже самое?

Так чем плохи макросы?

Тем, что позволяют писать код с неочевидной семантикой. Функции же этого не позволяют. Еще вопросы есть? Мне надоело одни и те же банальные истины повторять по сто раз.

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

Не говори ему этого, иначе депрессия неизбежна. ЛОР без такого клоуна будет скучнее.

Ну давай поделись своей N-figure зряплатой, интересно ведь. Может перейду на жабу от зависти.

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

Перестань лгать и вонять. Или ты предъявляешь пруфы - то есть, бенчмарк, который любой желающий может проверить на своем железе, или ты - свинья, все разработчики luajit свиньи и все подписчики их скотского списка рассылки тоже свиньи.

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

Можно линуксовые ядра на волл-стрите или в чикаге конфигурировать за $1500 в день.

Ты и в самом деле не в курсе, сколько платят за Java. Тебя ждет шок.

Ну расскажи, не томи.

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

Программировать, как правило, проще с иммутабельностью

Сколько бы раз ты не повторил эту идиотскую мантру, никто тебе не поверит.

psikh
()
Ответ на: комментарий от mv

им даже специально завалить проект профессиональная гордость не позволит.

cпециально

т.е. оно как-то само получается? :)

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

В том, что это очевидный синтаксис, который нельзя спрятать.

и? Один хер под ним у тебя будет какой-угодно-страшный-контрол-флоу - то ест ьвсе как и с макросами.

Синтаксис не совпадает.

А зачем ему совпадать?

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

Предикат повторяется N раз во внутреннем цикле

А внутренний цикл не обязательно вообще будет выполняться. Потому что может быть N = 0. И в этом случае если ты вынесешь предикат из цикла, получим лишние вычисления. Потому выносить компилятор и не будет ничего, если это не совсем уебищный компилятор.

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

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

Пол-европы идиоты, живут в съёмном жилье, один ты умный такой.

Ты и в самом деле не в курсе, сколько платят за Java.

Расскажи.

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

и? Один хер под ним у тебя будет какой-угодно-страшный-контрол-флоу - то ест ьвсе как и с макросами.

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

И вообще, мне надоело повторять банальности. Здесь все написано: http://c2.com/cgi/wiki?LispLacksVisualCues

А зачем ему совпадать?

Тред не читай, глупость отвечай.

psikh
()
Ответ на: комментарий от Reaper

Пол-европы идиоты, живут в съёмном жилье, один ты умный такой.

Идиотов намного больше чем половина популяции. Зато другая, малая часть популяции - умные люди. Они сдают жилье идиотам.

Расскажи

А он потом топиться побежит. Оно мне надо?

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

У тебя какие-то больные фантазии. Где это оказалось, что функциями можно сделать тоже самое?

Я привел на каждый твой пример пример функции, которая делает то же самое: срет в контекст, не выполняет аргументы/выполняет их много раз, инкапсулирует запутанный control-flow.

Тем, что позволяют писать код с неочевидной семантикой.

Но ведь функции позволяют писать код с точно той же семантикой.

Функции же этого не позволяют. Еще вопросы есть?

Да, есть. Можно увидеть макрос с неочевидной семантикой, для которого нельзя было бы написать аналогичную функцию с такой же неочевидной семантикой?

Мне надоело одни и те же банальные истины повторять по сто раз.

пока что получается, что твои «прописные истины» на деле ни что иное, как мокрые фантазии, не имеющие отношения к реальности.

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

Тем, что позволяют писать код с неочевидной семантикой. Функции же этого не позволяют. Еще вопросы есть? Мне надоело одни и те же банальные истины повторять по сто раз.

Твою истину и так все знают. Нечитаемая лапша с привычной семантикой ничем не лучше.

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

Алё, лох, в твоем примере константные пределы цикла были.

Это во первых. Во вторых, стандартная стратегия для циклов с неизвестными границами - это сделать один (или два) шага loop unrolling, с выносом всех инвариантов в первую итерацию.

Ну не знаешь ты ни хера про компиляцию, так помалкивал бы. Дрочи молча на свои трассирующие жыты. Может лет через сто они догонят сегодняшний HotSpot.

psikh
()
Ответ на: комментарий от Reaper

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

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

Зато другая, малая часть популяции - умные люди. Они сдают жилье идиотам.

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

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

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

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

Здесь все написано: http://c2.com/cgi/wiki?LispLacksVisualCues

Да это уже все давным-давно прочитали и обсудили. Там ни одного аргумента/примера нет, вода и мокрые фантазии.

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

Я привел на каждый твой пример пример функции, которая делает то же самое: срет в контекст, не выполняет аргументы/выполняет их много раз, инкапсулирует запутанный control-flow.

Лгунишка, ни черта ты не привел. Все твои примеры были идиотскими и нерелевантными.

Но ведь функции позволяют писать код с точно той же семантикой.

Нет, лгунишка, не позволяют. В языке с фиксированным, простым набором конструкций локальная семантика всегда очевидна. ВСЕГДА.

Да, есть. Можно увидеть макрос с неочевидной семантикой, для которого нельзя было бы написать аналогичную функцию с такой же неочевидной семантикой?

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

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

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

Да. Тогда макросы можно еще как-то терпеть. В говнохацкеле так и сделали. Умные люди, хоть и придурки.

psikh
()
Ответ на: комментарий от Reaper

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

Чувствуется попаболь в адрес москвичей. Мсье замкадыш?

Львиная доля таких в европе.

Не надо ля-ля. Огромное количество рантье тупо взяли в банках кредиты. Есть такая особая форма mortgage, для ренты. Знаю людей, кто при средних вполне доходах таким образом десятки домов сдает.

И тут вообще не разделяют людей по наличию собственного / снимаемого жилья.

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

psikh
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.