#gosh> (slot-set! </> 'subtype? (^[type super] (if (or (is-a? super </>) (is-a? super <class>)) (every (cut subtype? <> super) (~ type'members)) 'super)))
#<undef>
gosh> (subtype? <char> (</> <char> <char>))
#t
gosh> (subtype? (</> <char> <char>) <char>)
#t
gosh> (subtype? (</> <integer> <real>) <number>)
#t
gosh> (subtype? (</> <integer>) <number>)
#t
#subtype? のテストケース、左辺が </> で右辺が <top> でないものがないですね。右辺が <top> の場合はショートカットしちゃいますし。
#右辺が <top> でなくて #t を期待するテスト、だ
#ども。descriptive typeの包含関係については、(subtype? (</> <integer> <char>) (</> <char> <integer>)) が#tにならない問題もあって、これを要素ごとにパスを辿って検査すると指数的に遅くなるので何らかのソートオーダーで線形化しなきゃな、ってとこで止まってました。とりあえず目につくとこから直してこうかな。
#あ、上のは#tになるのか。(</> <int> <char>)みたいな場合だ。
#えっと、(subtype? (</> <int> <char>) (</> <char> <int>)) の場合ですか?
#;; s/FALSE/SCM_FALSE/ の修正入り
gosh$ (subtype? (</> <int> <char>) (</> <char> <int>))
#f
gosh$ (subtype? <int> (</> <char> <int>))
#f
gosh$ (subtype? <char> (</> <char> <int>))
#t
#よく分かってません。
#あ、native typeがclassに置き換えられちゃってるのかな。
#あ、その問題はそれですね。
#なんでここ置き換えたんだったかな。classに置き換えたら拡大しちゃうからまずいよな。
#superがclassでsubがnative typeの場合を分ける必要があるのか
#ですかね
#直和型/ユニオン型については、ソース上でunion typeって書いてるのにドキュメントでsum typeって書いてて混乱してたみたいです。union typeに統一します。
#(or (is-a? super </>) <class>) だと常に真になっちゃってますけどなんとなく動いてますね。分岐自体必要なかった…?
#常に小さくできるからdelegate-to-superする必要はない気がします。
#あれほんとだ。
#そういえば、Cの char に対応するnative typeってFFIとかで必要にならないんですか?ABIとかはよく知らないんですが、Cの型システム上では char は signed char とも unsigned char とも異なる型(中身は処理系定義でどちらかと同じ)みたいなので。
#単純に引数や戻り値での受け渡しの場合、1 byteであることさえ合わせてあれば、Scheme側でsignedと解釈しようがunsignedと解釈しようが自由ではあるんだけど、ヘッダ読み込んで型取り出す場合とかは分けておいた方が気持ちいいかなあ。
#今あるffi (undocumentedだけど) の低レベル呼び出しルーチンではint系はどうせ6汎用レジスタかスタック渡しの時に64bitになるからcharの符号の有無は気にしてないな。ただstructとかを扱い始めたら気にせざるを得ないかな。
#ふーむ、なるほど。
#.$ の説明で、"これはR7RSの 範囲内では有効な識別子でないので" とありますが、R5RSで有効でなかったものでR7RSでは有効だと思います。まとめて置換してしまったのでしょうか。⟨peculiar identifier⟩ → . ⟨dot subsequent⟩ ⟨subsequent⟩* で、⟨dot subsequent⟩ にはinitialが書けるので。Gaucheも |.$| ではなく .$ とwriteしてくれます。
#あ、多分R5RSからそのままアップデートしたんだと思います。Mahalo.
#(ineq x <= y < z) の話なんですが、英語で書くのが難しいのとまとまってないのでここに書いちゃいます。典型的な不等式以外にも使えそうな気がして、最初はandでchainすることや間のオペランドが折り重なることに注目して命名した方がいいかと思ったんですが、そうすると一般的になりすぎたり(chainとか)長くなったり(and-chainとか)するんですよね。簡易記法のためのマクロなんだから、説明的すぎるより短い名前がいいでしょうし。かといって、&とか&&とかだと短すぎたり記号的すぎたりする気もしますし、記号でこれ以上複雑にすると暗号的になりそうですし、and*とするにはandと違いすぎますし、自信を持って推せる名前は思い付きませんでした。
#典型的な不等式っぽい手続き以外でineqで使えそうな手続きはいくつか思い付いていて、member、alist-ref辺りはまだましなんですが、hash-table-delete!みたいな副作用があって成否を返すやつを使い出すと変な感じがします。まあ、これはそう使う人が変っていう話かもしれませんが。
#関連する話題として、(complement =) もしくは complement の略記が欲しくなりそうですね。(ineq a < x (complement =) y < b) くらいは普通にありそうなので。(.$ not =) の方が短いなんて。
#(complement =) に略記を与えちゃうと string=? 他はどうするんだとなっちゃいますが。
#(ineq a < x (complement =) y < b) これ、(< x b) じゃないし普通じゃないか。
#そう、最初は一種のchainingだから(Pythonでもchain of comparisonって言ってるし)、一般化するならそれに類する名前がいいかなと思ってたんだけどchainはsrfi-197で取られてるし、長くなったら意味ないし。
#記号では、不等式なので >< とか (<> だとcutとかぶる)、数学で二項関係を一般化するときよく ~ を使うから ~* とか考えたんだけど、試してみたらいまいちだった。
#andでchainするので記号を使うんだったら&を軸にするかなと思いました。&*とか。…&~とか?うーん。使用頻度的に記号2文字を割り当てるほどでもない気もするんですよね。ineqは長さや衝突しなさ的には丁度よさそうな感じがします。