実践Common lispを読み始めた-第10章 数、文字、そして文字列

ファーストクラスのデータ型

Lispの関数はファーストクラスデータ型。でファーストクラスってどういう意味だろうか?関数自体を関数の引数とか戻り値に使えるということかな。でもそれだったらC/C++だって関数ポインタがあるじゃん。本当のところ何が満たせればファーストクラスなんだろう。wikipediaの説明が詳しかったので引用しておこう。ファーストクラスオブジェクトとも言うらしい。

第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、その言語における他のものと比べて制限なしに使用できる物体のことである。第一級オブジェクトは「第一級データ型に属す」という。
この言葉は1960年代にChristopher Stracheyによって「functions as first-class citizens」という文脈で初めて使われた。言語によって、第一級オブジェクトは次のような性質をもつ。
* 匿名のリテラルとして表現可能である。
* 変数に格納可能である。
* データ構造に格納可能である。
* それ自体に独自性を内在する(名前とは独立している)。
* 他のものとの等値性の比較が可能である。
* プロシージャや関数のパラメータとして渡すことができる。
* プロシージャや関数の戻り値として返すことができる。
* 実行時に構築可能である。
* 表示可能である。
* 読み込むことができる。
* 分散したプロセス間で転送することができる。
* 実行中のプロセスの外に保存することができる。

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

第一級市民になるためには色々条件を満たさないといけないのだなぁ。最後の方は言語の範疇をちょっと超えているような気もする。C/C++では関数を実行時に構築することは言語仕様としては提供されていないので、ファーストクラスとは言えない。Lispの勝ち。

Lispでの数の特徴

  • 整数は2^262144とほぼ無制限の数が扱える
  • 分数が扱え、任意の精度の有理数が扱える
  • 複素数が扱える

数値リテラル

  • 整数は符号(省略可能)と1つ以上の数字で構成される。
  • 分数は正規化される
  • 有理数は基数を10以外に設定できる。(#b:2進数,#o:8進数,#x:16進数,#nr(n=2...36の10進数):n進数)
  • 浮動小数点はshort, single, double, longの4つの型がある。
  • 複素数は#c(実部、虚部)で表現。実部と虚部にはそれぞれ有理数浮動小数点のどちらも使えるが、どちらかが浮動小数点だったら他方も浮動小数点になる。

代数演算

  • +, -, *, / 
  • FLOOR 負の無限大方向に切り捨て
  • CEILING 正の無限大方向に切り上げ
  • TRUNCATE 0方向に丸める
  • ROUND 最も近い整数に丸める。ちょうど中間値だったら偶数方向に丸める

数値比較

  • =, /= 数の等値を比較する述語
  • < > <= >=

高度な数学

  • LOG
  • EXP,EXPT
  • SIN, COS, TAN
  • ASIN, ACOS, ATAN
  • SINH, COSH, TANH
  • ASINH, ACOSH, ATANH

など

文字比較

  • 数値比較の=, /=, <, >, <=, >=のあたまにCHARをつける
  • Case ignoreな比較もある

文字列

  • ダブルクォート(")で囲む。(e.g "Hello")

文字列比較

  • 数値比較の=, /=, <, >, <=, >=のあたまにSTRINGをつける
  • Case ignoreな比較もある