プログラミング原人の進化ログ

プログラミング原人の進化論

オレ プログラミング ベンキョウ スル。マナンダ コト カク。

【Common Lisp】型述語まとめ

Common Lisp の型述語の勉強メモです。

型述語

真偽値を返す関数を述語と言います。特にデータ型の判定をするものを型述語と呼びます。

  • numberp
  • arrayp
  • characterp
  • consp
  • functionp
  • hash-table-p
  • listp
  • stringp
  • symbolp

型の名前に述語(predicate)を表すpがついているだけなので、どのような働きをするかはすぐわかります。

例:

CL-USER> (arrayp #(a b c))
T
CL-USER> (symbolp 'a)
T
CL-USER> (stringp "lisp alien")
T
CL-USER> (consp '(1 . 2))
T
CL-USER> (consp '(1 2 3)) 
T
CL-USER> (numberp '(1))
NIL
CL-USER> (listp '(1))
T

listpとconspは何が違うのか?

CL-USER> (listp '(1 2 3))
T
CL-USER> (consp '(1 2 3))
T
CL-USER> (listp '(1 . 2))
T
CL-USER> (consp '(1 . 2))
T

一見、特に違いがないように見えます。まあ、リストはコンスセルが繋がったものなのでそりゃそうなのだろうとは思いますが・・・。 調べてみると、nilの扱いで違いが出るみたいです。

CL-USER> (listp nil)
T
CL-USER> (consp nil)
NIL

nilは空リストなので、listpでは真が返します。コンスセルは2つのオブジェクトを指し示す構造なので、確かにconspの返り値が偽となるのは納得できます。

参考

listp と consp の違い - 日々ごちゃごちゃと考える

コンラッドバルスキ(2013)「Land of Lisp」 川合史郎訳 オライリー・ジャパン