Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-23

*LISPシミュレータ

| 19:40 | *LISPシミュレータ - わだばLisperになる を含むブックマーク はてなブックマーク - *LISPシミュレータ - わだばLisperになる

どう書くorgのお題:ライフゲームで*LISPのシミュレータを使ってみたわけなのですが、面白いので、もうちょっと追っ掛けてみることにしました。

とりあえず、毎回インストールの度にインストール方法を忘れてしまうので、メモがてら纏めてみたいと思います。

そもそも*LISPってなんだ

*LISPは、シンキングマシンズ社の65536個もプロセッサがある超並列計算機Connection Machineの上で動いていたLISPの処理系でした。

Wikipediaに詳しい説明とマニュアル等のリンクがあります。

Connection Machine用のLISPの処理系としては、当時この会社で働いていた、Guy L. Steel Jr.氏が筆頭となって、そのまんまな名前のConnection Machine Lisp(以下CM Lisp)というものが開発されていたようですが、結局完成はしなかったようで、代わりにこの*LISPが使われることになったようです。CM Lispについては、論文も書かれていますが、新しいアイディアが満載で、かなり強力だったようなので、完成して日の目を見なかったのは残念ですね。まあ、強力過ぎて完成しなかったのかもしれず…。ちなみにCM LispはCLtL2にもリーダマクロの説明等で、ちょこちょこ登場しています。

そんなこんなもあり、CM Lispと、*LISPは結構混同されていることが多いようです。

*LISPは、主にConnection Machineに合わせてマクロで拡張されたCLのスーパーセットになっているようです。また、現実的な需要からか、当時からこのシミュレータも存在してしました。1990年頃から公開されていた様子ですが、2003年に主要開発者のJ. P. Massar氏がANSI規格に沿うように改訂して今に至ります。

ソース入手

シミュレータのソースは下記からダウンロードできます。

インストール

自分が動作確認できた処理系は、AllegroとCLISPです。SBCL、Clozure CLはコンパイルに失敗してしまいます。(詳細後述)

まず、環境に合わせて設定ファイルを書き換え、コンパイルを実行しますが、処理系によっては、若干ソースを修正する必要があります。

  • ANSIに合わせたとか言いつつ、パッケージ名をuserと記載しているままな個所があるので、cl-user等に直します。

パターンとしては、以下の3つです。

user:: -> cl-user::
:user -> :cl-user
"USER" -> "CL-USER"
  • 設定ファイルにソースが展開されたパスを記述します。

ちなみに、unzipをするとディレクトリを作らず、撒き散らかすタイプです。

/var/tmp/starlispにディレクトリを作成して中身を展開したと仮定すると下記のような記述になります。

; make.lisp
(defparameter *defsystem-search-path* '("/var/tmp/starlisp/"))
;
; f20.sys
(define-alias "STARLISP" "/var/tmp/starlisp/")
(define-alias "VERSION" "/")
;
  • ファイル名の修正

f20.sysというファイルをF20.sysという名前に変更するか、リンクします。

大文字にしないと(ms :f20)したときにファイルの呼び出しに失敗します。

もしくは、f20.sysの中の、 :f20〜の個所を:|f20|として、(ms :|f20|)とすれば大丈夫ですが、こっちの方が面倒かと思います。

;
(compile-file "/var/tmp/starlisp/make")
(load *)
(ms :f20)
;〜
;

これで、システムが読み込まれます。

;
(*lisp)
;

とすると、

Thinking Machines Starlisp Simulator.  Version 20.0

と出たりするので、おおっ!とか思いますが、単にパッケージを移動しているだけだったりします。

マニュアル

本格的なマニュアルは、*Lisp Reference Manualというものがあったようなのですが、当然ながら入手困難なようです。

配布物のなかに、tutorial.pdfと、getting-started-guide.txtというチュートリアルがあります。

自分は、PDFで見た目も綺麗ということで、tutorial.pdfを参照してgetting-started-guide.txtは見てなかったのですが、このエントリを書くにあたって、Wikipediaのリンクから辿って、マニュアルを漁っていたところ、getting-started-guideのPDF版を見付けました。

これを眺めたところ、ライフゲームの図が沢山あるので、チュートリアルの題材が思いっ切り今回のどう書くorgのお題のライフゲームだということに気付きました。

当然ながら、コードは洗練されています。思いっきりループ版を投稿したり、その後、このチュートリアルの劣化版のような並列構文版を投稿したりした自分が恥ずかしい…(;´Д`)

…まあ、良いや、誰も気付かないだろうし…。というか改めて確認しましたが、テキスト版のgetting-started-guide.txtよりtutorial.pdfの方が題材にしている処理系のバージョンが古いみたいですので、getting-started-guide.txtがお勧めです。

追記

  • SBCLとか、Clozure CLでのコンパイルが失敗する場所

type-system-deftypes.lispの

(deftype pvar (&optional (element-type '*))
  ;; I have to return a satisfies type with a closure so that typep can work.
  ;; But, returning a closure will blow up both subtypep and the compiler on lucid.
  (let ((closure (*lisp-i::pvar-type-predicate 
                  (cadr (*lisp-i::canonical-pvar-type `(pvar ,element-type))))))
    `(satisfies ,closure)))

;

の個所がコンパイルできないようです。SBCLや、Closure CLでは、SATISFIESにLAMBDA式が渡るのが許されないことが原因のようなのですが、自分のレベルでは、対処方法が分からず…。ここを通過できれば、使えるんですが…。アドバイス等ありましたら是非お願いしたいです!