7

考虑一下我碰巧经常使用的这种流程结构:

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

是否有任何编程语言具有可选else子句 for while,如果从未进入 while 循环,则将运行该子句?因此,上面的代码将变为:

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

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

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

4

4 回答 4

6

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

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

例子:

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

它完全符合您的要求。else子句仅在 while 子句从不为真时运行一次

例子:

(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
于 2012-10-02T09:03:29.320 回答
4

Python在and上有else子句,但它们仅在循环从未中断 with , 等情况下运行。whileforbreakreturn

于 2012-08-30T05:37:31.383 回答
1

某些语言具有宏功能,可让您定义此类事物。在CC++Common Lisp中,你可以定义这样的宏。

于 2012-08-30T05:39:00.853 回答
0

我不是 Common Lisp 的 LOOP 宏的特别粉丝,但它可以做到

(loop while (has-posts-p) do (display-next-post) finally (return (display-no-posts-content)))

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

于 2012-10-02T15:37:52.040 回答