JavaLispドキュメント

慶應義塾大学大学院 理工学研究科 計算機科学専攻

近藤 豪

National Institute of Advanced Industrial Science and Technology (AIST) This page is a page of the former research institute. We stopped updating on March 31.2001.
E-mail to webmaster (Japanese) E-mail to webmaster (English)

はじめに

JavaLispは Euslisp のサブセットにJavaの擁している機能の一部を追加した処理系で ある.JavaLispは,現在インタプリタのみをサポートしており,それはJavaに よって記述されている.動作環境は,JDK1.1である.

JavaLispの特徴

オブジェクト指向プログラミング
完全な互換性はないが部分的にEuslispのオブジェクト指向プログラミン グをサポートしている.
JavaAPIの利用
Javaでしか利用できなかったJavaのクラスライブラリが,JavaLispによっ て利用可能となった.これによって,JavaのプログラマでなくともLispスタイ ルのプログラミングによって,部分的ではあるが豊富なJavaのクラスライブラ リが利用可能となっている.

しかも,従来のJavaではコンパイラによる実行であったが,JavaLispはインタ プリタであるので,対話的プログラミングによるアプリケーションの開発が容 易に行える.

JavaLispではJavaAPI中のクラスのインスタンス生成を行う関数 make-java-instance 及び,そのインスタンスに対するメッセー ジ送信を行う関数 send を提供している.

しかし,現時点では,JavaAPI中のクラスを継承するクラスの定義は実現でき ていない.

JavaLispの起動方法

JavaLispがインストールされているディレクトリで以下のコマンドを実行する.
      % java JavaLisp
これによってインタプリタによる対話的なLispプログラムの実行が行なえる. また, -e オプションで続くLispのプログラムを実行が可能とな る.例えば,
      % java JavaLisp -e "(car '(a b c))"
a が返ってきて終了する.

リファレンス

データ型

JavaLispのデータ型には,以下のようなものがある.

クラス階層

以下に組み込みクラスの階層を示す.これらのクラスは,Javaで定義されてい る.
object
     cons
     vector
        integervector
        floatvector
     propertiedobject
         symbol
         package
         metaclass
             vectorclass

組み込み関数・マクロ・スペシャルフォーム

JavaLispで実装済みの関数・マクロ・スペシャルフォームを以下に挙げ, Euslispと非互換の場合は,その相違点を述べる.

制御構造

条件文

逐次実行とlet

ローカル関数

ブロックとexit

くり返し

述語

オブジェクト指向プログラミング

JavaLispではEuslispのオブジェクト指向プログラミングが完全にサポートさ れていない.よって,以下の関数・マクロなどは,部分的な実装となっている.

JavaAPIクラスライブラリのインスタンス生成

JavaLispの組み込みクラス外のJavaAPI中のクラスのインスタンス生成のため に以下の関数を用意した.

make-java-instance class &rest initargs [関数]

classには文字列,あるいはシンボルが与えられる.シンボルの場合はその PNAMEをclassとする.CLASSPATHからclassを探し,そのコンストラクタに引数 initargsを与えて,インスタンスを生成する.

また,上の関数で生成されたインスタンスに対するメッセージ送信は上の send で同様に行うことが出来る.ただし.起動するメソッドが void型の場合は, sendnull を 返す.

数値演算

シンボルとパッケージ

シンボル

パッケージ

JavaLispのパッケージはニックネームを持っていない点がEuslispと異なる. JavaLispは次の4つのパッケージを定義する。
lisp:
全てのlisp関数、マクロ、定数、など
keyword:
キーワードsymbol
system:
システム管理または危険な関数
user:
ユーザー領域

*package*は、読み込み・印刷のための主なパッケージを持つグローバ ル変数である。もし*package*user:でないならば、 top-levelプロンプトは、現在のパッケージを示すためにmypkg> のように変更される。

リスト・ベクトル

JavaLispではベクトルは使うことが出来るが,配列はサポートされていない. また,ベクトルは通常のもののほかに整数ベクトルと浮動小数点ベクトルがあ る.

リーダ

JavaLispのリーダはEuslispのリーダに従っているが,部分的な実装にとどまっ ている.JavaLispのリーダのEusLispとの相違点は以下のようなものである.

C言語表記の数式読み込み % はない.

JavaLispのマクロ変換は以下のもののみである.

#F(...)
実数ベクトル
#I(...)
整数ベクトル
#(...)
ベクトル
#|...|#
コメント; 入れ子可能

評価

  • apply func &rest args [関数]
  • funcall func &rest args [関数]
  • function func [特殊]
  • macroexpand form [関数]
  • the type form [特殊]
  • declare declaration* [特殊]
    JavaLispは,Lispの動的な型をJavaの静的な型の上で実現するために,全ての 関数の引数と返り値の型は, java.lang.Object として実現さ れている.よって,型に関する宣言を行っても,実行速度の上では効果はない. declarespecial 宣言のみを扱う.
  • bye[関数]
  • load filename [関数]
    load は,文字列 filename で示されたファイルの みを引数とする簡単な関数として実現した.

近藤 豪 kondo@nak.math.keio.ac.jp