next up previous contents
Next: このドキュメントについて ... Up: プログラム言語Cmm version4.0 Previous: 15.7 コメント

  
16. 初期実行Cmmコード

Cmm処理系で初期に実行すべきCmmコードは、下記のようになります。これによっ て定義済みクラス、変数の初期化を行います。

まず、CmmではObjectクラスを定義します。このクラスには、スーパー クラスが存在しません。他のクラスはデフォルトで、このObjectクラス をスーパークラスとします。

そのために、このObjectクラスを処理系に定義するには、そのスーパー クラスの処理については、特殊な処理をしなくてはなりません。


class Object {

method IsInstanceOf ;
method IsArray () void ;
method IsInteger () void ;
method IsReal () void ;
method IsNumber () void ;
method IsString () void ;
method IsVoid () void ;
method IsInstance() void ;
method IsClass () void ;
}

なお、メソッド、IsInstanceOfは、組み込みメソッドとして、Cmm処理系の内 部コードで実現されます。

それ以外の定義は下記の通りです。


var __loadedModules = [] ;


// Class クラス - インスタンスを生成するクラスのルート
class Class : Object {
method IsClass () is_class(this) ;
method IsInstance () is_instance(this) ;
}

// 例外クラス
class Exception : Class {
public message ;
method New (mes) {
if ($# == 1)
message = "Exception" ;
else
message = mes ;
}
}

// SystemException クラス - 処理系が投げる例外の基底クラス
class SystemException : Exception {
public pos ;
method New (mes) : (mes) ;
}

// 配列アクセスエラーの時に投げられる
class ArrayOutOfBoundsException : SystemException {
method New (mes) : (mes) ;
}

// 0割算時に投げられる
class DivisionByZeroException : SystemException {
method New (mes) : (mes) ;
}

// データ型が合わないときに投げられる
class TypeMismatchException : SystemException {
method New (mes) : (mes) ;
}

// 引数の数が合わないときに投げられる
class ArgNumberException : SystemException {
method New (mes) : (mes) ;
}

// バイナリパッケージのロードに失敗したときに投げられる
class PackageLoadException : SystemException {
method New (mes) : (mes) ;
}

// ファイルのロードに失敗したときに投げられる
class FileLoadException : SystemException {
method New (mes) : (mes) ;
}

// カプセルクラスの定義
// Void クラス
class Void : Object {
method IsVoid () 1 ;
}

// String クラス - 文字列のカプセルクラス
class String : Object {
method Length () length(this);
method Concat (s) { this + s ; };
method Format (wid, align) {
var len = ->Length() ;
if (len >= wid || $# == 2)
return this ;
var s = this ;
var i ;
var rest = wid - len ;
if (align == `left) {
return s + " " * rest ;
}else if (align == `right) {
return " " * rest + s ;
}else if (align == `center) {
var lrest = rest/2 ;
var rrest = rest - lrest ;
return " " * lrest + s + " " * rrest ;
}
return s ;
} ;
method SubStr (from, len)
{
var s ;
if ($# == 2)
var len = this->Length () - from ;
s = substr (this, from, len) ;
if (!s)
return "" ;
s ;
}
method ToInteger () to_int (this) ;
method ToReal () to_real (this) ;
method IsString () 1 ;
}

// Arrayクラス - 配列
class Array : Object {
method Length () length(this) ;
method Index (n) this[n] ;
//配列生成メソッド
method Create (n1, n2) {
if ($# == 1) {
mkarray(0) ;
} else if ($# == 2) {
if (n1 < 0) return mkarray(0) ;
return mkarray(n1) ;
} else {
if (n1 < 0) n1 = 0 ;
if (n2 < n1) n2 = n1 ;
return mkarray(n1, n2) ;
}
}
method IsArray () 1 ;
}

// Integerクラス
class Integer : Object {
method IsInteger () 1 ;
method IsNumber () 1 ;
method Format (width, align, base)
{
if ($# == 2) {{
var align = `right ;
var base = 10 ;
}} else if ($# == 3) {{
var base = 10 ;
}} else if (base->IsString()) {
base = if (base == `binary) 2
else if (base == `octal) 8
else if (base == `decimal) 10
else if (base == `hexadecimal) 16
else 10 ;
}
if (base == 10) {
ToString()->Format (width, align) ;
} else if (base == 16) {
var xnum = "0123456789ABCDEF" ;
var n = this ;
var s = "" ;
for ( ; n > 0; n /= base)
s = xnum->SubStr (n % base, 1) + s ;
s->Format (width, align) ;
} else if (1 < base < 10) {
var s = "" ;
var n = this ;
for ( ; n > 0 ; n /= base) {
s = (n % base)->ToString() + s ;
}
s->Format (width, align) ;
}
}
method ToString () to_string (this) ;
method ToReal () to_real (this) ;
}

// Realクラス - 実数
class Real : Object {
method IsReal () 1 ;
method IsNumber () 1 ;
method Format (width, prec, align)
{
var intpart, realpart ;
if ($# == 3)
var align = `right ;
intpart = ->ToInteger() ;
if (prec == 0)
return intpart->ToString()->Format (width, align) ;
realpart = ((this - intpart)->ToString() + "0" * width)->SubStr(0, prec + 2) ;
realpart = realpart->SubStr (2) ;
(intpart->ToString() + "." + realpart)->Format (width, align) ;
}
method ToString () to_string(this);
method ToInteger() to_int(this);
}

// 定義済み例外インスタンス
var arrayOutOfBoundsException
= ArrayOutOfBoundsException->New ("Array index out of bounds") ;
var divisionByZeroException
= DivisionByZeroException->New ("Division by 0") ;
var typeMismatchException
= TypeMismatchException->New ("Type mismatch") ;
var argNumberException
= ArgNumberException->New('Invalit Number of Arguments');
var fileLoadException
= FileLoadException->New ('cannot load file') ;
var packageLoadException
= PackageLoadException->New ('cannot load package') ;


next up previous contents
Next: このドキュメントについて ... Up: プログラム言語Cmm version4.0 Previous: 15.7 コメント
Tetsuo Ono
1998-11-05