2006-01-01から1年間の記事一覧

名前の由来

Xtalというもともとの単語自体は、Crystalの略語です。なぜ言語の名前にしたのかは、次のどれか、もしくは全てです。 eXtensible Agile Languageの略 Rubyと同じように宝石の名前にしたかった アジャイル言語として産まれたから(アジャイルといえばクリスタ…

ダウンロード

Xtal version 0.9.0 VC7とgcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)でコンパイル、用意した全てのテストコードがパスするのを確認。言語仕様 クラス、モジュール、組み込み関数 C++に組み込む まだ安定性、ドキュメントが欠けていて…

Xtal version 0.9.0

以前よりそこそこ体裁を整えました。10/18 追記 メモリリークと循環参照を持つオブジェクトの解放時に落ちるバグを修正しました。

デフォルト引数、キーワード引数

Xtalはデフォルト引数、キーワード引数をサポートします。例: foo : fun(a:10, b:20){ println(a + b); } foo(); // 30 foo(50); // 70 foo(b:80); // 90 foo(b:1, a:2); // 3

once

onceとは、一度しか式を評価しないという意味の単項演算子です。2度目以降は、最初に評価された式の値を返しつづけます。 次のようなことが可能になります。 foo : fun(val){ ary : once []; ary.push_back(val); println(ary); } foo(5); // [5] foo(10); …

Class class

Xtalでは全てのオブジェクトがクラスに属すので、当然クラスもClassクラスというものに属しています。同様にモジュールもModuleクラスに属しています。そして、ClassクラスはModuleクラスを継承しています。つまり、ほぼRubyと同じモデルになっているわけで…

is, !is

