next up previous
Next: 13 課題 Up: ソフトウェア特論 講義資料 JavaによるScheme言語処理系: Jscheme Previous: 11 JavaMethodクラス

12 Jscheme 5.0

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")
表示されるウィンドウは,

\includegraphics[width=4.0cm]{/home/inaba/eps/lecture/fig/Javawindow.eps}


となっています. 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日