観察日記 2010-09-07

Ruby の望む永遠

<ko1_ndk> http://www.atdot.net/sp/readonly/4r3a7l
<ko1_ndk> 関係ないけどこんなの考えた
<ko1_ndk> ..n で HalfRange クラスとかどうだろうな
<n0kada> ...nはn未満?
<ko1_ndk> ですかねー
<ko1_ndk> hr = ..n
<ko1_ndk> きもーい
<n0kada> n...が微妙
<mrkn> [n, ∞)
<mame0> 文法はともかく HalfRange ほしいですね
<mrkn> n..nil とかダメかな
<mame0> 今 Float::INFINITY になっているものを、Float でなく INFINITY にしたい
<n0kada> それって出てたっけ
<mrkn> INFINITY.to_f == Float::INFINITY になるなら賛成
<mrkn> Kernel::INFINITY ができると 1/0 が成立できる
<unak> とりあえず、Kernel::INFINITYはねーよ。Numericだろー
<mrkn> unak: 確かに
<shyouhei> ∞は数ではないですからのう…
<unak> そうきたか
<shyouhei> 無限にもいくつかあるので、アレフ0とかアレフ1とか。
<mrkn> Real を超実数の実装だとすると、それの INFINITY は数になるんじゃないかなぁ
<shyouhei> Realが超実数って矛盾してるお
<mrkn> HyperReal じゃないとダメか
<unak> 理屈はともかく、今の話題に対応するINFINITYは数の世界の話だろう。
<mame0> Heal
<unak> 癒された
<shyouhei> 言語理論では無限はあんまし意識的に操作されないからなあ
<shyouhei> %r/A*B*/みたいなのの*はまさに無限集合なわけだけど。
<shyouhei> ("foobar"..) とかでどうなるかだよね、Ruby的には。
<mame0> 永遠に succ りつづけるんじゃないですかね
<shyouhei> すると文字列が望む永遠というものがあるわけで
<shyouhei> やっぱ無限は数に限らないという話になる。
<unak> ふうむ。"foobar"..INFINITY ですか。
<shyouhei> したいというか、無限にsuccる意味論にするならそう解釈せざるをえないだろうなと。
<mame0> せざるをえないのかはわからないけど、そうできたら綺麗ですね
<ko1_ndk> HalfRange なるものは,数値以外には無理か
<ko1_ndk> (..'a') とかわからん
<mame0> (..1) だって (..1).each {|x| p x } とか意味不明ですね
<nurse> ("a"..)はいける気がする
<ko1_ndk> (..1).include? は定義できそうじゃない
<mame0> include? はできる
<nurse> それだと(-INFINITY..1)かな
<unak> そうなるですね
<mame0> (..1) と (1..) は別のクラスにすべきかもですね
<ko1_ndk> succ できるって定義がだめなのかな
<nurse> 1..はeachできるけど、..1はreverse_eachじゃないとだめだな
<mame0> reverse_each するためには prev が定義されていないと
<ko1_ndk> いやなコードだ> ..1.reverse_each
<ko1_ndk> NumericRange とかどんどん Smalltalk っぽく

Rubyの小数の未来

