Структуры управления помимо стандартных условных выражений и циклов?

Языки структурированного программирования обычно имеют несколько управляющих структур, таких как while, if, for, do, switch, break и continue, которые используются для выражения высокоуровневых структур в исходном коде.

Однако есть много других структур управления, которые были предложены на протяжении многих лет, но не вошли в современные языки программирования. Например, в статье Кнута "Структурированное программирование с Перейти к операторам", стр. 275, он ссылается на управляющую структуру, которая выглядит как урезанная версия обработки исключений:

loop until event1 or event2 or ... eventN
   /* ... */
   leave with event1;
   /* ... */
repeat;
then event1 -> /* ... code if event1 occurred ... */
     event2 -> /* ... code if event2 occurred ... */
     /* ... */
     eventN -> /* ... code if eventN occurred ... */
fi;

Это кажется полезной структурой, но я не видел ни одного языка, который фактически реализует ее, кроме как частный случай стандартной обработки исключений.

Точно так же Эдсгер Дейкстра часто использовал управляющую структуру, в которой один из многих фрагментов кода выполняется недетерминировано на основе набора условий, которые могут быть истинными. Вы можете увидеть это на странице 10 его статьи о гладкой сортировке. , среди прочих мест. Пример кода может выглядеть так:

do
    /* Either of these may be chosen if x == 5 */
    if x <= 5 then y = 5;
    if x >= 5 then y = 137; 
od;

Я понимаю, что исторически C повлиял на многие современные языки, такие как C++, C# и Java, и поэтому многие структуры управления, которые мы используем сегодня, основаны на небольшом наборе, предлагаемом C. Однако о чем свидетельствует этот другой SO-вопрос, мы, программисты, любим думать об альтернативных структурах управления, которые мы хотели бы иметь, но не поддерживаются многими языками программирования .

Мой вопрос заключается в следующем: существуют ли в настоящее время распространенные языки, поддерживающие структуры управления, радикально отличающиеся от структур управления в стиле C, о которых я упоминал выше? Такая структура управления не обязательно должна быть чем-то, что может t быть представлен с использованием стандартных структур C — почти все можно закодировать таким образом — но в идеале я хотел бы пример чего-то, что позволяет вам подходить к определенным задачам программирования принципиально иначе, чем позволяет модель C.

И нет, «функциональное программирование» на самом деле не является управляющей структурой.


person templatetypedef    schedule 31.07.2011    source источник
comment
просто небольшое примечание: в течение многих лет я хотел использовать конструкцию for...else, и всего несколько месяцев назад я узнал, что это возможно в Python.   -  person CamelCamelCamel    schedule 31.07.2011
comment
@Radagaisus: Что для... еще?   -  person user541686    schedule 31.07.2011
comment
@Mehrdad: блок else в цикле for-else выполняется, если цикл завершается естественным образом (а не разрывом). Это применимо независимо от того, сколько итераций (даже нулевых).   -  person BoltClock    schedule 31.07.2011
comment
он делает то, что сказал BoltClock. Я всегда чувствовал себя слишком многословным при написании циклов с помощью var found = false. Подробнее.   -  person CamelCamelCamel    schedule 31.07.2011
comment
@BoltClock: А, понятно... странно, лол.   -  person user541686    schedule 31.07.2011
comment
@Mehrdad: я знаю, верно?   -  person BoltClock    schedule 31.07.2011


Ответы (4)


  • Поскольку язык Haskell ленив, каждый вызов функции по сути является управляющей структурой.
  • Сопоставление с образцом в языках, производных от ML, объединяет ветвление, привязку переменных и деструктурирование объектов в единое целое. единая структура управления.
  • условия Common Lisp подобны исключениям, которые можно перезапущен.
  • Scheme и другие языки поддерживают продолжения, которые позволяют приостанавливать, возобновлять или перезапускать программу в любой момент.
person munificent    schedule 02.08.2011

Возможно, не «радикально разные», а «асинхронные» структуры управления довольно новы.

Async позволяет выполнять неблокирующий код параллельно, при этом управление возвращается к основному потоку программы после завершения. Хотя того же можно добиться и с помощью вложенных обратных вызовов, любые нетривиальные действия таким образом очень быстро приводят к несовершенному коду.

Например, в будущих версиях C#/VB Async позволяет вызывать асинхронные API без необходимости разбивать код на несколько методов или лямбда-выражений. т.е. больше никаких обратных вызовов. Ключевые слова «ожидание» и «асинхронный» позволяют вам писать асинхронные методы, которые могут приостановить выполнение без использования потока, а затем возобновить его позже с того места, где оно было остановлено.

// C#
async Task<int> SumPageSizesAsync(IList<Uri> uris)
{
    int total = 0;
    var statusText = new TextBox();

    foreach (var uri in uris)
    {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var data = await new WebClient().DownloadDataTaskAsync(uri);
        total += data.Length;
    }

    statusText.Text = string.Format("Found {0} bytes total", total);
    return total;
}

(взято с http://blogs.msdn.com/b/visualstudio/archive/2011/04/13/async-ctp-refresh.aspx)

Для Javascript есть http://tamejs.org/, который позволяет писать такой код:

var res1, res2;
await {
    doOneThing(defer(res1));
    andAnother(defer(res2));
}
thenDoSomethingWith(res1, res2);
person Community    schedule 31.07.2011

Итераторы/генераторы C#/Python

def integers():
    i = 0
    while True:
        yield i
        i += 1
person user541686    schedule 31.07.2011
comment
Что очень похоже на ленивую оценку. например, в Haskell: take 2 [1,2,3,4] -> [1,2]. - person CamelCamelCamel; 31.07.2011
comment
@Radagaisus: Нет, это не так. Это больше похоже на сопрограммы — совершенно другая концепция (т. е. приостановка/возобновление функций в середине выполнения). Тот факт, что он задерживается, не имеет к этому никакого отношения. - person user541686; 31.07.2011

(Я мало что знаю об этой теме, поэтому я пометил это как вики)

Сопоставление шаблонов Haskell.

Простой пример:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

или, скажем, Фибоначчи, что выглядит почти идентично математическому уравнению:

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)
person Community    schedule 31.07.2011