глупый программистский вопрос
Apr. 12th, 2003 03:04 pm(только программистам интересно, наверное)
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
no subject
Date: 2003-04-12 06:52 am (UTC)Сколько хороших вещей можно сделать с CPS-ным кодом, о боже мой.
...
no subject
Date: 2003-04-12 12:06 pm (UTC)Re:
Date: 2003-04-12 12:18 pm (UTC)no subject
Date: 2003-04-12 01:50 pm (UTC)Хвостовая рекурсия имеет место, когда при вызове функции, скажем, g из функции f (f и g могут быть одной и той же функцией или разными, не важно) в f уже не нужно больше ничего вычислять (т.е., скажем, в f =
(lambda () (while (ля-ля) (if (g 1) (g 0) (+ (g 3) (g 5)))) (g 2))вызовы g с четным аргументом находятся в хвостовой позиции, а вызовы с нечетным аргументом -- нет.) И если вызов идет из хвостовой позиции, то он эквивалентен безусловному переходу, со всеми вытекающими последствиями.Стиль с передачей продолжений заключается, грубо говоря, в следующем: допустим, нам надо посчитать функцию f и ее результат скормить функции g. Вместо
(g (f что-то))мы пишем(f что-то g)и там, где f обыкновенно возвращала бы результат (т.е. все в тех же хвостовых позициях), заставляем ее явно вызывать g с соответствующим значением в качестве аргумента. При таком раскладе g называется продолжением f.Хвостовую рекурсию можно реализовать, преобразуя исходную программу в программу с передачей продолжений. Об этом написана статья Генри Бейкера “Cheney on the MTA”, которая в свое время наделала много шума; и по крайней мере один компилятор Scheme устроен именно таким образом.
P.S. Ничего, что я все в лисповской записи привожу? В любом другом варианте слишком много возни с синтаксисом, etc.
no subject
Date: 2003-04-13 01:05 am (UTC)