
[技術講座]
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.) > |
もっといろいろな設定が必要になってきた場合はWindowsユーザならpnuts.bat、UNIXユーザならpnuts.bashもしくはpnuts.kshをカスタマイズするか自分用の起動スクリプトを作成する。
この対話型のシェル上でPnutsスクリプトを打ち込んで直接結果を取得することができる。この対話型シェルを終了する際にはexit()と入力する。
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 |
// はコメントとして使える
// /* */ もいける
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
>
|
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
|
//関数の定義
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)})
|
この例でわかるように、関数の引数として関数を渡すことによって柔軟な処理を実現できる。
C:\home\kanno\oed\pnuts_1>pnuts Copyright (c) 1997-2000 Sun Microsystems, Inc. All rights reserved. Pnuts version 1.0rc1, 1.3.0_02 (Sun Microsystems Inc.) > aFrame= class java.awt.Frame() java.awt.Frame[frame2,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=] > >//もしくはこのように書いてもよい //Classオブジェクトを取得して変数Frameに代入してから、それを関数のように呼び出している > > Frame = class java.awt.Frame java.awt.Frame class > aFrame = Frame() java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=] > |
>import("java.awt.*")
null
> aFrame=Frame()
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=]
>
|
>import("java.awt.*")
null
> aFrame=Frame()
java.awt.Frame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,resizable,title=]
> aFrame.show() //Windowが表示される
null
> aFrame.setSize(300,200) //Windowのサイズが変更される
null
> aFrame.dispose() //Windowが消去される
null
>
|
>Math::sqrt(3) 1.7320508075688772 > Math::random() 0.5332636966391512 > |
>Point = class java.awt.Point java.awt.Point class > pt = Point(10, 20) java.awt.Point[x=10,y=20] > pt.x //参照 10 > pt.x=5 //代入 5 >//staicなフィールドの場合 > blue = class java.awt.Color::blue java.awt.Color[r=0,g=0,b=255] > |
import("java.io.*");
import("java.net.*");
EOF=-1;
/**cat (inputSteram , outputSteram)で
inputの内容をoutputに書き込む
同じことはPnutsで用意されている関数read(in,out)でもできる
*/
function cat(in , out) {
bout= BufferedOutputStream(out);
while( (c = in.read()) != EOF ) {
bout.write(c);
}
bout.flush();
}
/**
urlStrの内容はhttps://からはじめてください。
download(urlStr, fileName)
*/
function download(urlStr, fileName){
//proxyを使うとき
//urlObj=URL("http" , "your.proxy.server.name", 8080 ,urlStr);
urlObj=URL(urlStr); //java.net.URLの作成
println(urlObj);
in = urlObj.openStream();
out = FileOutputStream(File(fileName));
cat(in, out); //inの内容をoutに書き込む
out.close();
in.close();
}
|
>load("downloader.pnut")
function download(urlStr,fileName)
> download("https://www.ogis-ri.co.jp","sample.html")
https://www.ogis-ri.co.jp
null
>
//ここでsample.htmlというファイルにURLで示したHTMLがセーブされる
|
System::setProperty)
URL() , FileOutputStream())
import java.io.*;
import java.net.*;
public class Downloader {
public static final int EOF=-1;
/**
cat (inputSteram , outputSteram)でinputの内容をoutputに書き込む
*/
public void cat(InputStream in , OutputStream out) throws IOException {
BufferedOutputStream bout= new BufferedOutputStream(out);
int c;
while( (c = in.read()) != EOF ) {
bout.write(c);
}
bout.flush();
}
/**
urlStrの内容はhttps://からはじめてください。
download(urlStr, fileName)
*/
public void download(String urlStr, String fileName){
try {
URL urlObj=new URL(urlStr);
InputStream in = urlObj.openStream();
OutputStream out =new FileOutputStream(new File(fileName));
cat(in, out);
out.close();
in.close();
} catch (Exception e ) { //楽してます。ごめんなさい
e.printStackTrace();
}
}
public static void main(String[] args) {
if(args.length==2){
Downloader d = new Downloader();
d.download(args[0],args[1]);
}
}
}
|
かなり適当に書いているがちょっと面倒。そもそもこの程度の作業を行うのにわざわざクラスを定義する必要性がないような気がする。
use(モジュール名)宣言することによって使用できるようになっている。
Python入門の巻末に記述されているものからアイディアを頂いている。この図は、開発の時間が経つにともなってスライダーが右から左へ、もしくは左から右へスライドしていくイメージで描かれている。
この図によると開発のタイプは2種類である。
| © 2001 OGIS-RI Co., Ltd. |
|