2018年7月13日金曜日

nilってほんとうにNULLなのか!

 けっこうdefmethodが好きだ。
 というのも引数によって処理を分岐する関数をつくることが多いから。
 たとえば(下記はelispだけど)。

(defun y-string-to(x)
  "stringへ変換"
  (cond ((null x) "")
 ((listp x)(y-string-to (car x)))
 ((symbolp x)(y-string-to (symbol-name x)))
 ((stringp x) x)
 ((numberp x) (number-to-string x))
 ((vectorp x)(y-string-to (aref x 0)))))

 とか。
 defmethodを使えば、これらは全部、分けられる。

(defmethod y-string-to((x string))
      x)

(defmethod y-string-to((x number))
      (format nil "~D" x))

 とか。でもstringでもnumberでもないnilのときはどうすれば、いいねん、と思っていたら定義できるのだった。

(defmethod y-string-to((x null))
      "")

 nilってNULLってタイプなのか!

DEF> (type-of nil)
NULL
DEF>