特徴


minilang のユーザ向けの機能について。

Rubyとの互換性

実装済み

この辺りは, だいたい互換にできたように思います。

  • ... end で終わる構文
  • 変数に型はない
  • 演算子の優先順位は変更できない.
  • クラスベースのオブジェクト指向機能
  • 多重継承のサブセットとしての特異クラス, モジュールによるmix-in. (内部では普通に多重継承です。)
  • メソッド/演算子オーバーライド.
  • メソッドのオーバーロードはできない
  • 例外機構
  • λ (ラムダ) 式とクロージャ
  • ローカル変数とメソッドの名前空間は別. (Common Lisp的)

不足している機能

Ruby にあって, minilang v0.7で不足している機能のうち主なものは,

  • ヒアドキュメント
  • =begin ... =end コメント
  • %表記
  • ほとんどすべてのライブラリ

v0.7は, まったく実用品のレベルには達していません。

開発に協力してくれる方が必要です! 開発に参加 を見てください。

ない機能

何から何まで Ruby と同じにするわけではありません。意図して実装していないものもあります。

大域 (グローバル) 変数, クラス変数

定数を使えば同じようなことができます。

継続 (continuation)

継続がない, というよりは, call-with-current-continuation (call/cc) がダメ。

実装Note - 継続の除去

セーフモード

内と外との境界線が, 昔のCGIスクリプトを書いていた頃ははよかったのですが, フレームワークやDBMSを駆使する現在の使い方にマッチしていないように思います。

証明書を要求する方式が妥当なように思います。

instance_eval/class_eval

selfを差し替える, というのは, 容易にプログラミングを誤らせやすいと思います。

国際化

ruby 1.9 は CSI (Character Set Independence) と主張していますが, とてもその水準ではありません。

2013年の今, たとえ本物の CSI であっても, あまりいい考えとはいえません。

文字列はUnicodeの並び

実装Note - 国際化

CSI (Character Set Independence) では, ボランティアベースで実用的な多言語の文字列を作ることはできません。CSI は理想に見えますが, それはただの青い鳥です。

ざっと考えただけでも,

  • ある文字集合から別の文字集合への変換はどうするのか. CSIを徹底するには多対多になるが, 組み合わせ爆発する
  • 複数の文字集合が混在したとき, 文字の同定はどうするのか。
  • Collation (照合順序) はどうするのか. 文字集合が違う場合は何らかのマッピングを行うのか
  • どこでline breakするのか
  • 正規化はどうするのか

などなどを, *すべての*文字集合に対して考えなければなりません。

不可能ではないでしょうが, それは商用プロダクトでしかできない / 商用プロダクトでも難しい領域です。

時刻とタイムゾーン

見掛けの時刻と真の時刻を区別する必要があります。例えば 2月1日9:00 JSTは 2月1日 0:00 GMTと同じ時刻です。

見掛けの時刻を扱うのか, 真の時刻を扱うのか, APIを整理する必要があります。

カレンダー

グレゴリオ歴ではない暦を扱えるように。

ネイティブスレッド

Giant lock はありません。開発者 (minilang のユーザ) がスレッドの同期をしなければなりません。

minilang v0.7 では, まだまだ実用には達していません。

その他

[] や {} も偽

細かいですが, Container のサブクラスで, empty? が真の場合は, 偽です。Common LispとSchemeのちょっとだけ細かい違い

ただし, "" と 0 は真のまま (今さら変えれない.)

変数に型がある

まだ計画段階.

実装Note - 契約プログラミング を見てください。

初期化していないインスタンス変数はエラー

初期化していないインスタンス変数は nil ではなくエラーになります。initialize内でインスタンス変数を初期化し, 原則として super を呼び出してください。

定数への再代入もエラーになります。