LINUX.ORG.RU

Снова про goto для bash

 


0

3

Извиняюсь, если затронул неприличную тему, тем более, нашел подобную довольно бестолковую тему в архиве форума goto как сделаьть на bash???!!! Дело в том, что я наткнулся на одну из реализаций gotо здесь http://tdkare.ru/sysadmin/index.php/Программирование_на_bash В случае линейного кода все ok, а вот в случае цикла беда, конструкция вида

function goto {
    cmd=$(sed -n "/$1:/{:a;n;p;ba};" $0 | grep -v ':$')
    eval "$cmd"
    exit
}

 while true
 do
 
 goto start
 start:
   echo start
   goto end
 foo:
   echo foo
   goto start
end:
done
при отработке в последней строке выдает ошибку syntax error near unexpected token 'done' Это я что-то делаю не так или принципиальная невозможность делать goto внутри цикла? Можно как то поправить или лучше забить на goto вообще?


Зачем?
В 100% случаем можно обойтись без него. Из них в 95% случаев код остается читабельным.

лучше забить на goto вообще?

This

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

В 100% случаем можно обойтись без него

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

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

Часто из соображений эффективности

Щито?

а иногда и логику проще реализовать.

Ну вот я и просил привести примеры.

anonymous
()

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

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

Ещё когда надо написать код с несколькими ветками, у части из которых часть кода совпадает, и следовать принципам DRY.
Когда нужна хвостовая рекурсия.

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

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

break и continue есть

Пример когда без goto нельзя обойтись - в студию.

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

простейший пример — выход из 2 и более вложенных циклов.

В реальных кейсах всегда есть некий критерий, который позволяет после выхода из одного цикла выйти и из второго.

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

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

В реальных кейсах всегда есть некий критерий, который позволяе

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

За примеры читайте Выше, в основном кейзы перечислены в треде, в дебри вдаваться не будем. А дейкстра — кукарекалка, от которой реальной пользы никакой CS не было, который жидко обделывался во всем, за что только не брался, и который, в то же время насрал в этот самый CS столько, что еще 10 поколений будет разгребать.

'I don't know how many of you have ever met Dijkstra, but you probably know that arrogance in computer science is measured in nano-Dijkstras.'(c)

https://en.wikiquote.org/wiki/Talk:Edsger_W._Dijkstra#nano-Dijkstras

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

простейший пример — выход из 2 и более вложенных циклов

break n

Кто-то тут даже bash не знает, а уже за goto подписывается.

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

Ок, насчет религиозного аспекта вопроса я в курсе. Б-г с ним, обойдемся без goto, вон, например, в жабакрипте его тоже нет и никто не умер. Но, чисто с академической точки зрения, топикстартовый код (кстати, я нашел первоисточник) можно как то поправить код, чтобы работало внутри цикла? Или придется сами циклы только таким анальным способом реализовывать?

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

вон, например, в жабакрипте его тоже нет и никто не умер

все ж таки, в жаваскрипте знатные костыли для его имитации. В циклах там можно гулять по меткам в пределах первого внешнего. с помощью throw catch сделать нелокальный выход, например можно так выйти из foreach. На асинхронщине, в промисах, можно прыгнуть в catch через reject. Там еще не так все плохо:)

filequest
()

Зачем использовате это поделие(bash) таким образом и изобретать машину времени. Если просто можно взять вменяемый язык, тот же пыхтон.

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

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

Вижу, вы теоретик, мисье.

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

За примеры читайте Выше, в основном кейзы перечислены в треде

Где? Ни одного примера кода не вижу, кроме как в топике.

А дейкстра — кукарекалка, от которой реальной пользы никакой CS не было

А это тут при чём?

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

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

Нет. man bash в той части, где про eval.

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

За примеры читайте
За

поцаны на лоре.жпег

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

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

Добавить флаг и проверять его на каждой итерации.

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