LINUX.ORG.RU

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


0

4

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

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

★★

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

Доо. Ты и правда не знаешь, что JavaScript - это Схема с синтаксисом Си?

Не знаю. В JavaScript есть statements и expressions. В говносхеме только expressions. В JavaScript нет макросов, никаких. В говносхеме есть как минимум гигиенические, а обычно еще и говняные. В javascript есть eval с глобальным контекстом и dynamic scoping, в говносхеме кастрированный eval и только lexical scoping. В схеме отсутствуют стандартные императивные control flow конструкции, а в javascript они есть, и нет возможности определить им какие либо «альтернативы».

Так что в JavaScript от говнолиспов только лямбда с замыканиями и остается. И это была большая ошибка разработчиков языка. Наюсь, они раскаялись.

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

Ты и правда не знаешь, что JavaScript - это Схема с синтаксисом Си?

Ты и правда не понял, что сим укрепил аргумент собеседника? -_-

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

Так что в JavaScript от говнолиспов только лямбда с замыканиями и остается. И это была большая ошибка разработчиков языка. Наюсь, они раскаялись.

А когда уже раскаются неосиляторы «лямбд с замыканиями»?

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

Ты и правда не понял, что сим укрепил аргумент собеседника? -_-

О том, что Схему забывают после сдачи? Да, правда не понял.

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

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

Только ты не сказал что именно IDE с этими макросами делает, то есть зачем ей их «перекомпилировать». SLIME, например, умеет подсказывать lambda-list и documentation макросов - изменился макрос, изменились подсказки. И это именно фича символов. Ещё для макросов она (и xref.lisp сам по себе) умеет who-macroexpands на основе графа вызовов построенного для нужного количества файлов - меняем что угодно, строим граф и смотрим.

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

Алгол, в отличие от Лиспа, разрабатывался так, чтобы напоминать естественный язык.

Но напоминает его не больше чем лисп.

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

Изменившаяся строка: (defmacro LOOP ...)

Будет package lock. Можно даже свои пакеты залочить если так хочется запретить изменение их символов. Если без package lock - горячее изменение чего угодно, не только макросов, предполагает что ты знаешь что делаешь.

Что делать будем?

А если какую-то полезную функцию которая повсюду используется обновить на бесполезную так что всё полетит? Или сменить ей сигнатуру? Или присвоить полезной глобальной переменной числового типа значение nil? То есть это претензии не то что к макросам, а к горячему обновлению кода функций и динамической типизации вообще (языки без горячего обновления вообще, но с глобальным присваиванием могут контролировать глобальную мутацию только типами и квалификаторами).

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

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

Какое такое «горячее изменение»?!? Я просто редактирую исходники в IDE! В нормальном языке (Java) мои изменения моментально отражаются, IDE постоянно поддерживает адекватную раскраску, всегда сможет представить комплишены, и тому подобное. В говноязыке с говномакросами все будет очень и очень плохо, по тем причинам, о которых я писал выше. А ты тут чего-то про горячую замену говоришь не в тему. Зачем?

А если какую-то полезную функцию которая повсюду используется обновить на бесполезную так что всё полетит? Или сменить ей сигнатуру?

Открой Eclipse. Смени сигнатуру метода в одном из исходников. Тебе меньше чем через секунду покажут все места в коде, где вызовы этого метода поломались.

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

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

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

IDE постоянно поддерживает адекватную раскраску, всегда сможет представить комплишены, и тому подобное. В говноязыке с говномакросами все будет очень и очень плохо, по тем причинам, о которых я писал выше. А ты тут чего-то про горячую замену говоришь не в тему. Зачем?

То есть иде постоянно проводит тайпчек on the fly. Почему ты думаешь, что иде для ЯП с макросами так не могут?

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

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

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

Какое такое «горячее изменение»?!?

Ты выше говорил, что IDE не сможет в макросы, так как ей нужны их определения (в виде исходников), а они могут изменяться (в том числе сторонними лицами при горячем обновлении). Так вот, текущая практика не предполагает наличие исходников - что новое определение макроса (функции, ...), что его инкрементальное изменение, вместе с обновлением кода связанного с символом обновляет и всю сопутствующую информацию. То есть IDE может узнать про макросы (функции, ...) столько информации, сколько реализация (образ) может ей предоставить для соответствующих символов (например, describe в CL, metadata в Clojure). Любое обновление просто меняет эту информацию - IDE без всяких исходников может раскрашивать макросы, функции и т.п. разными цветами, давать адекватную документацию и шаблоны применений (эм, lambda-list в смысле) за O(1) так как выяснение чем является символ, какая у него документация и шаблоны применений делается просто, дополнения и граф вызовов могут быть дороже, но они где угодно дороже и вообще тормозят.

