4

ELisp を使用している場合else、ステートメントのブロックで複数の式を実行するにはどうすればよいですか?if

4

2 に答える 2

12

prognこれはすでにデフォルトの動作であるため、これは必要ありません。

C-hf if RET

if は「C ソース コード」の特別な形式です。

(if COND THEN ELSE...)

COND が非 nil を返す場合は THEN を実行し、そうでない場合は ELSE を実行します...
THEN の値または最後の ELSE の値を返します。
THEN は 1 つの式でなければなりませんが、ELSE... は 0 個以上の式にすることができます。
COND が nil を返し、ELSE がない場合、値は nil です。

sindikat の例を再利用するには:

(if (> 1 2)
    (message "True")
  (message "False")
  (message "I repeat, completely false"))

もちろん、フォームprogn内の複数の式を評価したい場合に使用しますTHEN

于 2012-04-26T12:17:31.623 に答える
5

philsの答えは正しく、慣用的です。elseのブロックでいくつかのステートメントを実行したい場合ifで、Emacs Lisp だけに関心がある場合は、彼の答えに従ってください。

Emacs Lisp と Common Lisp では、副作用のために複数のアクションを順番に実行したい場合(変数を変更する、画面に何かを出力するなど、一般的に、値を返す関数とは関係のないものすべて)、次に値を返します。prognprog1、またはを使用しますprog2。それらはすべて、内部のすべてのフォームを評価しますが、それぞれ最後、最初、および2番目の式の値のみを返します。

(progn 1 2 3 4 5)5 を(prog1 1 2 3 4 5)返し、1 を返し、2 を返します。 , 内のフォームを評価するポイントは副作用のためで(prog2 1 2 3 4 5)あるため、これは明らかに役に立ちません。したがって、次のすべては文字列, , ,をエコー領域(およびバッファ) に出力しますが、返される文字列は 1 つだけです。prognprog1prog2αβγδ*Messages*

(progn (message "α") (message "β") (message "γ") (message "δ")) ; => "δ"
(prog1 (message "α") (message "β") (message "γ") (message "δ")) ; => "α"
(prog2 (message "α") (message "β") (message "γ") (message "δ")) ; => "β"

3 つの関数はすべて、Emacs Lisp と Common Lisp の両方に存在します。しかし、3番目の式の値を返したい場合はどうでしょうか。ありませんprog3。既存のものを組み合わせる!次のすべての戻り値γ:

(progn (message "α") (message "β") (prog1 (message "γ") (message "δ"))) ; => "γ"
(prog1 (progn (message "α") (message "β") (message "γ")) (message "δ")) ; => "γ"
(prog2 (message "α") (progn (message "β") (message "γ")) (message "δ")) ; => "γ"
(prog2 (message "α") (prog2 (message "β") (message "γ") (message "δ"))) ; => "γ"

Common Lisp では、ステートメントをグループ化し、最後のステートメントの値のみを に返すにはif、次のようにします。

(if t
    (progn (message "ε") (message "ζ"))
    (progn (message "η") (message "θ"))) ; returns ζ
(if nil
    (progn (message "ε") (message "ζ"))
    (progn (message "η") (message "θ"))) ; returns θ

Emacs Lisp では、thenブロック内のステートメントをprogn, prog1,でグループ化する必要prog2がありますが、ブロック内でグループ化elseする必要はありません。したがって、phils の答えです。Emacs Lisp では(if nil 1 2 3)3 を返しますが、Common Lisp では でエラーになりtoo many parameters for special operator IFます。

参照: 「Emacs Lisp Intro 」のセクション「8.1.4 The 'progn' Special Form」。

于 2012-04-26T09:38:01.107 に答える