LINUX.ORG.RU

goto в shell

 


0

1

Линус Товальдс, тащемта, вот что писал про goto: «I think goto's are fine, and they are often more readable than large amounts of indentation. That's _especially_ true if the code flow isn't actually naturally indented (in this case it is, so I don't think using goto is in any way _clearer_ than not, but in general goto's can be quite good for readability). Of course, in stupid languages like Pascal, where labels cannot be descriptive, goto's can be bad. But that's not the fault of the goto, that's the braindamage of the language designer.»

Хороший, годный оператор. Почему же в shell его не запилили в явном виде? Как имитировать goto в шелле наиболее прозрачным образом, чтобы не плодить процессы, не засирать стек и прочее?



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

где ты видишь противоречие?

В последней строчке, а чо? Это тупость или шутка, ячетнепонел?

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

Значит если по новой зайти в цепь рассуждений, то 5/0!=☣

да.

И вывод окажется снова неверен.

нет. Он не окажется верным. Если вывод не не верный, он необязательно верный. Если солёное не тяжелее розового, это не означает, что солёное легче розового.

Подожди-ка! Значит делить на ноль будет нан?

Формально да. Ибо ☣ нечисло. По-английски NaN. Но в этом случае нельзя говорить «будет». Это всё равно что сказать, что «таракан будет писать не по-русски», потому что таракан ВООБЩЕ писать не умеет.

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

Ты тупишь ниподеццки, у тебя с логическим мышлением проблемы. Выражение NaN!=NaN само по себе содержит противоречие. Это то же самое, что x!=x, отсюда, 1!=1, у тебя вся твоя система расыпается как карточный домик. Это, епт, математика головного мозга называется.

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

Твоя программа, максимум, будет приводить 0 к единице. Это костыль, а не решение, и не отменяет того факта, что математика содержит глубочайшее противоречие.

ты заблуждаешься. Моя программа может запоминать, что юзер делил на ноль. Если ты поделил на ноль 17(и получил ☣), то умножая ЭТУ ☣ на ноль, ты получишь 17, как и ожидается. А не 1 и не 72.

(вопрос нужности такой «программы» мы договорились не обсуждать)

Самое смешное, что противоречие содержится вовсе не в математике, а в школьной программе. Множество вещественных чисел полем не является(в строгом смысле), т.е. не замкнуто относительно деления само на себя. В этом нет ничего странного с т.з. математики. Например незамкнуто множество нечётных чисел, и не является даже кольцом. Потому что 1+1=2. Т.е. результат сложения 1+1 не определён во множестве нечётных чисел. Что тут странного?

И твоя прога не будет работать корректно, если она будет пользоваться сущестующим мат аппаратом.

УМВР.

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

почему ты считаешь правильным запиливать goto, и не правильным запиливать break?

С чего ты так подумал? Если есть инструкция break, значит break. Если нет, значит то, что есть. Значит ли, что одно лучше другого?

это дерьмо, а не синтаксис.

Твое личное мнение.

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

Потому что goto prevails, а break is limited to scope. Ассемблер это чистое гоуту, особенно если понять, что call это push eip & mov eip, addr, а ret это add [esp], 5 & pop eip.

и что?

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

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

arturpub ★★
()
Ответ на: IEEE 754-fix от x3al

Никаких противоречий, абсолютно всё по стандарту.

на самом деле там есть несколько допустимых вариантов поведения. Не только твой.

И да, у тебя(и в IEEE754) противоречие есть. В последней строке. Правильнее написать:

(☣==☣) === ☣
IRL это можно прочитать например так: «дата моей смерти может равна, а может не равна дате твоей смерти». Хотя конечно на практике обычно принимают, что «ты умрёшь не в тот день, когда умру я».

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

Если ты поделил на ноль 17(и получил ☣), то умножая ЭТУ ☣ на ноль, ты получишь 17

Ну я же и сказал, что ты приводишь 0 к 1. И у тебя, в твоей блятской системе, получается 0=1. Отсюда, у тебя будет (1-1)=(1-0), (10-1)=(10-0), соответственно, 9=10. В итоге ты придешь к тому, что ВСЕ равно ВСЕМУ.

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

В последней строчке

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

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

Контексты лишь в умах смотрящих.

нет, не только. while определяет контекст цикла неявно.

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

Но ведь 5/0 будет инф, а не нан. Где-то в наши рассуждения закралась ошибка.

