Gauche > Archives > 2019/11/14

2019/10/24 16:02:31 UTCとおる。
#
ぼくは、10 進の少数表記は人間が読むためのものなので、そんなに精度があってもどうせ誰も正しく認識できないので、そこまで正確でなくてもいいと思っていたんですが、hamayama さんはどのような目的で eenum を作られたんですか?
#
あ、少数じゃなくて小数でした。
2019/10/24 17:02:30 UTCshiro
#
桁数指定なしの ~f はinexact numbersに関してはwrite/read invarianceが保証されるので、それをexactに拡張するという考え方なら、#eつけて全桁表示ってのはありえるのかもしれない。いっそ循環小数の表記法も発明しちゃうとか。
2019/10/24 17:07:32 UTCshiro
#
他のフォーマット指示子は数値プレフィクスはつけないから#eを出すのは一貫性が気になるけど、出さないとinvarianceが…
#
Common Lispでは ~f に正確数が与えられた場合にflonumを介さずに表示することは許されてるんだな。桁数指定がなくて循環小数になる場合の打ち切り桁数は処理系依存。
2019/10/24 18:48:13 UTCshiro
#
「2個目のピリオド以降は循環」というのはどうか。
4/3 = 1.33333... -> 1..3
5/28 = 0.17857142857142... -> 0.17.857142
紛らわしすぎるかな
2019/10/24 19:28:13 UTCとおる。
#
Unicode で 1.234̇567̇ とか……。
2019/10/24 23:41:47 UTCshiro
#
Unicodeha
#
Unicodeは魅力的なアイディアだけど、環境によっては上の点が見えないのがこまる
#
0.17{857142} とかはありえなくはないかな
#
ほとんど表示だけに使われるだろう考えれば、ASCIIにこだわる必要は確かにないか。いろんな環境で見えさえすれば。
2019/10/25 07:14:54 UTCとおる。
#
あ、でも、循環小数はソースコードに書きたいという需要もありそうですね。{} は入力しやすいですし。0.17`857142` とかも視覚的にはいいかも。
2019/10/25 10:47:40 UTChamayama
#
言われてみると、あまり実用的な使い道はないような気がしてきました。。。

> hamayama さんはどのような目的で eenum を作られたんですか?
#
当時の経緯としては、Gauche の format にまだ ~f がなくて、
それが必要になったので調査を始めました。

それで、Gauche の print_double の出力が可逆になっていることを知って、
これは、自前で変換を考えるよりも、Gauche の出力を受け取って、
小数点の位置等を文字列上で細工した方がよさそうだということになりました。

それで、ある程度作ったところ、eenum 自体は文字列操作だけなので、
double (flonum) にしばられる必要もないと思って、
他の型の入力も受け付けるようにしました。
#
当時のメモを見ると、算術圧縮や循環小数とあるので、
それらの内容確認に使えると思っていたようです。

しかし、それらは整数演算のアルゴリズムで計算することが多いので。。。
2019/10/25 15:35:54 UTCkaki
#
R7RS的にはデリミタは #[ |()";] だけですけど、個人的には括弧類とクォート類はデリミタでいてほしい気持ちがあります。とすると見やすそうなのは ~ や ^ 、<> 辺りがありますね。0.17~857142、0.17^857142、0.17<857142>。
#
別の話なんですが、uvectorもmatchでパターンマッチできると嬉しいなと思いました。
2019/10/26 02:04:33 UTCshiro
#
パターンに#u8(...)をリテラルとして許すことはできますが、その中にパターン変数は書けないんですよね。#u8(a b c)というのはread時にエラーになっちゃう
2019/10/26 02:49:39 UTCkaki
#
パターンを新設する必要がありますね。それか既存のパターンにかぶせるか(例えば ($ <u8vector> a b c) とか)。
2019/10/26 03:37:06 UTCshiro
#
コンストラクタがパターンマッチにできる言語だと綺麗なんですが、Schemeだとコンストラクタと普通の手続き呼び出しの区別がないからな… ($ <u8vector> ...) はいけそうな感じがしますね。
2019/10/26 03:48:12 UTCkaki
#
$ をコンストラクタパターンだと思えば自然な拡張になるかと思ったんですが、現状でもレコード以外のオブジェクトにスロット順でマッチなんですね。ユーザ定義でuvectorのようなクラスを作って
2019/10/26 03:50:32 UTCshiro
#
<u8vector>とかはスロット無いんでバッティングしないだろうと思ったんだけど将来的に不定長要素+スロットを持つハイブリッドな何かが出てきた時困るか
2019/10/26 03:50:49 UTCkaki
#
途中で送信してしまった。uvectorのようなクラスを作ったらuvectorとしての中身を取り出したいときととスロットで取り出したいときで衝突してしまいますね。@ パターンで回避はできますが
#
はい。
#
欲を言えばユーザ定義も可能なコンストラクタパターンみたいなものがあるとよさそうなんですが、それはちょっと大きな工事になりそうです。
2019/10/26 03:56:55 UTCshiro
#
安直に記号を増やすなら ($$ <u8vector> ...) とか… (コンストラクタではなく)クラス名を使うメリットは ($$ <sequence> ...) のようにジェネリックなマッチもできる
2019/10/26 04:06:03 UTCkaki
#
そうですね。コンストラクタと言いつつ、メソッドでexpanderを引っ張ってくるようなものを考えていました。
2019/10/28 11:40:21 UTChamayama
#
有理数と循環小数の相互変換を行うプロトタイプ的なモジュールを作ってみました。
https://github.com/Hamayama/recdec
#
これが format に入るべきなのかは、よく分からなくなりましたが。。。
(使う機会がない気もします)
2019/10/28 11:54:13 UTCshiro
#
CLフル仕様のformatにはローマ数字表記とかいつ使うんだって機能てんこもりですから入れるのはかまわないと思います。autoloadにでもしとけば。ただ
#
良く使う ~f でそれがトリガされるのはやっぱりちょっと驚きますね。