実践Common lispを読み始めた-第10章 数、文字、そして文字列
ファーストクラスのデータ型
Lispの関数はファーストクラスデータ型。でファーストクラスってどういう意味だろうか?関数自体を関数の引数とか戻り値に使えるということかな。でもそれだったらC/C++だって関数ポインタがあるじゃん。本当のところ何が満たせればファーストクラスなんだろう。wikipediaの説明が詳しかったので引用しておこう。ファーストクラスオブジェクトとも言うらしい。
第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、その言語における他のものと比べて制限なしに使用できる物体のことである。第一級オブジェクトは「第一級データ型に属す」という。
http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
この言葉は1960年代にChristopher Stracheyによって「functions as first-class citizens」という文脈で初めて使われた。言語によって、第一級オブジェクトは次のような性質をもつ。
* 匿名のリテラルとして表現可能である。
* 変数に格納可能である。
* データ構造に格納可能である。
* それ自体に独自性を内在する(名前とは独立している)。
* 他のものとの等値性の比較が可能である。
* プロシージャや関数のパラメータとして渡すことができる。
* プロシージャや関数の戻り値として返すことができる。
* 実行時に構築可能である。
* 表示可能である。
* 読み込むことができる。
* 分散したプロセス間で転送することができる。
* 実行中のプロセスの外に保存することができる。
第一級市民になるためには色々条件を満たさないといけないのだなぁ。最後の方は言語の範疇をちょっと超えているような気もする。C/C++では関数を実行時に構築することは言語仕様としては提供されていないので、ファーストクラスとは言えない。Lispの勝ち。
数値リテラル
代数演算
- +, -, *, /
- FLOOR 負の無限大方向に切り捨て
- CEILING 正の無限大方向に切り上げ
- TRUNCATE 0方向に丸める
- ROUND 最も近い整数に丸める。ちょうど中間値だったら偶数方向に丸める
数値比較
- =, /= 数の等値を比較する述語
- < > <= >=
文字比較
- 数値比較の=, /=, <, >, <=, >=のあたまにCHARをつける
- Case ignoreな比較もある
文字列
- ダブルクォート(")で囲む。(e.g "Hello")
文字列比較
- 数値比較の=, /=, <, >, <=, >=のあたまにSTRINGをつける
- Case ignoreな比較もある