初稿: 2018-07-18 Wed 12:51
最終更新日: 2018-12-14 Fri 20:44
ホーム | 文書トップ | 目次

elispにおける条件分岐、真偽値

目次

elispにももちろん制御構造があり、どんな値が真だと判定されるかは重要になります。 また真偽値を返す関数についても扱います。

1 t, nil

一般のプログラミング言語の true / false に対応するシンボルが t / nil です。

また nil には空リストという意味があり、()を評価すると nil になります。

nil                                     ; => nil
()                                      ; => nil
'()                                     ; => nil

ここで src/eval.c (emacsソース内)より if のソースを引用します。

DEFUN ("if", Fif, Sif, 2, UNEVALLED, 0,
       doc: /* If COND yields non-nil, do THEN, else do ELSE...
Returns the value of THEN or the value of the last of the ELSE's.
THEN must be one expression, but ELSE... can be zero or more expressions.
If COND yields nil, and there are no ELSE's, the value is nil.
usage: (if COND THEN ELSE...)  */)
  (Lisp_Object args)
{
  Lisp_Object cond;

  cond = eval_sub (XCAR (args));                // argsの1要素目を取り出して実行する

  if (!NILP (cond))                             // 組み込み関数NILP
    return eval_sub (Fcar (XCDR (args)));
  return Fprogn (XCDR (XCDR (args)));
}

これを見れば明らかなように、elispの if はc言語の if を呼んでおり、判定は NILP によってなされています。 つまり明示的に t というシンボルがありますが、 nil ではないものは全て t として扱われることがわかります。

2

日付: 2018-07-18 Wed 12:51

著者: Naoya Yamashita

Created: 2018-12-14 Fri 21:04

Validate