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

[内部実装について] C++の例外をoffにしても大丈夫なように

これまでも一応C++の例外をoffに出来ていたのですが、とても制限が多いものでした。 例えば、protectedの関数を外部から呼んだ場合やC++の関数に渡すべきオブジェクトの型を間違えていた場合、復活できずにexit(1)で強制終了させていました。 それの制限をな…

関数式の違い

関数は fun(arg) expr という形式と、|arg| expr という形式で作ることが出来ます。 これらは記法の違い以外に、動作の違いもあります。 arg expr で作った関数は、呼び出しの際、多重代入と同じルールで引数が渡されます。 foo: fun{ return 1, 2, 3; } boo…

多値 再考

これまで、Xtalにおいて多値と配列は同じものである、と定義して、配列と多値が区別できない仕様にしていたのですが、ちょっと実装が難しい事例があったので、この仕様を見直すことにしました。 新しい仕様は次の通りです。 配列か多値かを区別できるように…

擬似if文の罠

この擬似if文は一つ罠があります。 この擬似if文の内部でbreakやcontinueを呼び出すと、ブロック文はあくまでループ文の一種なので、その擬似if文に対してbreakしたりcontinueしてしまうことになってしまうのです。 break、continueする際は、なるべくラベル…

ユーザー定義のif文

Xtalはブロックを使うことで、if文とほとんど同じ機能を書くことが出来ます。 If: class{ _cond; initialize: method(cond){ _cond = cond; } block_first: method{ return _cond ? this : null; } block_next: method{ return null; } } If(n < 20){ "true"…

export文廃止

svn上のソースではかなり前からなくなっているのですが、exportは廃止して、これからは代わりにreturn文を使うようにすることにしました。 トップレベル(関数の中じゃないところ)からreturnすると、その結果を返せます。 // Animal.xtal Animal: class{ } re…

可触性について

以前可触性はC++と同じ、ということを書きましたが、そう実装できていなかったし、Xtalの仕様的にC++と同じにするのは無理でした。なので、若干意味を変えます。 publicメンバはアクセス制限なし。 privateメンバは、レキシカルスコープで見える場所からしか…

format

XtalでC言語のsprintfのような文字列の組み立てがしたい場合、フォーマット文字列生成式を使います。フォーマット文字列は、%f"書式指定文字列"で生成します。 fmt: %f" %s = %d "; fmt2: %f! %d %d !; // %fの後は任意の記号が使える。 (や[を使った場合、)…

配列化演算子、連想配列化演算子

PseudoArrayをなくしたので、mapメソッドなどは依然としてイテレータを返す仕様に戻りました。イテレータを配列化する機会が多くなるということになります。 多く使う割りに、 .to_a は少々打ちづらい気がします。そこで配列化演算子を導入することにしまし…

PseudoArrayを削除した

まつもとさんにも言及されたPseudoArray *1なのですが、悩んだ結果、なかったことにすることにしました。 止めた理由は次の通りです。 ary: "a".."z".each.with_index; ary.map(|index, value| value ~ index.to_s).p; このary.mapの呼び出しですが、mapはイ…