考虑我经常使用的这种流程结构:
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
构造。
我不确定是发布在这里还是发布在程序员身上。如果这个问题更合适,那么请移动它。感谢。
答案 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在else
和while
上有for
个子句,但只有在循环永远不会与break
,return
等分开时才会运行
答案 2 :(得分:1)
某些语言具有宏功能,可让您定义此类内容。在 C , C ++ , Common Lisp 中,您可以定义此类宏。
答案 3 :(得分:0)
我不是Common Lisp的LOOP宏的粉丝,但它可以用
来做(循环while(has-posts-p)做(显示 - 下一篇)最后(return(display-no-posts-content)))
如果您不关心价值,则无需退货。