まずはインタプリタを起動します。
ソースを make すると toysh という実行ファイルができます。
csh(162)> toysh
hello world はこう書きます。
> println "Hello world!"
Hello world!
result[NIL]=> nil
ローカル変数への値の設定は set を使います。
> set a 100
result[INTEGER]=> 100
a という変数に、整数の 100 を設定しました。
これを参照するには、シンボル(a のこと) に '$' をつけて参照します。
シェルのようですね。
> println $a
100
result[NIL]=> nil
変数 a の内容を b という新しい変数に設定してみます。
> set b $a
result[INTEGER]=> 100
> println $b
100
result[NIL]=> nil
関数を作ってみます。
> set foo [fun (a) {println $a}]
result[FUNC]=> (a) {println $a;}
ここでは、名前なしの関数を作って、変数 foo に設定しました。
fun は関数を作る関数、(a) は引数リスト、その後の '{' と '}' で囲まれた部分が実行の本体です。
では、呼び出してみます。
> $foo "Hello world!"
Hello world!
result[NIL]=> nil
関数の本体は、変数 foo に格納されていますので、$foo として参照し、引数を与えて実行します。
もちろん、名前つきの関数も定義できます。
defun という関数で定義します。
> defun foo (a) {println $a}
result[FUNC]=> (a) {println $a;}
> foo "Hello world!"
Hello world!
result[NIL]=> nil
関数の中から戻り値を返すには return を使います。
> defun foo (a) {return $a}
result[FUNC]=> (a) {return $a;}
> foo "Hello world"
result[STRING]=> Hello world
> println [foo "Hello world"]
Hello world
result[NIL]=> nil
'[’ と ']' に囲まれた部分は、その行が実行される前に評価され、引数として渡されます。
上の例だと、println の引数である [foo "Hello world"] の部分ですね。
tcl を知っている人は似ていると思いますよね。
次に、オブジェクトを生成してみます。
> set x [new]
result[OBJECT]=> (object)Object
new という関数がオブジェクトを生成します。
この場合、デフォルトで Object というオブジェクトにデレゲートするオブジェクトが生成されます。
その後、x という変数にオブジェクトを設定しました。
今作ったオブジェクト(x に設定されている) のメンバを見てみます。
vars というメソッドを実行してみます。
> $x vars
result[LIST]=> ((@name Object))
@name というメンバしかいません。
では、Object オブジェクトのメンバを見てみます。
> Object vars
result[LIST]=> (set! delegate? method vars type? @name var? eq)
いくつかのメンバがいますね。
そのなかには、method というのもいますね。これでメソッドを定義できます。
> $x method foo (args: a) {$a each var: i do: {print $i " "}; println}
result[FUNC]=> (args: a) {$a each var: i do: {print $i ;};println;}
x に設定されているオブジェクトに対して、foo というメソッドを定義しました。
foo の引数は args: a となっています。これは、可変長引数を a で受け取るという意味です。
実行してみますと、
> $x foo "Hello" "world" "!"
Hello world !
result[NIL]=> nil
foo の処理内容は、args: a で受けた引数のリストを、List オブジェクトの each メソッドで順番に表示するというものです。
今度はクラスを定義してみます。
> class myclass
result[OBJECT]=> (object)Object
class という関数を使います。
これで、名前つき(この場合は myclass)のクラスができました。
実は、クラスというのは便宜上の呼び方で、名前をつけたオブジェクトをクラスと呼んでいるに過ぎません。
クラスからオブジェクトを生成します。
> set x [new myclass]
result[OBJECT]=> (object)myclass
new に先ほど作ったクラス名を指定するだけです。
こうすると、新しく作ったオブジェクトのデレゲート先が myclass になるということです。
myclass にメソッドを定義します。
これは、さっき $x にメソッドを定義したのと同じです。
> myclass method foo (args: a) {$a each var: i do: {print $i " "}; println}
result[FUNC]=> (args: a) {$a each var: i do: {print $i ;};println;}
で、myclass にデレゲートするオブジェクト x に対して、今作ったメソッドを適用してみます。
> $x foo "Hello" "world" "!"
Hello world !
result[NIL]=> nil
呼べました。
Hash や Array の使い方は以下のとおりです。
> set h [new Hash]
> $h set key "value"
> $h get key
result[STRING]=> "value"
インスタンスの内容にアクセスするための簡易な方法があります。
> [$h get key]
と、
> $h,key
というのは等価な操作となります。
つまり、
set h [new Hash];
$h set key "abc";
println [$h get key];
は、
set h [new Hash];
$h set key "abc";
println $h,key;
と書ける。
(この頁書きかけ)
最終更新:2008年08月16日 14:20