orinsert-buffer 関数における or
式の目的は、引数 buffer
が単なるバッファ名ではなく、バッファにバインドされるようにすることです。前節では、if
式を用いてどのように処理できたかを示しました。しかし、insert-buffer 関数では実際には
or が使用されています。これを理解するには、or の仕組みを理解する必要があります。
or 関数は、任意の数の引数を取ることができます。各引数を順に評価し、nil ではない最初の引数の値を返します。また、ここが or
の極めて重要な特徴ですが、最初の非 nil 値を返した後は、それ以降の引数を一切評価しません。
or 式は次のようになります。
(or (bufferp buffer)
(setq buffer (get-buffer buffer)))
or の第1引数は式 (bufferp
buffer) です。この式は、バッファが単なるバッファ名ではなく実際にバッファである場合に true(nil 以外の値)を返します。or
式において、この条件が満たされた場合、or 式はこの true
値を返し、次の式は評価されません—そして、buffer
が実際にバッファである場合にその値に対して何も操作を行いたくないため、これで問題ありません。
一方、(bufferp buffer) の値が nil である場合(buffer
の値がバッファ名であればそうなります)、Lisp インタプリタは or
式の次の要素を評価します。それが (setq buffer (get-buffer buffer))
式です。この式は nil 以外の値を返し、それが変数 buffer に代入される値となります。そして、この値はバッファ名ではなく、それ自体がバッファです。
これらすべてにより、シンボル buffer
は常にバッファ名ではなく、バッファそのものに紐付けられます。このようにする必要があるのは、後続の行にある set-buffer 関数が、バッファ名ではなくバッファそのものでしか動作しないためです。
ちなみに、orを使うと、案内係との状況は次のように記述されます。
(or (holding-on-to-guest) (find-and-take-arm-of-guest))