7

私がたまたま頻繁に使用するこのフロー構造を考えてみてください。

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

while ループに入らない場合に実行されるオプションelse節 forを持つプログラミング言語はありますか? whileしたがって、上記のコードは次のようになります。

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

多くの言語がdo-while構造 (条件をチェックする前に while コードを 1 回実行する) を持っていることは興味深いことですが、while-else対処されているのを見たことがありません。try-catchコンストラクトなど、N-1 ブロックで実行されたものに基づいて、コードの 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句が true にならなかった場合に 1 回だけ実行されます。

例:

(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 にはonとのelse節がありますが、、 などでループが抜け出さない場合にのみ実行されます。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 に答える