ELisp を使用している場合else
、ステートメントのブロックで複数の式を実行するにはどうすればよいですか?if
2 に答える
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
。
philsの答えは正しく、慣用的です。else
のブロックでいくつかのステートメントを実行したい場合if
で、Emacs Lisp だけに関心がある場合は、彼の答えに従ってください。
Emacs Lisp と Common Lisp では、副作用のために複数のアクションを順番に実行したい場合(変数を変更する、画面に何かを出力するなど、一般的に、値を返す関数とは関係のないものすべて)、次に値を返します。progn
、prog1
、またはを使用しますprog2
。それらはすべて、内部のすべてのフォームを評価しますが、それぞれ最後、最初、および2番目の式の値のみを返します。
(progn 1 2 3 4 5)
5 を(prog1 1 2 3 4 5)
返し、1 を返し、2 を返します。 , 内のフォームを評価するポイントは副作用のためで(prog2 1 2 3 4 5)
あるため、これは明らかに役に立ちません。したがって、次のすべては文字列, , ,をエコー領域(およびバッファ) に出力しますが、返される文字列は 1 つだけです。progn
prog1
prog2
α
β
γ
δ
*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」。