「toyの紹介」の編集履歴(バックアップ)一覧はこちら
toyの紹介 - (2008/07/26 (土) 22:27:40) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
まずはインタプリタを起動します。
ソースを 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}]
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}
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! . <NATIVE>) (delegate? . <NATIVE>) (method . <NATIVE>) (vars . <NATIVE>) (type? . <NATIVE>) (@name . Object) (var? . <NATIVE>) (eq . <NATIVE>))
いくつかのメンバがいますね。
そのなかには、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
呼べました。
まずはインタプリタを起動します。
ソースを 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}]
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}
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! . <NATIVE>) (delegate? . <NATIVE>) (method . <NATIVE>) (vars . <NATIVE>) (type? . <NATIVE>) (@name . Object) (var? . <NATIVE>) (eq . <NATIVE>))
いくつかのメンバがいますね。
そのなかには、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
呼べました。
(この頁書きかけ)