Scheme:数値リテラル

Scheme:数値リテラル

Schemeの数値リテラルフォーマットは、なんだか複雑だ。

関連: Gauche:数値の入出力, Gauche:拡張浮動小数点演算の謎

#(ナンバー)の存在

Scheme の数値データの書式には # なるものがある。 というか使える実装がある。

STk の例

STk> 123##
12300.0
STk> (/ 123## 123)
100.0

scheme48 の例

> 123##
12355.
> (/ 123## 123)
100.447

とまぁこんな次第で、もちろん限定的な数値になる。 r5rs では特に細かな指定が無いわけだから、# => 0 としたり # => 5 としたり、 実際なんでもよくて基数より小さな数値ならなんに置き換えてもよさそうだ。

しかし、実際つかっているのを見たことがないし、 他の言語はあまり広く知らないけど、 こういう数値の書式を指定できるのを聞いたこともなかった。 だいたい実装によって上記の例のように、 同じ式が(限定的とはいえ)結構な誤差を生み出すではないか。

Scheme ではなぜ、こういう入力を許しているのだろう。 そもそも他の言語で当たり前になっていたんなら仕様検討に上がるのも理解できるが、 他の言語であまり見ないのにわざわざ導入されている ってことはこの機能が欲しいという積極的な主張があったと推測されるのだが。

また、r5rs の仕様に盛り込まれているってことは、 色々考えられた末に導入決定されているのだろうが、 そもそも何に、あるいはどういう風に使うのだろう? つまり、これによって我々はどういったパワーを手に入れるのだろう。 ちなみに手元の gosh/cygwin では、 unbound variable になる。

R6RS draftに記述を見つけました "It is inexact if it contains a decimal point, an exponent, or a “#” character in the place of a digit; otherwise it is exact." でもやっぱり存在意味不明。

More ...