ObectSquare

[技術講座]


Powered by SmartDoc

定番のアレと基本

HelloWorld

pnutsコマンドで対話型のシェルを立ち上げる。HelloWorldを表示するためには、単純にprintln("HelloWorld")と打ちこんでEnterすればよい。

HelloWorld
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サーバというものが提供されている。ただし今回は説明を省く。

ワンライナーの例 Windows版
E:\kanno>pnuts -e print(\"HelloWorld\");
HelloWorld

基本的な文法

それでは基本的な使い方から学習していこう。

下準備

全部対話型のシェルで操作してもよいが、間違えたりしたとき面倒だったりするので、このセクションではスクリプトはファイルに保存して実行することにする。

pnutsではスクリプトは*.pnutという名前で保存することが多い。たとえばhello.pnutに以下のように記述しておいて、それをクラスパスの通ったディレクトリに置いておく。

hello.pnut
// はコメントとして使える
// /* */ もいける
println("HelloWorldだっつの")

ここでPnusのシェル上からload("スクリプトのファイル名")を実行することによってスクリプトが読み込まれ実行される。また拡張子が.pnutの時は拡張子を省略してもよい

loadの例 Windows版
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と大体一緒なので覚えやすい。代表的なものを紹介する。きちんと調べたくなってきたら公式ページでドキュメントをダウンロードしよう。

ここでは上記ホームページにのっていた例題をいくつか紹介する。

if文の例
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.
Prev. Index Next
Prev. Index Next