#:g1: UranusをANSI Common Lispで動かそう

Posted 2010-05-20 04:10:00 GMT

最近ちょっとPrologに手を出し始めたのですが、UranusというLISP上で動く処理系が公開されていたことを思い出しました。
Uranus Prolog/KR
-(http://homepage1.nifty.com/~skz/Entry/uranus.html)
こちらのページでは、オリジナルをGCLに対応させています。
このページによると、CMUのAIレポジトリでソースが公開されているようなので、
-(http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/kr/systems/uranus/0.html)
このソースをASDFに対応させてセットアップが楽にできるようにしてみました。
SBCLで作業してみたのですが、Allegro CL、Clozure CL、XCLでも動くことを確認しました。しかし、若干微妙なところがありますので、今後ちょこちょこ直して行きたいです。
主な変更は下記のとおりです。

uranus.asd

Zetalisp用のdefsystemの定義があったりしてファイルの読み込み順の参考にできそうですが、とりあえず、上から順に読み込むasdファイルを作成しました。
(in-package :cl-user)

(asdf:defsystem :URANUS :name "Uranus" :description "Uranus is an extension of Prolog written in Common Lisp and has the syntax of Lisp." :version "V-19.8" :serial t :components ((:file "package") (:file "decl") (:file "defs") (:file "lib") (:file "kernel") (:file "amuse") (:file "systempred") (:file "lispfunctions") (:file "stepper") (:file "trace") (:file "td") (:file "readin")))

package.lisp

パッケージの指定がCLtL1なのでこれを変更するためにpackage.lispを作成しました
(DEFPACKAGE :URANUS
  (:USE :CL)
  (:NICKNAMES :URA)
  (:EXPORT :uranus@version))

(DEFPACKAGE :URANUS-USER (:USE :CL :CL-USER) (:NICKNAMES :URA-USER))

;;; Amuse package family: (defpackage Amuse (:use :cl :cl-user)) (defpackage ec (:use :amuse :cl :cl-user) (:nicknames :e))

(IN-PACKAGE :URANUS) (defvar uranus@version "V-19.8")

他に修正するところ

CLtL1的なところからの変更

+ 今のANSI CLでのCL-USERは以前USERと書けていていたので、これをCL-USERに変更(自分は、URANUS-USERパッケージを作成してみました)
+ CLtL1では、in-packageしただけでパッケージが作成されたのですが、これを明示的にDEFPACKAGEで作成するように変更
+ special-form-pは廃止なので、special-operator-pに変更(special-form-pのマクロを定義)

Zetalisp的なところからの変更

+ memq等がないとなるので、lib.lispの#+kclの箇所を#+ansi-clに変更
+ zl:sendがないといわれるので、#+lispm等を付けてスルー

他の変更

+ パッケージロック等で警告があるので好きなように変更
できれば、asdf-installできると嬉しいので、githubに公開しようと思いましたが、ライセンスに再配布について明記されていないようなので見送っています。

動作

CL-USER> (URANUS:URANUS)
:
:(ASSERT (FOO 3))
:(foo *x)
(FOO 3)
:;assertを纒めたdefineというのがあるので試してみる
(DEFINE COMPRESS 
  ( ((*X) (*X)) )
  ( ((*X *X . *T) *ANS)
    (COMPRESS (*X . *T) *ANS) )
  ( ((*X *Y . *T) (*X . *ANS))
    (COMPRESS (*Y . *T) *ANS) ))
(DEFINE COMPRESS (((*X) (*X))) (((*X *X . *T) *ANS) (COMPRESS (*X . *T) *ANS)) (((*X *Y . *T) (*X . *ANS)) (COMPRESS (*Y . *T) *ANS)))
:(compress (4 4 0 0 1 1 1) *x)
(COMPRESS (4 4 0 0 1 1 1) (4 0 1))
Uranusには、Zmacs(Lispマシンのエディタ)と連携するための設定が付属してくるのですが、これを参考にSLIMEと連携させるようにしてみたいところです。

comments powered by Disqus