Next: 13 課題
Up: ソフトウェア特論 講義資料 JavaによるScheme言語処理系: Jscheme
Previous: 11 JavaMethodクラス
P. Norvigが作ったJschemeを拡張して
Javaのライブラリなどを自由に利用できるように
なっているJschemeが,
http://jscheme.sourceforge.net/
で,公開されています.ダウンロードは,
http://sourceforge.net/projects/jscheme
から行えます.Jschemeになる以前のSILKにおける
開発ヒストリは次のようになっていました.
History of Silk
02/00 SILK4.x
A new release with an improved core Silk interpreter,
a much nicer Java interface, and a compiler.
07/99 SILK3.x
Ken Anderson's extension of SILK/JLIB2 to include
generic functions.
10/98 SILK2.x
Tim Hickey's extension of SILK to include an
applet-building library JLIB.
04/98 SILK1.x
Peter Norvig's original Scheme interpreter
implemented in Java.
11/97 Jscheme Tim Hickey's interpreter for writing
applets using a small subset of Scheme.
Jschemeは,すべてのJavaコンストラクタ,メソッド,フィールドなどに単純なイ
ンタフェースをもっています.ただし,Javaのクラスを新たに生成することは
できません.インタプリタとして,アプレットまたはアプリケーションとして
走り,コンパイラは,File.silkをFile.javaへ変換します.
SilkのインタプリタはPureJava1.1で記述されています.
SilkのコンパイラはPure Silk 4で記述されています.
Silkのプログラムは小さなJavaプログラムにコンパイルされます.
Silkはappletに対するスクリプト言語として使うことができます.
いくつかの便利なJavaツールがデモディレクトリにあり,
PC/Linux上のNetscape 4.7+ または,MacのIE 4.*上で走るように
なっています.
Javaで書くと以下のようになるプログラムは,
/* Java example */
import java.awt.*;
import java.awt.event.*;
public class Demo {
static public void main(String[] args) {
final Frame win = new Frame("Hello");
Button b = new Button("Goodbye");
win.add(new Label("Hello"),
BorderLayout.NORTH);
Label p = new Label(
"sin(PI) = "+
Math.sin(Math.PI));
win.add(b);
win.add(p,BorderLayout.SOUTH);
b.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
win.hide();}});
win.pack(); win.show();
System.out.println("Done");}}
次のように記述する形になっています.
;; Silk example
(import "java.awt.*")
(import "java.awt.event.*")
(define win (Frame. "Hello"))
(define b (Button. "Goodbye"))
(.add win (Label. "Hello")
BorderLayout.NORTH$)
(define p
(Label.
(string-append
"sin(PI) = "
(.toString (Math.sin Math.PI$)))))
(.add win b)
(.add win p BorderLayout.SOUTH$)
(.addActionListener
b
(Listener.
(lambda (e)
(.hide win))))
(.pack win)
(.show win)
(.println System.out$ "Done")
表示されるウィンドウは,
となっています.
Javaのクラスライブラリを利用できるように
するためのいくつかのルールを決めています.
Javaのコンストラクタは,コンストラクタ名の最後に ``.''をつけています.
(Font. NAME STYLE SIZE)
インスタンスメソッドはメソッド名の前に``.''をつけています.
(.setFont COMP FONT)
スタティックフィールドは名前の最後に``$''をつけています.
インスタンスのフィールド名は最初に``.''をつけ,最後に``$''をつけていま
す.
Javaクラスは,.classをつけています.(Font.class)
スタティックメンバは,``.''を中にいれています.(Math.round Math.PI$)
環境変数CLASSPATHに,jscheme.jarをいれておくと,直接jscheme.Schemeを実行する
ことができるようになります.そうすると,コンパイラも呼び出すことができ,
るようになります.
% printenv CLASSPATH
.;/java/jdk1.4;/java/jdk1.4/lib;/java/jdk1.4/jre;
/java/jdk1.4/src;
/home/inaba/lecture/jscheme5/jscheme/lib/jscheme.jar
% java jsint.Scheme
Jscheme 5.0 (04/05/2002)
> (exit)
#t
% cat HelloWorld.silk
(let
((W (java.awt.Frame.
"HelloWorld Demo"))
(L (java.awt.Label.
"H E L L O W O R L D !"))
(F (java.awt.Font.
"Helvetica" java.awt.Font.BOLD$ 24))
(BG (java.awt.Color. 0x0000ff))
(FG (java.awt.Color. 0xffccaa)))
(.setFont L F)
(.setBackground W BG)
(.setForeground W FG)
(.add W L)
(.resize W 300 300)
(.show W)
)
% java jsint.Compile HelloWorld.silk
% wc HelloWorld.java
496 1476 15357 HelloWorld.java
% javac HelloWorld.java
% java HelloWorld
こうすると,中央にHello Worldと書かれた
ウィンドウが現れます.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日