2017-04-27 13 views
1

これは私がのために-whileループで何を意味するかです:for-whileループを持つプログラミング言語はありますか?

for (<init>; <update>) <body> while (<test>); 

それは大まかに変換:これはvery common programming patternのように思える

<init> 
<body> 

while (<test>) { 
    <update> 
    <body> 
} 

。しかし、私が知っている言語は、そのような制御構造を持っていません。したがって、一般的な回避策は代わりに次のように実装することです。

<init> 

while (true) { 
    <body> 
    unless (<test>) break; 
    <update> 
} 

これは機能しますが、非常に鈍い感じです。私の謙虚な意見では、無限のwhileループの途中で条件付きブレークを持つことは、構造化プログラミングの精神に反するものです。ここで

はループのため、しばらくの必要性のための動機付けの例です:あなたが見ることができるように

function swap(arr, i, j) { 
    var tmp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = tmp; 
    return arr; 
} 

function heapify(heap, i) { 
    var len = heap.length; 

    for (var min = i; swap(heap, i, min), i = min) { 
     var left = 2 * i + 1; 
     var right = 2 * (i + 1); 

     if (left < len && heap[left] < heap[min]) min = left; 
     if (right < len && heap[right] < heap[min]) min = right; 
    } while (min !== i); 

    return heap; 
} 

は、コントロールが従うのは非常に簡単で、コードは、回避策よりも多くのクリーナーです:

function swap(arr, i, j) { 
    var tmp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = tmp; 
    return arr; 
} 

function heapify(heap, i) { 
    var len = heap.length; 
    var min = i; 

    do (true) { 
     var left = 2 * i + 1; 
     var right = 2 * (i + 1); 

     if (left < len && heap[left] < heap[min]) min = left; 
     if (right < len && heap[right] < heap[min]) min = right; 

     if (min === i) break; 
     swap(heap, i, min); 
     i = min; 
    } 

    return heap; 
} 

とにかく、このような制御構造を持つプログラミング言語について知っていますか? Lispは主に機能的であり、私は主として命令型プログラミング言語を探しているのでカウントされません。

+0

私は40年のログキャリアでこれまで見たことのないような「非常に一般的なプログラミングパターン」*: – paxdiablo

+0

@paxdiabloおそらくあなたは、この制御構造は問題ありません。しかし、プログラミングで長年経験してきた私は、このパターンに何度も遭遇しました。これはあまり一般的ではありません。しかし、私はそれが新しい制御構造を保証するのに十分一般的だと思います。 –

+0

@paxdiabloここでは、私が説明しているような制御構造の[Python Enhancement Proposal](https://www.python.org/dev/peps/pep-0315/)を紹介します。これは、私が記述しているプログラミングパターンが実際には珍しくないことを示しています。 –

答えて

1

私はこれが完全に満足のいく答えではないことを認識しています.C#にはこのような制御構造が組み込まれていないからですが、元々は構文がより簡潔になり、ために。 (C#はブール関数に暗黙のキャストを行いませんので、式を取り囲む明示的な "ガベージ")。

それ以外のC#コードは、私が言及した別のキーワードの選択肢を示していますコメント:do { <body> } while (<test>; <update>)。このdo-while-update構文は、提案したfor-while構文よりもパターン・フローによく似ています。あなたが構成変数の範囲に関心を持っていない限り、新しい構成には<init>(forループのような)のための特別な場所が必要であることはすでに疑問ですが、私の経験では既存のdo-constructはそれを提供していません。

var min = i; //<init> 
do { 
    //<body> 
    var left = 2 * i + 1; 
    var right = 2 * (i + 1); 

    if (left < len && heap[left] < heap[min]) 
     min = left; 
    if (right < len && heap[right] < heap[min]) 
     min = right; 
} while ((min != 1) // <test> 
    ? ((Func<bool>)(() => { 
     swap(heap, i, min); i = min; //<update> 
     return true; }))() : false); 

注:三条件演算子は<update>セクションが<test>が真である場合にのみ実行されることを保証します。

関連する問題