Coding style 是否有任何语言具有while-else流结构?

Coding style 是否有任何语言具有while-else流结构?,coding-style,Coding Style,考虑一下我经常使用的这个流结构: if ( hasPosts() ) { while ( hasPosts() ) { displayNextPost(); } } else { displayNoPostsContent(); } 是否有任何编程语言为while提供了可选的else子句,如果从未进入while循环,则将运行该子句?因此,上述代码将变为: while ( hasPosts() ) { displayNextPost(); } el

考虑一下我经常使用的这个流结构:

if ( hasPosts() ) {
    while ( hasPosts() ) {
        displayNextPost();
    }
} else {
    displayNoPostsContent();
}
是否有任何编程语言为
while
提供了可选的
else
子句,如果从未进入while循环,则将运行该子句?因此,上述代码将变为:

while ( hasPosts() ) {
    displayNextPost();
} else {
    displayNoPostsContent();
}
我发现有趣的是,许多语言都有
do-while
构造(在检查条件之前运行一次while代码),但我从未见过
while-else
被处理。基于在N-1块中运行的代码,例如
try-catch
构造,运行N块代码有先例


我不确定是在这里发布还是在programmers.SE上发布。如果这个问题在那里更合适,那么请提出它。谢谢。

Python在
while
for
上有
else
子句,但它们只有在循环从未被
break
return
等打破时才会运行。

一些语言具有宏特性,可以让您定义这些东西。在C、C++、Common Lisp中,你可以定义这样的宏。

这是深奥的。标准的公共Lisp不提供它。但是我们在一个叫做

CommonLisp具有非常奇特的控制结构。有一个名为ITERATE的库,它类似于Common Lisp的
循环
宏,但具有更多的特性和更多的括号

例如:

(iterate (while (has-posts-p))
  (display-next-post)
  (else (display-no-posts-content)))
(defparameter *posts* '(1 2 3 4))

(defun has-posts-p ()
  *posts*)

(defun display-next-post ()
  (print (pop *posts*)))

(defun display-no-posts-content ()
  (write-line "no-posts"))

(defun test ()
  (iterate (while (has-posts-p))
    (display-next-post)
    (else (display-no-posts-content))))
这正是你想要的。当while子句从不为true时,else子句只运行一次

例如:

(iterate (while (has-posts-p))
  (display-next-post)
  (else (display-no-posts-content)))
(defparameter *posts* '(1 2 3 4))

(defun has-posts-p ()
  *posts*)

(defun display-next-post ()
  (print (pop *posts*)))

(defun display-no-posts-content ()
  (write-line "no-posts"))

(defun test ()
  (iterate (while (has-posts-p))
    (display-next-post)
    (else (display-no-posts-content))))
有一些帖子:

没有员额:


我并不特别喜欢Common Lisp的循环宏,但它可以用

(循环while(has-posts-p)do(显示下一篇文章)finally(返回(显示无文章内容)))


如果您不关心值,则无需返回。

Ooh我希望有人演示如何在Scala中实现这样的构造这是针对Pythontanks的,这看起来很接近我们将要介绍的功能。不,这是不同的。始终执行
FINALLY
子句。需要的是一个子句,该子句仅在
循环
主体未运行时运行<代码>循环没有这样的功能。