Структуры управления вне стандартных условных выражений и циклов? - PullRequest
7 голосов
/ 31 июля 2011

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

Тем не менее, существует много других управляющих структур, которые были предложены за эти годы, но не попали в современные языки программирования.Например, в статье Кнута « Структурированное программирование с операторами Go To Statements » на странице 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 , мы, программисты, хотели бы думать об альтернативных структурах управления, которые мы хотели бы иметь, но не поддерживаются многими языками программирования.

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

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

Ответы [ 4 ]

2 голосов
/ 02 августа 2011
  • Поскольку Haskell ленивый , каждый вызов функции по сути является управляющей структурой.
  • Сопоставление с образцом в ML-производные языки объединяют объекты ветвления, привязки переменных и деструктурирования в единую управляющую структуру.
  • Общие * Lisp условия подобны исключениям, которые могут быть перезапущены.
  • Схема и другие языкиподдержка продолжений , позволяющая приостанавливать и возобновлять или перезапускать программу в любой момент.
1 голос
/ 31 июля 2011

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

def integers():
    i = 0
    while True:
        yield i
        i += 1
1 голос
/ 31 июля 2011

(я не знаю много о предмете, поэтому я отметил это вики)

Соответствие шаблону Хаскелла .

Обычныйпример:

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

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

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)
1 голос
/ 31 июля 2011

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

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

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

// 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);
...