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)

goto нужен в сложных случаях, а на баше никто сложного не пишет: проще уж на сях...

Eddy_Em ☆☆☆☆☆
()

Линус Товальдс, тащемта, вот что писал про goto

сразу видно программиста, а не диванного борщевика-теоретика.

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

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

phill
() автор топика

зачем тебе goto в скрипте? ты там ошибки сильно часто обрабатываешь?

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

Что-то вроде этого? http://entrian.com/goto/ но это «released 1st April». Где-то была другая реализация, когда-то давно она мне попалась. Естественно, использовать такое на практике не стоит.

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

А почему нельзя в интерпретируемом? Объясните для нубов, пжста. Досовский этот command.com, он что компилируемый чтоли?

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

Машина Тюринга, по ходу, копилируется, значит.

anonymous
()

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.

Аплодирую сидя! Всё так и есть.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Miguel

Линус Торвальдс, что характерно, несёт пургу.

Тебе braindamage of the language user не мешает по-жизни?

anonymous
()

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

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

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

arturpub ★★
()

Почему же в shell его не запилили в явном виде?

shell

that's the braindamage of the language designer

Сам спросил, сам ответил

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

Ассемблерщик что ли? goto — это не только (и не столько) переход на адрес, сколько переход на метку. А метку хоть как номер строки реализуй.

buddhist ★★★★★
()

Потому что шелл жрёт команды построчно, и после выполнения забывает. Если реализовывать goto - надо будет выделять память для хранения всех выполненных строк. Так сильно менять поведение относительно стандарта никто не будет.

selivan ★★★
()

/me вспомнил свой ужас, вызванный отсутствием goto в java, при переходе на нее с паскаля.

zinfandel ★★
()

Для чего тебе нужен goto? Use-case свой расскажи.

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

Скорее не из, а начиная с и далее.
По сути это чуть ли не единственный метод прыгать по скрипту (.cmd) даже сейчас, т.к. функций там как не было так и нет. (Костыли эмитирующие функции не в счёт)

Да. вендузятники должны страдать :)

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

Том Дженнингс Американский программист, анархист и неформал, основатель любительской сети FidoNet, в качестве субподрядчика работал на компанию Apple Computer и множество других крупных фирм. Создал один из первых вариантов BIOS, что определило будущую специализацию компании Phoenix Software.

Вот от bios и писал. Причем был был большой любитель jmp.
И розовый на все 100 :)

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

Наоборот, goto:метка проще написать, чем оформлять функцию. А так он заменяет и while и break и switch. Там много других проблем, от которых можно страдать — работа с текстом, вычисления. Впрочем в bash без корутилс не лучше.

TGZ ★★★★
()

Хороший, годный оператор.

Линус == толстый зелёный тролль.

вот что писал про goto

при чём тут шелл? Он про сишечку писал.

Почему же в shell его не запилили в явном виде?

ВНЕЗАПНО: он есть в bash. Точнее не совсем он, есть continue N, где N — число. Также есть и break N.

Зачем тебе goto нужно?

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

Линус Торвальдс, что характерно, несёт пургу.

ты всё называешь «пургой», чего не осилил понять?

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

А почему нельзя в интерпретируемом?

можно. Просто не нужно. Нету смысла.

Если ты не согласен, дай пример, когда смысл есть.

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

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

упрлс? А как я тогда функции, циклы и ветвления реализую??? Через libastral что-ли?

Так сильно менять поведение относительно стандарта никто не будет.

да, конечно. Тебя забыли спросить.

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

По сути это чуть ли не единственный метод прыгать по скрипту (.cmd) даже сейчас, т.к. функций там как не было так и нет. (Костыли эмитирующие функции не в счёт)

ты упорот?

Да. вендузятники должны страдать

а? что, даже в новомодном говношеле не запилили?

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

goto:метка проще написать, чем оформлять функцию

это ВОЙТИ проще. А ВЫЙТИ?

А так он заменяет и while и break и switch.

открой для себя лямбда-исчисление: ФУНКЦИЯ ЗАМЕНЯЕТ ВСЁ!

Впрочем в bash без корутилс не лучше.

давай ещё обсудим cmd без dos/win.

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

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

while true; do echo foo; done
mark; echo foo; goto mark

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

ФУНКЦИЯ ЗАМЕНЯЕТ ВСЁ!

Ага, только ты забываешь, что функция - это синтетика. Она сводится к тому же goto. Так что, правильней говорить, что GOTO ЗАМЕНЯЕТ ВСЕ!

anonymous
()

Вот передо мной 107 скриптов (написаны мной) на csh общим размером 13250 строк в них всего 34 goto. И можно было и без них обойтись, но появились бы нагромождение IF'ов для доп. проверок.

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

Вы о чем говорите. Ваши шуточки не совсем понятны. По вашему, в интерпретируемом языке вообще управляющие конструкции невозможны чтоли?

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

Видимо, он имеет ввиду «чистейшую» интерпретацию, когда интерпретатор ничего не «запоминает».

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

Выражаешь свои мысли ясно, так-сказать.

mark; echo foo; goto mark

проблема в том, что бесконечный цикл не имеет смысла. Нужны какие-то проверки. Потому вариант с while условие; do echo foo; done осмысленный.

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

Ага, только ты забываешь, что функция - это синтетика. Она сводится к тому же goto. Так что, правильней говорить, что GOTO ЗАМЕНЯЕТ ВСЕ!

не. Функция — это не только goto. Это ещё и сохранение контекста, в частности адреса возврата(но не только). Потому голое goto НЕ заменяет ВСЁ.

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

Вот передо мной 107 скриптов (написаны мной) на csh общим размером 13250 строк в них всего 34 goto. И можно было и без них обойтись, но появились бы нагромождение IF'ов для доп. проверок.

у меня примерно столько же скриптов на bash, и там 0 goto. Нагромождения if'ов удалось избежать с помощью функций и break/continue, которые в bash умеет выпрыгивать из вложенных циклов(в сишечке не умеют, потому там goto иногда удобно).

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

Откуда пришел вестимо. Компутед гоуту никто не отменял. Только оформлять это надо не явно, а через COMEFROM, я считаю — так в разы понятнее.

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

КУДА?

Куда надо. Хватит пороть чушь.

чушь порешь ты: откуда функция узнаёт место своего вызова? Ты будешь это место сохранять? КАК? Я что-то не видел в шеллах регистра EIP, и операторов его сохранения. Как записать метку в переменную я тоже не очень понимаю... Ну а уж косвенный переход по метке из переменной — это уже совсем мелочь...

PS: да, даже в brainfuck нет goto, его нужно костылять из while(1).

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