Xtalでは、全てがオブジェクトで、全てが何かのクラスに属しています。あるオブジェクトがあるクラスのインスタンスかを調べるには、is演算子 を使います。 整数リテラルはIntクラスに属しているので、次の例は "true"と表示されます。 if(100 is Int){ prin…

callee

Xtalはcalleeキーワードで、現在実行中の関数を取得出来ます。そのため callee() と書くと再帰呼び出しとなります。これは無名関数で再帰を可能にするために導入されました。例: foo : fun(f){ println(f(10)); } foo(fun(i){ if(i==0) return 1; return cal…

null, nop

Xtalには、Rubyのnilとほぼ同等なnullオブジェクトが存在します。 nullはnullが持っていないメソッド等を呼び出すと、例外が発生します。そして、nullのような、しかしちょっと毛色の違う nop というオブジェクトが存在します。 nopはnopが持っていないメソ…

多値

関数は2個以上の値を返すことが出来ます。 多重変数定義か多重変数代入で複数の値を受け取ることが出来ます。 左辺の方が多い場合、足りないところはnullが代入されます。 右辺の方が多い場合、余った値は切り捨てられます。 foo : fun(){ return 5, 8; } ba…

バグの修正とテストスクリプトを黙々と書いてます。

セレクターネームスペース削除

この日は、セレクターネームスペース周りについて考えてました。 最終的な結論として、セレクターネームスペースは、Xtalの仕様から削除されることになりました。 実装してみたものの、言語仕様やC++のインターフェイスが複雑になり、実行速度が落ちる割に、…

例外

この日はすごいバグってた例外周りを修正しました。 バージョン0.9で反映されます。Xtalの例外はJavaScriptとほぼ同じような仕様となってます。例: test.xtal ファイルに記述して実行するとする foo : fun(){ // 例外の送出 throw Exception("Error!"); } tr…

ガーベジコレクション

最近の言語、特にスクリプト言語において、ガーベジコレクションを採用しないのはありえません。 当然Xtalもガーベジコレクションを持っています。Xtalは紆余曲折の結果、一番原始的なgcのアルゴリズム、参照カウントgcを採用することにしました。途中までは…

バイトコード採用

Xtalは独自のバイトコードを独自の仮想マシンが解釈して駆動します。XtalのバイトコードはJavaのバイトコードの仕様を参考にして作られました。 当初はバイト単位ではなく、マシンが一番早く計算できるword単位にしていました。何故変えたかというと、ある日…

パース

XtalはLexerやParser部分にyacc等を使用しておらず、完全に手書き再帰下降型となっています。 当初はBoost.Spiritを使用していましたが、全構文の3分の1を入れた時点でコンパイル時間がめちゃくちゃ長いわ、メモリが足りないからコンパイルオプションで指定…

ポータビリティについて

Xtalは今のところwindowsでの動作しか確認していませんが、C++標準の関数以外は使用していないため、Linuxでも動作する(はずです)。例えばfiberはその機能名から、Win32APIのFiberを使用しているのでは、と想像する人が多いかもしれませんが、使用してはいま…

末尾再帰

Xtalはある理由のため、末尾再帰、末尾関数呼び出しを必ず最適化し、その関数フレームを再利用します。 そのため次の例はスタックオーバーフローになったり、メモリを使い果たしたりすることなく、永遠に実行されます。 f : fun(i){ println(i); return f(i+…

メソッドの追加

classやmoduleの定義後にメソッドを追加することも可能です。 // Carクラスにstopメソッドを追加定義 Car::stop : method(){ this.velocity = 0; } car : Car(); car.step_on_accelerator(100); car.stop(); println(car.velocity); // 0これには注意しない…

module

Rubyのmoduleとほぼ同じモノがXtalにも存在します。 moduleはmix-inのため、または名前空間のように使うために存在します。例: JetEngine : module{ @power : 100; burst : method(){ this.step_on_accelerator(@power); @power = 0; } }ジェットエンジンモ…

classの継承

昨日のCarクラスを継承したSuperCarクラスを定義します SuperCar : class extends Car{ // アクセルを踏む関数をオーバーライドする step_on_accelerator : method(power){ // Carクラスのstep_on_acceleratorメソッドを呼び出す Car::step_on_accelerator(p…

class

Xtalはクラスベースを採用しています。 当初はプロトタイプベースを採用していましたが、プロトタイプベースであることの利点があまり思いつかないことや、 世の中のプロトタイプベースな言語、例えばJavaScriptやLuaでは、結局クラスもどきライブラリが何個…

配列、連想配列リテラル

Xtalは当然のように配列と連想配列リテラルを書くことができる。 ary : [1, 2, "foo", 5.6]; // 配列リテラル map : ["key":100, "test":"BOO"]; // 連想配列リテラル println(ary[2]); // foo println(map["test"]); BOO

fiber (軽量スレッド、コルーチン)

Xtalでは関数定義と似たような形でfiberが生成でき、関数呼び出しの形で実行が出来ます。 fib : fiber{ yield 1; yield 2; yield 3; } println(fib()); // 1 println(fib()); // 2 println(fib()); // 3また、fiberはイテレータでもあるので、ブロックの適用…

変数定義や関数定義とか

Xtalでは変数を次の形で定義します。 variable_name : 100;変数名 : 初期値; という形です。 Xtalでは fun(){} という形で関数式が書けます。 ECMAScriptの function(){} と同じです。 functionは長ったらしいのでfunを採用しました。それを変数に定義すれば…

セレクターネームスペース

Xtalはセレクターネームスペースっぽい機能を有します。セレクターネームスペースを採用している言語としては、例えばECMAScript4があります。 Xtalではセレクターネームスペースというより、識別子となんらかのオブジェクト、二つのキーでメソッドを登録す…

iterator

XtalはまるでRubyのような書式で配列の要素を順次取り出すことが出来ます。例えば次のように。 // 変数arrayを定義。初期値に配列を。 array : [10, 20, 30, 40]; array.each{ |value| println(value); }このようにぱっと見はRubyにしか見えません。しかし、…

スクリプト言語Xtalって何?

Xtalは、主にゲーム製作用途のために、C++に組み込み、連携させて使うために開発された言語です。 この言語はRuby, Python, D, Lua, NewtonScript, ECMAScript等、とても多くの言語の影響を受けて作られました。特徴 オブジェクト指向 C likeな構文 動的な型…

サンプルプログラム

0〜9までの数字を表示するXtalのプログラムは次の通り 10.times{ |i| println(i); }もうほとんどRubyですね。 これをC++風のforループで書くと次の通り。 for(i : 0; i<10; ++i){ println(i); }さっきのとまったく同じ出力をします。

C++に組み込もう

多分邪道ではあるのですが、簡単に組み込めるよう、all_src.hという、全てのcppをincludeしたヘッダが用意されてます。 これをどれか一つのcppにincludeすれば、簡単に組み込みを試すことが出来ます。 #include <iostream> #include <xtal/all_src.h> using namespace xtal; // Xtalの</xtal/all_src.h></iostream>…