JavaLispドキュメント
慶應義塾大学大学院 理工学研究科 計算機科学専攻
近藤 豪
はじめに
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.lang.Integerを利用)
- 浮動小数点数(java.lang.Floatを利用)
- 文字列(java.lang.Stringを利用)
- JavaAPIのオブジェクト(java.*)
クラス階層
以下に組み込みクラスの階層を示す.これらのクラスは,Javaで定義されてい
る.
object
cons
vector
integervector
floatvector
propertiedobject
symbol
package
metaclass
vectorclass
組み込み関数・マクロ・スペシャルフォーム
JavaLispで実装済みの関数・マクロ・スペシャルフォームを以下に挙げ,
Euslispと非互換の場合は,その相違点を述べる.
制御構造
条件文
- and {form}* [特殊]
- or {form}* [特殊]
- if test then [else] [特殊]
- when test forms [マクロ]
- unless test forms [マクロ]
- cond (test {form}*)* [特殊]
- case key {({label | ({lab}*) {form}*)}* [マクロ]
逐次実行とlet
- prog1 form1 &rest forms [関数]
- progn {form}* [特殊]
- setf {access-form value}* [マクロ]
- let ({var | (var [value])}*) {declare}* {form}* [特殊]
- let* ({var | (var [value])}*) {declare}* {form}* [特殊]
ローカル関数
- flet ({(fname lambda-list . body)}*) {form}* [特殊]
- labels ({(fname lambda-list . body)}*) {form}* [特殊]
ブロックとexit
- block tag {form}* [特殊]
- return-from tag value [特殊]
- return value [マクロ]
- catch tag {form}* [特殊]
- throw tag value [特殊]
- unwind-protect protected-form {cleanup-form}* [特殊]
くり返し
- while test {form}* [特殊]
- tagbody {tag | statement}* [特殊]
- go tag [特殊]
- prog ({var | (var [init])}*) {tag | statement}* [マクロ]
- do ({(var init [next])}*) (endtest [result]){declare} {form}* [マクロ]
- do* ({var init [next]}*) (endtest [result]){declare} {form}* [マクロ]
- dotimes (var count [result]) {forms}* [マクロ]
- dolist (var list [result]) {forms}* [マクロ]
- until condition {forms}* [マクロ]
- loop {forms}* [マクロ]
述語
- eq obj1 obj2 [関数]
- equal obj1 obj2 [関数]
- null object [関数]
- not object [関数]
- atom object [関数]
- functionp object [関数]
オブジェクト指向プログラミング
JavaLispではEuslispのオブジェクト指向プログラミングが完全にサポートさ
れていない.よって,以下の関数・マクロなどは,部分的な実装となっている.
- defclass &key :super object :slots ({var}* | (var [:forward selectors])) :size -1 [マクロ]
- defmethod classname {(selector lambda-list . body)}* [特殊]
- send object selector {arg}* [関数]
- instantiate class &optional size [関数]
- instance class &rest message [マクロ]
- make-instance class &rest var-val-pairs [関数]
- slot object class (index | slot-name) [関数]
- setslot object class (index | slot-name) value [関数]
JavaAPIクラスライブラリのインスタンス生成
JavaLispの組み込みクラス外のJavaAPI中のクラスのインスタンス生成のため
に以下の関数を用意した.
make-java-instance class &rest initargs [関数]
classには文字列,あるいはシンボルが与えられる.シンボルの場合はその
PNAMEをclassとする.CLASSPATHからclassを探し,そのコンストラクタに引数
initargsを与えて,インスタンスを生成する.
また,上の関数で生成されたインスタンスに対するメッセージ送信は上の
send で同様に行うことが出来る.ただし.起動するメソッドが
void型の場合は, send は null を
返す.
数値演算
- /= num1 num2 [関数]
- = num1 num2 &rest more-numbers [関数]
- > num1 num2 &rest more-numbers [関数]
- < num1 num2 &rest more-numbers [関数]
- >= num1 num2 &rest more-numbers [関数]
- <= num1 num2 &rest more-numbers [関数]
- 1- integer [関数]
- 1+ integer [関数]
- + &rest numbers [関数]
- - num &rest more-numbers [関数]
- * &rest numbers [関数]
- / num1 num2 &rest more-numbers [関数]
シンボルとパッケージ
シンボル
- symbolp object [関数]
- symbol-plist sym [関数]
- boundp symbol [関数]
- fboundp symbol [関数]
- get sym attribute [関数]
- putprop sym val attribute [関数]
- remprop sym attr [関数]
- setq {var value}* [特殊]
Euslispでは var は点で継った組が可能だがJavaLispではシンボル
のみをサポートする.
- defun symbol [documentation] lambda-list . body [特殊]
- defmacro symbol [documentation] lambda-list . body [特殊]
- defvar var &optional (init nil) [特殊]
JavaLispではEuslispと違い,実装上の理由からスペシャルフォームとなって
いる.
- gensym &optional x [関数]
パッケージ
JavaLispのパッケージはニックネームを持っていない点がEuslispと異なる.
JavaLispは次の4つのパッケージを定義する。
- lisp:
- 全てのlisp関数、マクロ、定数、など
- keyword:
- キーワードsymbol
- system:
- システム管理または危険な関数
- user:
- ユーザー領域
*package*は、読み込み・印刷のための主なパッケージを持つグローバ
ル変数である。もし*package*がuser:でないならば、
top-levelプロンプトは、現在のパッケージを示すためにmypkg>
のように変更される。
- *lisp-package* [定数]
- *user-package* [定数]
- *unix-package* [定数]
- *system-package* [定数]
- intern string &optional (package *package*) [関数]
オプショナル変数klassがない点がEuslispと異なる.
- list-all-packages [関数]
- find-package name [関数]
- make-package name &key (:use '(lisp)) [関数]
- in-package pkg &key (:uses '(lisp)) [関数]
- use-package pkg &optional (curpkg *package*) [関数]
- export sym &optional (pkg *package*) [関数]
- import sym &optional (pkg *package*) [関数]
リスト・ベクトル
JavaLispではベクトルは使うことが出来るが,配列はサポートされていない.
また,ベクトルは通常のもののほかに整数ベクトルと浮動小数点ベクトルがあ
る.
- length sequence [関数]
- nreverse sequence [関数]
- consp object [関数]
- car list [関数]
- cdr list [関数]
- cadr list [関数]
- cddr list [関数]
- cdar list [関数]
- caar list [関数]
- caddr list [関数]
- caadr list [関数]
- cadar list [関数]
- caaar list [関数]
- cdadr list [関数]
- cdaar list [関数]
- cdddr list [関数]
- cddar list [関数]
- first list [関数]
second, third, fourth, fifth, sixthもまた定義されている
- nth count list [関数]
- nthcdr count list [関数]
- cons car cdr [関数]
- list {element}* [関数]
- list-length list [関数]
環状リストには適用できない
- rplaca cons a [関数]
- rplacd cons d [関数]
- memq item list [関数]
- member item list &key :key :test :test-not [関数]
- assoc item alist [関数]
- append {list}* [関数]
- nconc {list}* [関数]
- flatten complex-list [関数]
- push item place [マクロ]
- pop stack [マクロ]
- mapcar func &rest arg-list [関数]
- mapcan func arg-list &rest more-arg-lists [関数]
- vector &rest elements [関数]
- aref vector pos [関数]
JavaLispでは1次元配列のみを提供しているので第2引数は整数でなければなら
ない.
リーダ
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 として実現さ
れている.よって,型に関する宣言を行っても,実行速度の上では効果はない.
declare は special 宣言のみを扱う.
- load filename [関数]
load は,文字列 filename で示されたファイルの
みを引数とする簡単な関数として実現した.
近藤 豪
kondo@nak.math.keio.ac.jp