avva: (Default)
[personal profile] avva
(только программистам интересно, наверное)

Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.

Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).

Есть какая-то глубокая причина этому?

Date: 2003-04-12 06:52 am (UTC)
From: [identity profile] hotgiraffe.livejournal.com
Любовь моя, continuation-passing style...
Сколько хороших вещей можно сделать с CPS-ным кодом, о боже мой.

...

Date: 2003-04-12 10:42 am (UTC)
From: [identity profile] pavelgr.livejournal.com
o, da!..

Date: 2003-04-12 12:06 pm (UTC)
From: [identity profile] ex-ilyavinar899.livejournal.com
The mother of all control structures...

Re:

Date: 2003-04-12 12:18 pm (UTC)
From: [identity profile] avva.livejournal.com
Это то же, что на другом языке называется tail recursion, или что-то другое?

Date: 2003-04-12 01:50 pm (UTC)
From: [identity profile] smilga.livejournal.com
Не вполне, хотя это смежные понятия.

Хвостовая рекурсия имеет место, когда при вызове функции, скажем, 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.

Date: 2003-04-13 01:05 am (UTC)
From: [identity profile] hotgiraffe.livejournal.com
... причём в компиляторах Scheme CPS полезен вдвойне, ибо позволяет "за те же деньги" реализовать и хвостовую рекурсию, и call-cc.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 30th, 2025 09:28 am
Powered by Dreamwidth Studios