Смени сигнатуру метода в одном из исходников.

Ты не сказал слово «Java» - статически типизированный язык. Таки претензии к динамике?

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

Конечно сложно спорить с таким авторитетным крикуном, но я все же замечу, что например плюсовые IDE (в частности KDevelop) умеют распарсивать макросы в коде, и при их, макросов, изменении адекватно реагировать в местах использования макросов (и функций, кстати, тоже).

Я не вижу принципиальной невозможности делать то же самое для лиспа без подключения к рантайму, как это делает slime. Если есть например .asd или IDE сама ведет «проект», т.е. известен порядок загрузки файлов, вполне реально зарегестрировать все функции и макросы и проиндексировать места их вызовов/раскрытий.

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

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

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

но ведь иде той же джавы делает заново тайпчек всех миллионов строк кода на каждую нажатую клавишу. Почему иде с макросами так не может?

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

Я не вижу принципиальной невозможности делать то же самое для лиспа без подключения к рантайму, как это делает slime. Если есть например .asd или IDE сама ведет «проект», т.е. известен порядок загрузки файлов, вполне реально зарегестрировать все функции и макросы и проиндексировать места их вызовов/раскрытий.

Ему уже даже привели пример ИДЕ, которая это делает. Но собственная сперма глаза залила, видать.

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

вполне реально зарегестрировать все функции и макросы и проиндексировать места их вызовов/раскрытий.

Учитывая, что в CL можно придумывать десятки способов определения функций, макросов и методов, начиная от setf и defun/defmacro/defmethod и вплоть до defclass из CLOS, defimplementation из quicklisp и многочисленных макросов SBCL подобного толка, то такая IDE должна будет реализовать приличный кусок CL (экспандер и таблицу символов как минимум).

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

то такая IDE должна будет реализовать приличный кусок CL

Как в принципе любая «вумная» IDE для любого языка.

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

то такая IDE должна будет реализовать приличный кусок CL (экспандер и таблицу символов как минимум)

Достаточно быть написанной на CL и крутиться внутри его рантайма :)

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

и по-хамски игнорирует любые неудобные ему аргументы

Где ответ про зарплаты Java-гуру, где рассказ о твоих достижениях?

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

Возьми уже, наконец, учебник. Мне нравится английская версия ANSI Common Lisp за авторством Пола Грэма (by Paul Graham). Недавно вышел русский перевод.

ну то есть ты настолько тупой, что не в состоянии сказать?

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

В таком случае надо просто сказать: «спасибо, мне ваша функциональщина не интересна: я уже состоявшийся быдлокодер», а не нести шизотерический бред с чувством превосходства

в таком случае ты можешь мне представить некоторые превосходства ФП, а я пока пойду за водкой попкорном.

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

Отрицательный чему? Внезапно:int main(int argc,char **argv){ return main(argc,argv);}

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

Тебе другие предоставили и несколько раз объяснили: присваивание setf не зависает. Зависает print.

где код, в котором print НЕ зависает?

Мы все в предвкушении.

ага. ты первый.

Полтора анона-задрота говнолиспа мне погоды не сделают. Выше я писал, что использую CL. И при этом я его не защищаю.

это засчитывать как слив?

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

Едва ли. Я отлично понимаю, что цикл строится на комбинации if и goto, и не имеет значения, реализуется это специальной языковой конструкцией for/do/while как в си или макросом do/loop/dotimes/dolist/iter как в CL.

вот в ФП попросту НЕТ никаких /do/loop/dolist/dotimes

ЕСТЬ только твоя iter. итеративная функция, если есть что-то другое, будь любезен, покажи. Не принуждай меня опускаться до рекурсии(которая была в прошлом сообщении).

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

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

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

Вот только кода-то и нет...

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

Речь про бесконечный список шла. Чтобы этот список как-то вывести, его сначала нужно создать. Сишка не может в ленивость, тут-то всё и рухнет :}

ты не знаешь сишку.

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

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

ну давай спорить: я беру сишечку, ты?

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

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

что это за говно, и под каким CPU мне это говно выполнять?

А for сишки что за говно и под каким CPU выполнять?

у ТЕБЯ какой CPU? У меня x86. У меня десктоп, в котором процессор, от Intel.

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

