是否有任何具有 for-while 循环的编程语言?
Is there any programming language which has a for-while loop?
这就是我所说的 for-while 循环的意思:
for (<init>; <update>) <body> while (<test>);
大致翻译为:
<init>
<body>
while (<test>) {
<update>
<body>
}
这看起来像 very common programming pattern。然而,据我所知,没有一种语言具有这样的控制结构。因此,一个常见的解决方法是按如下方式实现它:
<init>
while (true) {
<body>
unless (<test>) break;
<update>
}
虽然这有效,但感觉很笨重。以我的拙见,在无限 while 循环的中间有一个条件中断违背了结构化编程的精神。
这是一个需要 for-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 不算在内,因为它主要是功能性的,我正在寻找一种主要是命令式的编程语言。
我意识到这不是一个完全令人满意的答案,因为 c# 没有这样的内置控制结构,但我原本预计语法会更简洁,这样它就差不多是你的样子了寻找。 (事实证明,c# 不会将 lambda 表达式隐式转换为布尔函数,因此表达式周围显式 "garbage"。)
除此之外,以下 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>
为真时执行。
这就是我所说的 for-while 循环的意思:
for (<init>; <update>) <body> while (<test>);
大致翻译为:
<init>
<body>
while (<test>) {
<update>
<body>
}
这看起来像 very common programming pattern。然而,据我所知,没有一种语言具有这样的控制结构。因此,一个常见的解决方法是按如下方式实现它:
<init>
while (true) {
<body>
unless (<test>) break;
<update>
}
虽然这有效,但感觉很笨重。以我的拙见,在无限 while 循环的中间有一个条件中断违背了结构化编程的精神。
这是一个需要 for-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 不算在内,因为它主要是功能性的,我正在寻找一种主要是命令式的编程语言。
我意识到这不是一个完全令人满意的答案,因为 c# 没有这样的内置控制结构,但我原本预计语法会更简洁,这样它就差不多是你的样子了寻找。 (事实证明,c# 不会将 lambda 表达式隐式转换为布尔函数,因此表达式周围显式 "garbage"。)
除此之外,以下 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>
为真时执行。