任何语言都有while-else流程结构吗?

时间:2012-08-30 05:35:37

标签: coding-style

考虑我经常使用的这种流程结构:

if ( hasPosts() ) {
    while ( hasPosts() ) {
        displayNextPost();
    }
} else {
    displayNoPostsContent();
}

是否有任何编程语言对else具有可选的while子句,如果从未输入while循环,那么该子句将被运行?因此,上面的代码将成为:

while ( hasPosts() ) {
    displayNextPost();
} else {
    displayNoPostsContent();
}

我觉得有趣的是,许多语言都有do-while构造(在检查条件之前运行while代码一次)但我从未见过while-else。根据在N-1块中运行的内容运行N代码块有先例,例如try-catch构造。

我不确定是发布在这里还是发布在程序员身上。如果这个问题更合适,那么请移动它。感谢。

4 个答案:

答案 0 :(得分:6)

这真是太深奥了。标准Common Lisp不提供它。但我们在名为ITERATE的库中找到它。

Common Lisp具有极其奇特的控制结构。有一个名为 ITERATE 的库,它与Common Lisp的LOOP宏类似,但具有更多功能和更多括号。

示例:

(iterate (while (has-posts-p))
  (display-next-post)
  (else (display-no-posts-content)))

它完全符合您的要求。当 while 子句永远不为真时, else 子句只运行一次。

示例:

(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))))

有一些帖子

EXTENDED-CL 41 > *posts*
(1 2 3 4)

EXTENDED-CL 42 > (test)

1 
2 
3 
4 
NIL

没有帖子

EXTENDED-CL 43 > *posts*
NIL

EXTENDED-CL 44 > (test)
no-posts
NIL

答案 1 :(得分:4)

Python在elsewhile上有for个子句,但只有在循环永远不会与breakreturn等分开时才会运行

答案 2 :(得分:1)

某些语言具有宏功能,可让您定义此类内容。在 C C ++ Common Lisp 中,您可以定义此类宏。

答案 3 :(得分:0)

我不是Common Lisp的LOOP宏的粉丝,但它可以用

来做

(循环while(has-posts-p)做(显示 - 下一篇)最后(return(display-no-posts-content)))

如果您不关心价值,则无需退货。