<mame0> Ruby の数の体系をちゃぶだいひっくり返していいとしたら どうしたいですかね
<mrkn> まず、Real クラスを導入させてもらう
<mame0> Real ってどう実装するの?
<shyouhei> ruby-devに出したか知らんけど無限大とか無限小とか超準解析とかyuguiさんが詳しい。
<mrkn> アルゴリズムで無理数を表現する
<mame0> やはりそうなるか
<shyouhei> テーラー展開ですよ。
<mrkn> 数値にしたい時に、桁数を指定してはじめて Float や BigDecimal に化ける
<mrkn> それまでは全部アルゴリズムで保持
<mame0> 必要な桁数を取り出すって必ずできるものなの?
<mrkn> 必要な桁数を取り出せるアルゴリズムだけで構成されていれば可能ではないかと
<shyouhei> ぶっちゃけFloatは捨てたい
<mame0> Float 捨てたい同意
<shyouhei> Floatを数値じゃない型にしたい。
<shyouhei> FloatはFloatで閉じていただくということで
<mrkn> あと、Float に BigDecimal を九州させて
<mrkn> accuracy と precision も導入し...
<mrkn> 夢は尽きませんね
<shyouhei> それはないかなあ>BigDecimalがFloatに吸収
<shyouhei> 基数がちがうもん。
<shyouhei> 新設のBigBinaryができるとかならわかる。
<mrkn> BigBinary も入れたい
<mrkn> ただ ComplexFloat が無理だったので、BigBinary と BigDecimal は別個に同居できないはずなので
<mrkn> こいつらは任意基数の浮動小数点数とする
<mrkn> (2 と 10 だけで良いと思います
<shyouhei> BigDecimalは10進だからこそ日常生活で便利なことがあるので、それはそれであっていいと思うんですよ。実装はともかくコンセプトは。
<mrkn> 同意します
<shyouhei> FloatもCとのインターフェースとしてなんだかんだ捨てれないとは思う。
<mame0> Float と綺麗な数体系の数との演算は例外で
<mame0> explicit に型変換してください
<mrkn> Thread ローカルな変数で例外を off にできるようにしてあげたいなぁ
<shyouhei> Floatとというかやっぱexact/inexactでまず分かれるべきじゃないかなーと。
<mame0> Scheme の exact/inexact ほど原理主義的なのは
<mame0> 別に便利じゃないと思うんだよな
<nurse> オフにしたい場合はone linerだと思うけど、リテラルがFloatじゃなくなったら、one linerでFloatは使うのかね
<mame0> inexact な Rational とかあるらしい
<nurse> 原則全部exactになったら、その世界から外れたときに警告してもいいかなとは思う
<shyouhei> 1/πとかinexactだけどRationalだよね
<mrkn> to_f(n) するまで exact っていうのはとても気持ち良い体系ですね
<mrkn> (1/π) * π は exact になる?
<mame0> とりあえず Ruby で Real クラス作ってみるのがいいんじゃないだろうか
<shyouhei> 通分してexactな成分しか残ってなければexactになるというのは頭よさげ
<mame0> いまいち現実味があるのかわからない
<mrkn> Math.exp(-π.i) が Fixnum の -1 になるんですよ
<mame0> アルゴリズムで保持してるなら Real の -1 になるのでは
<shyouhei> ところで小数のリテラルがBigDecimalになるというのはわりと今すぐ可能な気がするんだが
<shyouhei> そうするとどうなるんだろう
<mrkn> 賛成です > 小数リテラルを BigDecimal
<mame0> 言語組み込みリテラルが拡張ライブラリのクラスのインスタンスになるだと
<mrkn> Float を期待していた人々が反乱を起こす
<mame0> BigDecimal が組み込みになってからでしょう
<mame0> ならない気がするけど
<ko1_ndk> リテラルの挙動まで変更できる柔軟性を持つべき,ということでしょうか
<shyouhei> BigDecimalの表現を経由してFloatに変換さすと
<mrkn> Real の -1 にできるなら、そこは Fixnum の -1 にしてあげたいな
<shyouhei> Floatリテラルと同じFloatオブジェクトは
<shyouhei> 生成できるとは限らないんだろうか
<ko1_ndk> リテラル文は,全部メソッド呼び出し
<mame0> 1.0 と 1.00 は意味が違ってくるのかな
<mrkn> 本当は 1.2 というリテラルは 12/10 でもなく Float の 1.2 でもなく、無限精度の 1.2 になるんだと思う
<shyouhei> BigDecimal経由でもできるFloatが一緒ならまあ
<shyouhei> explicitに変換してもらえばいいんじゃねという気はする。
<mrkn> 結局、Float が欲しい人は拡張ライブラリの著者か、NArray か何かで Float を使ってる人なので
<mrkn> スカラーの Float が最初にある必要は無いんだと思っている

柑橘系

<nalsh> RubyKaigiに向けてPsychさんに600円貢いだ
<unak> なるほど。
<sora_h> えっ
<unak> LimeChat for iPhoneを買ったという話。
<nalsh> うむ
<unak> ということをこの一文から読み取るだけの推理力が要求される難しいチャンネル
<nalsh> 洞察力が鍛えられる