これは私がのために-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は主に機能的であり、私は主として命令型プログラミング言語を探しているのでカウントされません。
私は40年のログキャリアでこれまで見たことのないような「非常に一般的なプログラミングパターン」*: – paxdiablo
@paxdiabloおそらくあなたは、この制御構造は問題ありません。しかし、プログラミングで長年経験してきた私は、このパターンに何度も遭遇しました。これはあまり一般的ではありません。しかし、私はそれが新しい制御構造を保証するのに十分一般的だと思います。 –
@paxdiabloここでは、私が説明しているような制御構造の[Python Enhancement Proposal](https://www.python.org/dev/peps/pep-0315/)を紹介します。これは、私が記述しているプログラミングパターンが実際には珍しくないことを示しています。 –