всё правильно. Я специально обозначил и то и другое как ☣, в IEEE754 их три штуки(или одна), а сколько их у меня — я специально промолчал.

Их у меня ровно столько, сколько надо +1.

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

Ты тупишь ниподеццки, у тебя с логическим мышлением проблемы. Выражение NaN!=NaN само по себе содержит противоречие.

проблемы у тебя. А противоречие в самой NaN. Естественно, что в NaN!=NaN это противоречие никуда не исчезает.

Это то же самое, что x!=x, отсюда, 1!=1, у тебя вся твоя система расыпается как карточный домик.

ничего у меня не рассыпается. У меня это твоё «x» НЕЧИСЛО, потому, из этого неравенства никак НЕ СЛЕДУЕТ 1!=1.

Это, епт, математика головного мозга называется.

жизнь это и есть математика.

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

в последней строчке упрощение.

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

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

Так там и операция сложения в принципе не определена.

мне пофиг. Я определю. Я же не математик.

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

Ну я же и сказал, что ты приводишь 0 к 1. И у тебя, в твоей блятской системе, получается 0=1. Отсюда, у тебя будет (1-1)=(1-0), (10-1)=(10-0), соответственно, 9=10. В итоге ты придешь к тому, что ВСЕ равно ВСЕМУ.

если я начну применять к ☣ школьную арифметику — да, я приду к фигне. И что? Ты мне запрещаешь придумывать арифметики, да? А кто ты такой?

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

из этого неравенства никак НЕ СЛЕДУЕТ 1!=1.

Ты чо идиот? Ты ПОЛЬЗУЕШЬСЯ оператором сравнения чисел, или просто оператором эквивалентности. Если ты им пользуешься, ты должен представлять, что он означает. У тебя либо красное=красное, либо красное!=красное, третьего, епт, не дано. Если семантика твоего оператора означает возможность 3-го варианта, он будет работать точно также и с числами: 1=1 and 1!=1.

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

Ну так нафига ты там пользуешься знаком равенства?

у меня ваще-то знак НЕ равенства.

На практике это означает, что бабка с семечками сказала foo, а твоя система сказала bar, а кто прав, определить и проверить невозможно в принципе

это не баг, а фича.

А то что ты написал - это противоречивая система - она противоречит сама себе, это все равно что сказать: вещь зеленая, и вместе с тем, она НЕ зеленая.

да, я знаю. Что дальше?

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

Ты ПОЛЬЗУЕШЬСЯ оператором сравнения чисел, или просто оператором эквивалентности. Если ты им пользуешься, ты должен представлять, что он означает.

и что же он обозначает?

У тебя либо красное=красное, либо красное!=красное, третьего, епт, не дано.

говно=красное?

Если семантика твоего оператора означает возможность 3-го варианта, он будет работать точно также и с числами: 1=1 and 1!=1.

он так и работает. ВНЕЗАПНО: логика IRL тоже именно так и работает. Кроме вариантов «да», «нет», есть ещё как минимум варианты «хрен его знает», и «мне похрен». Но ты их почему то не учитываешь в своих построениях.

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

и что же он обозначает?

Он означает, обычно, что вещи равны между собой.(с)КЭП.

говно=красное?

Говно != красное, говно!=пушистое единственно справедливое равенство — говно=говно. Если x=говно и y=говно, то x=y, x=говно, y=говно. Это все, на что способна логика. А ты что, думал, что она тебе из шляпы кроликов будет доставать? Это демагогия, по большому счету, не более.

то не учитываешь в своих построениях.

Да как ты не поймешь, что в ЛОГИЧЕСКИХ построениях такие вещи использовать невозможно. Либо ты используешь логику и у тебя выстраивается логическая система, которой ты можешь пользоваться, но которая будет либо неполна либо противоречива (что фиксится аксиомами), либо ты имеешь шизофренический бред, который ты написал, из которого вообще ничего нельзя вывести, и никакого полезного применения ей не будет.

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

Он означает, обычно, что вещи равны между собой.(с)КЭП.

какой-то у тебя дебильный кэп. Масло масленое это называется.

Говно != красное, говно!=пушистое единственно справедливое равенство — говно=говно. Если x=говно и y=говно, то x=y, x=говно, y=говно. Это все, на что способна логика. А ты что, думал, что она тебе из шляпы кроликов будет доставать? Это демагогия, по большому счету, не более.

это ты просто лишь часть логики немного знаешь.

