2007-10-01から1ヶ月間の記事一覧

二重キー

全然ネームスペースっぽくないので、メンバネームスペースという呼び方はやめて、二重キーと呼ぶことにします。 クラスメンバは、識別子(一次キー)と任意のオブジェクト(二次キー)で、二重のキー付けが出来ます。 二つ目のキーは、===演算子(同一のオブジェ…

ClassicIterator

GoFのデザパタに出てくるような、古典的イテレータメソッドを持つクラスを追加することにしました。 イテレータに対し、classicメソッドを呼び出すと元のイテレータがClassicIteratorに包まれて取得できます。 iter: 3.times.classic; for(; !iter.is_done; …

in演算子 !in演算子

範囲演算子を追加したので、あわせてin演算子を導入することにしました。 x in range というin演算子は、x.op_in#(range.class)(range) というメソッド呼び出しと等しくなります。 x !in range は !(x.op_in#(range.class)(range)) と等しいです。 (5 in 0..…

範囲演算子

範囲式は範囲演算子にします。 a .. b という範囲演算子は、a.op_range#(b.class)(b, kind) というメソッド呼び出しと等しくなります。 Intに対し引数の型Intで範囲演算子を実行すると、IntRangeクラスのインスタンスが返ります。右の端点を含まない範囲演算…

範囲式を追加する

範囲式を追加することにしました。 a..b で終端を含むaからbの範囲式 a...b または a.. 範囲式で得られるオブジェクトは、Rangeクラスのインスタンスです。 RangeクラスはEnumeratorを継承しており、ブロック文を適用できたり、to_aやmap、with_indexなど、E…

数値リテラル

XtalはRubyに倣い、2進数表記を持ち、アンダーバーで数字を区切ることが出来ます。 0b1111_1111.p; //=> 255 0B_1_0000_0000.p; //=> 256 また、数値リテラルサフィックスとして、F、K、G、M、を付けることが出来ます。 Fは浮動小数点数を表します。 Kは1024…

[ボツになった構文] generator関数式

Pythonは、普通の関数の中でyieldを書くと自動的にgenerator関数となります。 Xtalはfiberを返す関数として定義する必要があるため、冗長だと思い、「generator関数式」というものの導入を考えた時期がありました。 Int::my_times: method{ return fiber{ fo…

メンバネームスペースの応用

ActionScript3では、名前空間の機能をpublic、privateなどの可触性に応用していました。Xtalでは可触性には応用しないのですが、「2項演算子」に応用します。 2項演算子は困り者 静的な型を持たない言語にとって、+や*などの2項演算子は困り者です。 a + b…

メンバネームスペース

導入することにしました。 導入理由 Xtalは、既存のクラスにメソッドなどを追加することが出来ます。 Iterator::x2: method fiber{ this{ yield it*2; } } // 次のように使える 10.times.x2{ it.p; } このように、Iteratorクラスに「要素を2倍にしてそれを…

block_catch

ブロック文の中で例外が発生したとき、その例外を握りつぶすことも可能となるような機構がなかったので追加することにしました。 bruke: class{ block_first: method{ return this; } block_next: block_first; block_catch: method(e){ // 引数としてスロー…

引数の型チェック

foo: fun(stack is StackInterface){ } foo(5); //=> ArgumentError と、書ける機能。書けるのはisだけではなく foo: fun(n > 0){ } foo(100); //=> ok foo(-10); //=> ArgumentError とか書けるというのはどうでしょう。デフォルト値は次のように書きます。…

interface

// スタックはpushとpopを持つ StackInterface: interface{ push; pop; } // 簡単のため、配列を継承してスタックを作る MyStack: class(Array){ push: Array::push_back; pop: Array::pop_back; } hoge: MyStack(); // is演算子で、interfaceと同じメンバを…

新機能を考える

考えている新機能のカテゴリです。コレはダメだろうとか、こうしたほうがとか、ご意見を募集です。