[技術講座]
pnutsコマンドで対話型のシェルを立ち上げる。HelloWorldを表示するためには、単純にprintln("HelloWorld")と打ちこんでEnterすればよい。
E:\kanno\oed\pnuts\pnuts_1\pnuts_1>pnuts Copyright (c) 1997-2000 Sun Microsystems, Inc. All rights reserved. Pnuts version 1.0rc1, 1.3.0_02 (Sun Microsystems Inc.) > println("HelloWorld"); HelloWorld null >
Pnutsでコードを記述する際には、Javaと違ってクラスの定義等をする必要はない。したがってJavaのようにstaticなメソッドmain()の記述も必要ない。ユーザはやりたいことを、すぐに直接記述することができる。
一応ワンライナーの機能もある。ただしPnutsの起動時にはJava自体の起動も必要なので遅い。。さくっとは使えない。ワンライナー用としては使いにくい。
回避策として個人用Pnutsサーバというものが提供されている。ただし今回は説明を省く。
E:\kanno>pnuts -e print(\"HelloWorld\"); HelloWorld
それでは基本的な使い方から学習していこう。
全部対話型のシェルで操作してもよいが、間違えたりしたとき面倒だったりするので、このセクションではスクリプトはファイルに保存して実行することにする。
pnutsではスクリプトは*.pnutという名前で保存することが多い。たとえばhello.pnutに以下のように記述しておいて、それをクラスパスの通ったディレクトリに置いておく。
// はコメントとして使える // /* */ もいける println("HelloWorldだっつの")
ここでPnusのシェル上からload("スクリプトのファイル名")を実行することによってスクリプトが読み込まれ実行される。また拡張子が.pnutの時は拡張子を省略してもよい
E:\kanno\oed\pnuts\pnuts_1>pnuts Copyright (c) 1997-2000 Sun Microsystems, Inc. All rights reserved. Pnuts version 1.0rc1, 1.3.0_02 (Sun Microsystems Inc.) > load("hello") HelloWorldだっつの null >
Pnutsの文法は、Javaにくらべて非常に簡単。JavaよりもJavaSctiptに近い(互換性はない)
制御構文などの基本的な部分はJavaとかJavaSctiptと大体一緒なので覚えやすい。代表的なものを紹介する。きちんと調べたくなってきたら公式ページでドキュメントをダウンロードしよう。
ここでは上記ホームページにのっていた例題をいくつか紹介する。
foo = [1, 2, 3] if (foo.length > 5){ 1 } else if (foo.length > 4){ 2 } else { 3 } //答えは ==> 3 //ifにはこんな書き方もある(if文自体が結果として値を返す) value = if (foo.length > 3) 1 else 2 //value ==> 2
//while文 sum=10 while (sum > 0){ sum = sum - 1 println(sum) } //for文 for (i=0 ; i<10 ; i++){ println(i) }
sum = 0 foreach i [1, 2, 3] { sum = sum + i } //sum ==> 6 sum = 0 vec =class java.util.Vector() //オブジェクトの生成をあらわす構文。次のセクションで解説 vec.addElement(1) vec.addElement(2) vec.addElement(3) foreach i (vec.iterator()) { sum = sum + i } println(sum) //sum ==> 6
Pnutsではクラスの定義ができない。Pnutsの考え方というか態度としては、「クラスが必要ならJavaで定義すべし」ということになる。
そのかわりPnutsでは関数を定義することができる。Pnutsにおける関数は、「ファーストクラス」のオブジェクトであり関数自体をオブジェクトのように取り扱うことができる。関数の引数に関数を渡してあげたり、関数の戻り値として関数を返すことができる。
//関数の定義 function add( a ,b) { return a+b; // return文を省いてもよい。最後に評価された値が返される } //関数の呼び出し sum = add( 10 ,40) println(sum) // ->50
以下はPnutsの関数がファーストクラスのオブジェクトであることを利用して、Ruby風イテレータを実現した例である。
//Ruby or Smalltalk風イテレータ function each_do(array , func ) { foreach item (array) { func(item) } } //引数に受けわたすための関数の準備 function printer(item) { println(item) } //呼び出し list = [10, "いろいろ" , 45 , 123 ] each_do(list,printer) //実行!! //匿名の関数もつかえる each_do(list, function(item){ println(item)})
この例でわかるように、関数の引数として関数を渡すことによって柔軟な処理を実現できる。
© 2001 OGIS-RI Co., Ltd. |
|