Да как ты не поймешь, что в ЛОГИЧЕСКИХ построениях такие вещи использовать невозможно.

тебе. И что?

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

откуда такая уверенность?

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

Допустим, в твоей системе число/0 дает разультат «неопределеннность». Затем, как ты пишешь, при умножении на число этот NaN возвращает это число, ok. Это значит, что твой NaN - это, бля, и есть 1. Он ведет себя всегда как 1 значит, это и есть 1, записанный по другому. Если он не всегда ведет себя как 1, ты должен вручную обрабатывать каждый раз его поведение. Органично он в систему не впишется. В любом случае, ты должен задать правила. Если же ты задаешь правила для каждого выражения, или типа выражений отдельно, то тебе этот NaN вообще не нужен, ибо ты и так можешь обработать каждый случай.

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

Это значит, что твой NaN - это, и есть 1. Он ведет себя всегда как 1 значит, это и есть 1, записанный по другому.

нет. 1*0=0

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

у меня есть C++.

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

вопрос только в оплате. Заплатишь — будет нужно. А пока — да, не нужно.

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

а есть кто-то, кто думает иначе?

Не знаю.. Из трех беседующих с тобой, я думаю иначе, а это уже 33%.

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

где ты видишь противоречие?

1/0=nan
(1/0)*5=5
5/5=1
5/5=nan
отсюдова:
1=nan
отсюдова:
1/0=1/1
дальше - непереводимый бред

Это как понимать? Твой нан - это 1? или как? Тогда 2-1=NaN?

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

функции, циклы и ветвления

Для них, разумеется, запоминает

тебя забыли спросить

Стандарт - он не просто так. Стандарт гарантирует, что написанное в соответствии ним будет работать хоть через 20 лет, если он поддерживается. Если где-то bash используется в виде command1 | bash | command2 - вполне легитимный вариант, command1 выдаёт команды shell - то твоё изменение эту штуку поломает. После обработки количества данных, равных объёму доступной памяти, оно сдохнет с out-of-memory.

Единственно возможный вариант - включать эту штуку в виде отключенной по-умолчанию опции, какой-нибудь set -g. Но спрос слишком маленький, чтобы стоило на это заморачиваться.

selivan ★★★
()

Нам препод объяснял, что goto ведёт к появлению говнокода, и там где можно было бы сделать всё чистенько и понятно на функциях, мудаки лепят гото через гото. И да, в shell он нахрен не нужен, и я ни разу не испытывал в нём необходимости с тех пор, как бросил ассемблеры.

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

Это как понимать?

ну ещё один...

NaN!=NaN

Откуда

(1/0)*5!=5
вот отсюда у тебя и получается ерунда...

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

Единственно возможный вариант - включать эту штуку в виде отключенной по-умолчанию опции

можно и так сделать. Не важно.

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

Нам препод объяснял, что goto ведёт к появлению говнокода, и там где можно было бы сделать всё чистенько и понятно на функциях, мудаки лепят гото через гото.

абсолютно правильно объяснял. Только не обязательно «на функциях». Есть Over9000 разных способов. Но мудак знает только один — goto.

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

Он нам как раз объяснял зачатки истории и сути ФП (нет, не про лисп).

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

Нам препод объяснял, что goto ведёт к появлению говнокода

На примере чего?

примеры ты должен приводить, если считаешь, что goto нужно.

Пока от тебя я видел только говно из MS-DOS или маздая. Я даже не понял, откуда ты это выкопал... Оно не нужно само по себе, потому ничего не доказывает.

emulek
()

goto в shell

Нахера тебе это? Ты собрался старый фортран, бэсик или другой ущербный ЯП я goto интерпретировать прям на bash-е? Кроме этого вразумительные аргументы в пользу goto у тебя есть?

«не плодить процессы» а зачем ты их плодишь? «не засирать стек и прочее» а зачем ты это делаешь?

Может для начала ты б таки привел конкретный киллер-код на баше где goto просто выстрелит и будет в тему чем и утрет всем нос?

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

наверное препод показал вам нечто вроде

for(j = 0; j < 10; j++)
  for(k = 0; k < 10; k++)
    if(matrix[j][k] == NaN)
      ? //найден неправильный эл-т матрицы, надо вываливаться из циклов, но как?

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

Я и не говорю, что goto лучше остального. Ты же здесь усираешься, доказывая, что функция лучше, да ты просто кэп.

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