eurekafag
10.11.2011 11:13 WOK
Помогите соптимизировать паттерн. Сейчас получается что-то типа этого:
if A:
do_X(P)
elif B:
do_X(Q)
else:
do_Y([0, 0])
Хотелось бы такое:
if A:
T = P
elif B:
T = Q
else:
do_Y([0, 0])
do_X(T)
Но в этом случае do_Y и do_X выполнятся вместе, что делать нельзя. Можно после do_Y поднимать флажок, а do_X делать, если флажок не поднят, но это тупо.
A и B — запросы к БД, P и Q — ответы на эти запросы, поэтому хочется выполнять ровно то, что требуется и не больше.
Помогите человеку же. Или не погромисты дохуя?
мне кажется, что он нас троллирует
Где ты тут тролирование то увидел?
учитываю погромисткий опыт эврикафага мне с трудом верится, что у него может возникнуть такой вопрос
Может он наркоман?
обязательно наркоман, я даже не понел, для какого языка ему нужно
Язык роли не играет, в данном случае питон. Я уже придумал, как тут выйти из положения, функции do_X и do_Y, в принципе, идентичны, так что конкретный вызов можно вынести за условия, а в условиях лишь установить аргументы. Но если бы они в корне отличались, было бы сложнее.
Зоделай же на эрланге
Я пока недостаточно хорошо его знаю для этих целей.
На эрланге вышло бы куда лучше, кстати, ведь там можно выдавать результат через какое угодно число вложенностей, лишь бы он был последним в коде. Типа такого:
{F, A} = if
A_condition > 0 → {do_X, P};
true → if
B_condition > 0 → {do_X, Q};
true → {do_Y, [0, 0]}
end
end,
apply(F, A).
Без паттерн-матчинга подобное выльется в жуткие костыли, мне кажется.
TAKE THIS:
def dox(q):
print 'doX'
print q,':',qa[q]
def doy():
print 'doY'
print [0,0]
qa={'a':'P',
'b':'Q'}
arg = raw_input('enter query: ')
if arg not in qa:
doy()
else:
dox(arg)
try:
if A:
T = P
elif B:
T = Q
else:
raise
except:
do_Y([0, 0])
else:
do_X(T)
:cf:
Да, это более вменяемо. Вообще, я знаю только два способа выхода из вложенного условия/цикла — это либо флажок для прохода через слои, либо эксепшон (ну или как вариант копипаста общего куска во все ветки, но именно для избежания этого я и создал тред). В луа, кажется, есть простая и интуитивно понятная конструкция — break с параметром, т.е. break(3) выведет на 3 уровня вложенности вверх. Почему такое до сих пор отсутствует в других языках, непонятно.
Соснули без GOTO. Мимопролетал.
GOTO может делать переходы слишком куда угодно, а break(N) — только наружу вложенности. Выход из вложенности есть реально необходимая задача, которая сейчас решается эксепшонами (3 строки минимум — try, raise, except против одной break(N)), а прыжки по всему коду — это пиздец.
Лол, используй GOTO правильно. Этот сила супергероя. Будешь использовать бездумно и безответственно твой брат умрет.
Современные быдлокодеры сильно оторвались от систем под которые программируют. Старые дедовские приемы позабыли. Эх... Потеряли тропинку ведущую к Дзен.
Ну да, давайте все хуярить на асме.
Та не. Нахуй асм. Просто я подчеркнул ущербность современных ЯП ибо приходиться иметь ебаные костыли, вместо простой инструкции. Разве только в LUA позаботились о няшном break
Эти костыли возникли не на пустом месте, они отвечают требованиям времени. Без недостатков ничего нет, но надо в первую очередь смотреть на преимущества, недостатки всегда можно обкостылить.
human way
Что получается, когда машины проектируют ЯП и пишут на них, мы ещё долгое время не узнаем. А когда узнаем, наверно, будет уже поздно.
А я подпстачну GOTO, иногда его использование намного более элегантно, чем восьмиступенчатые условия и прочие костыли.