プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやるITエンジニアがスキルアップの話を中心に日常を綴るブログです。

「Ansi Common Lisp」9章読了

数値に関する章。

データ型

基本は、整数、浮動小数点数、分数(ratio)、複素数の4種類。
図9.1に数値型の一覧と親子関係について載っているのですが、
細分化すると全部で14種類もあります。
複素数をデフォルトでサポートしているところが、なんとなくPythonっぽい。
(むしろ、PythonCommon Lispっぽいのかも知れませんが。って、前も同じようなこと書いた気が。)

複素数は#c(a b)で書けるらしい。

* (+ #c(1 2) #c(3 4))

#C(4 6)
* (eql 1 #c(1 0))

T
*

1と#c(1 0)がeqlになってしまうのは、ちょっと意外。
数値はeqlもequalも同じなのかな?

変換と抽出

関数roundが、ちょっと他の言語と違うらしい。

JRuby & Java(jirb使ってます)

irb(main):002:0> 2.5.round
=> 3
irb(main):003:0> java.lang.Math.round(2.5)
=> 3
irb(main):004:0>

Common Lisp(CMUCL)

* (round 2.5)

2
0.5
*

round 2.5は3になって欲しいかもなあ。

比較

普通に>, >=, =, <, <=, /=が使えるらしい。

* (> 3 2 1)

T
* (< 1 2 3)

T
*

みたいなことが出来るのは、Lispならではって感じもしますが。

計算

普通に四則演算が使える。

* (- 5 3 1)

1
* (* 3 4 5)

60
*

引数が3つ以上取れるのは、比較演算子(じゃなくて比較関数)と同じ。

指数

三角関数

そのまんま。読めば分かる。

表現

Common Lispは整数の大きさを制限していない。

Javaでは型によって、取りうる値の範囲は決められていますが、Common Lispではそうではないのですね。
most-うんぬんかんぬんってのを参照すると、処理系に応じた最大値を表示できます。

* (values most-positive-fixnum most-negative-fixnum)

536870911
-536870912
* 

他のやつは、
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/html/cltl/clm/node134.htmlに載ってるっぽい。(CMUCLの場合)