Это не программная сущность, это терм, безграмотная ты ебанашка. Программная сущность - это конкретная значение, которое хранится в ОП или регистре процессора.

дык ты мне можешь рассказать, где у тебя «программная сущность», а где «конкретное значение»?

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

Нет, нет, погоди, это ведь сишка у тебя не падает, когда памяти не хватает. У моего ГЦ с этим все нормально.

сам-то понял что сказал? «сишка НЕ падает». Что не нормально?

Что запустишь?

у тебя хотел спросить?

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

А ты в сишке запусти тот же код и объясни, почему он виснет. Вот то же самое объяснение.

обломайся. в сишке не виснет.

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

Пруфы можно? У меня почему-то упорно виснет. какой ты компилятор используешь? Или, может, я недостаточно ждал? Надо подождать несколько часов?

какой у тебя код? я свой привёл.

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

Не надо. Говно другого сорта все равно остается говном. Суть-то не меняется - и то, и другое позволяет прятать очевидную семантику. Точно так же, как с сишным препроцессором, в лиспе ты никогда не скажешь (не увидев всех определений всех использовавшихся макросов), является ли что-то вызовом функции, определяет ли что-то новые имена, и т.д.

С такой логикой, кресты тогда вообще нужно объявить вне закона и предать анафеме, на всякий случай.

обоснуй.

drBatty ★★
()

(не могу удержаться) А-а-а, ЛОР - торт! Лиспосрач. :)

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

Где ответ про зарплаты Java-гуру, где рассказ о твоих достижениях?

Хотя бы скажите кто-нибудь по айпишнику, в какой дыре мире его такие грёзы накрывают?.. ;)

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

Пажалста:

Использование конструкторов, деструкторов, перегруженных операций и механизма исключений «позволяет прятать очевидную семантику». Глядя на код, никогда точно не скажешь, что за неведомая херня будет из него вызываться, и во что он превратится после компиляции. Добавим сюда еще традиционное болото из < < < < > > < > > > , и получаем говнокод, по сравнению с которым рассуждать о низкой читаемости лиспа просто смешно.

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

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

Таки я не понял, почему это сишечка такая тупая взяла и крашнулась? Очень неожиданное поведение!

где код, в котором print НЕ зависает?

То есть ты уже согласен, что виснет всего лишь print? Ок, код лежит где-то в треде, ищи *print-circle*. Даже не будь этого решения, проблему ты надумал.

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

вот в ФП попросту НЕТ никаких /do/loop/dolist/dotimes
ЕСТЬ только твоя iter.

Чудно, учитывая, что и do, и loop, и iter разные сахарки над одним и тем же действием - итерированием.

ЕСТЬ только твоя iter. итеративная функция

Моя iter - макра, как и все остальные конструкции из CL, что я приводил.

в ФП попросту НЕТ никаких /do/loop/dolist/dotimes

Я, честно, никогда не интересовался pure-fp, полагаю, что там вообще может не быть такого понятия как «цикл». А вот конкретно в CL, как и конкретно в Си, такое понятие есть и реализуется в обоих сдучаях в виде сахара над if и goto. Ты же тут хочешь разговаривать о конкретных языках, вот будь любезен конкретно про эти два конкретно и отвечать.

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

тупорылое созданьице:
для тебя специально код повторю:

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

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

вот в ФП попросту НЕТ никаких /do/loop/dolist/dotimes

Все там есть. Даже в хаскеле есть forM и mapM. Цикл - это абстракция. Императивная она, декларативная или еще какая, зависит от точки зрения. Ближе к императивной, но здесь возникает столько «но»... В общем, если кому-то очень надо докопаться, то ничто не мешает раскрыть для него цикл в хвостовую рекурсию, только нафиг это не надо.

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

Кстати, решение того, как получить строковое значение в CL, уже было здесь в треде. Называется *PRINT-CIRCLE*.

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

Посвящено только одному крикливому схемеру выше по треду:

$ ccl
Welcome to Clozure Common Lisp Version 1.8-r15286M  (LinuxX8632)!
? (setf *PRINT-CIRCLE* t)
T
? (setf x '(10 . 20))
(10 . 20)
? (setf (cdr x) x)
#1=(10 . #1#)
? 
dave ★★★★★
()
Ответ на: комментарий от dave

Кстати, решение того, как получить строковое значение в CL, уже было здесь в треде. Называется *PRINT-CIRCLE*.

Я тоже его видел и уже успел им поделиться :)

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

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