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-04-18

DylanでSwank

| 23:50 | DylanでSwank - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでSwank - わだばLisperになる

DylanでSWANKサーバ立ててSLIMEからDylanを使うというdswankなるものを発見したので、駄目もとで挑戦の巻

とりあえず、MacOSXで挑戦したのですが、駄目でした。

しょうがないので、Linuxで挑戦したのですが、64bit UbuntuではDylan自体が上手く動かせないので、qemu(kvm)でDebianを起動してビルドしたところ成功しました。

ビルドには、dswank以外に、lisp-readerが必要なようです。

ソースは、404 Not Foundで確認できます。

1. ソースをsvnで引っ張ってくる。

$ svn co svn://anonsvn.gwydiondylan.org/scm/svn/dylan/trunk/fundev/sources/lib/lisp-reader
$ svn co svn://anonsvn.gwydiondylan.org/scm/svn/dylan/trunk/fundev/sources/lib/dswank

2. ビルド

上記二つを同じディレクトリに設置したします。opendylanを適切に起動できるように設定したとして、

$ opendylan -build dswank.hdp
...
Hacker Edition
Version 1.0 [Beta 4]
Copyright (c) 1997-2004, Functional Objects, Inc.
Portions Copyright (c) 2004-2007, Dylan Hackers
All rights reserved.

Project file for missing 'lisp-reader':

となるので、何を指定して良いのか良く分かっていませんが、lisp-readerのファイルを指定

../lisp-reader/lisp-reader.hdp
....
...

ゴリゴリビルドが始まります。30分位ビルドに時間が掛りました。

Linux版の場合、

3. 実行してみる

~/Open-Dylan/bin/dswankにバイナリができるので実行。

起動してはいる様子ですが、外部から接続もできず。どういうことなのかと思い、ソースを眺めてみると、--listenという引数が取れる模様なので、--listenを付けてみると、

$ ~/Open-Dylan/bin/dswank --listen
Waiting for connection on port 4005

となり、

ポート4005番で待機しているようです。

ということで、SLIMEから接続してみます。

M-x slime-connect
127.0.0.1
4005

→接続できました!

まだ、使い方が良く分からないのですが、プロジェクトをオープンしたりビルドコマンドを実行したりはできるようです。

CLのSLIMEと比べてしまうと、かわいそうですが、現状では、ちょっと便利なDylanシェル位の感じです。

とりあえず記念にスクリーンショットを取ってみました。

Ubuntu 7.10の上のqemu上のDebianでdswankを起動して、MacOSXにポートフォワードしてSLIMEと接続という、意味なくややこしい構成になっています。

全然関係ないですが、Dylan用の設定がないか、CVS版のSLIMEを改めて確認してみたら、swank-goo.gooというものを発見しました。GOOでもSWANKが起動できるのか!!

ということで、次はGOOで挑戦します!

2008-02-13

SERIESのドキュメント

| 11:59 | SERIESのドキュメント - わだばLisperになる を含むブックマーク はてなブックマーク - SERIESのドキュメント - わだばLisperになる

凄く有用そうなのに今一つ普及していない、SERIESパッケージ。

資料も実例のソースコードも非常に少ないというか、全然Google等でも検索に引っ掛からないのですが、みつけられるところでは、CLtL2の付録のドキュメントと、SERIESの配布物の中のs-doc.txt位でしょうか。

日本語チュートリアル的なドキュメントとしては、

があります。

あと、前にこのブログでも試したものを書いてみたりしてたのを思い出しました。

こっちは、私が書いたものなので、内容は保証できませんが…。

そんな感じなのですが、今日AI Memoを漁っていたら、作者のRichard C. Water氏の解説をみつけました。

AIメモの番号は、AIM-1082と、1083です。

1082は大体、添付のs-doc.txtと似たような内容で、1083は理論的な解説です。

SERIESは言語とは、特定の言語とは独立したものだそうで、Pascal版のSERIESも載ってたりしてます。

あと、あんまり関係ないですが、SERIESの前身のような、LetSというものも見付けました、こちらは、AIM-680aですが、なんとなくSERIESよりこっちの方が簡素で分かりやすい気がしないでもありません…。

2008-01-24

Vecto

| 18:12 | Vecto - わだばLisperになる を含むブックマーク はてなブックマーク - Vecto - わだばLisperになる

今回は、Vectoを試してみます。

VectoはCL-VECTORSの簡便なインターフェースを提供するものだそうで、これを利用して簡単にベクター画像をpngファイルとして出力することができます。

パッケージ名vecto
作者Zach Beane氏
本拠地サイトVecto - Simple Vector Drawing with Common Lisp
ClikiCLiki: Vecto
ASDF-INSTALL

インストール

(asdf-install:install :vecto)一発で、ウェブからパッケージを取得しインストール完了です。

試してみる。

手頃な感じで、綺麗な画像が作れるので、これは重宝するかもしれません。

;; 動作
(defpackage #:vecto-examples (:use #:cl #:vecto))
(in-package #:vecto-examples)

(with-canvas (:width 400 :height 30)
  (let ((font (get-font "/usr/share/fonts/truetype/ipamona/ipag-mona.ttf"))
	(file "/var/tmp/vecto.png"))
    (set-rgb-fill 0.95 0.60 0.25)
    (rounded-rectangle 0 0 400 30 5 5)
    (fill-path)
    (set-rgb-fill 1.0 0.65 0.3)
    (rounded-rectangle 2.5 2.5 395 25 5 5)
    (fill-path)
    (set-font font 20)
    (set-rgb-fill 0 0 0)
    (draw-string 2.5 7.5 "1万円分のスイーツ、夢と散る(´・ω・`)")
    (save-png file)))
;
;
  • 出力画像

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式が渡るのが許されないことが原因のようなのですが、自分のレベルでは、対処方法が分からず…。ここを通過できれば、使えるんですが…。アドバイス等ありましたら是非お願いしたいです!

2008-01-19

cl-serializer

| 05:31 | cl-serializer - わだばLisperになる を含むブックマーク はてなブックマーク - cl-serializer - わだばLisperになる

今回は、cl-serializerを試してみます。

シリアライズって何ですか?という私なのですが、調べてみたところ、処理系内部のオブジェクトデータの外部へ入出力するためのものなんですね。

パッケージ名cl-serializer
本拠地サイトcl-serializer
ClikiCLiki: cl-serializer
ASDF-INSTALL

インストール

asdfに対応はしているのですが、依存するパッケージがことごとく、Clikiに登録されておらず、darcで引っ張ってこないといけません。これが、結構手間です。

自分は、darcで引っ張ってきて、tarボールにまとめ、asdf-installをしました。


$ cd /var/tmp
$ darcs get http://common-lisp.net/~loliveira/darcs/babel                   
$ darcs get --partial http://common-lisp.net/project/cl-def/darcs/cl-def    
$ darcs get http://common-lisp.net/project/stefil/darcs/stefil              
$ darcs get http://common-lisp.net/project/defclass-star/darcs/defclass-star
$ darcs get http://common-lisp.net/project/cl-serializer/darcs/cl-serializer

$ tar zcvf ....

(asdf-install:install "http://cffi-net.accela.net/releases/cffi-grovel-r2.tgz")
(asdf-install:install "/var/tmp/babel.tar.gz")
(asdf-install:install "/var/tmp/cl-def.tar.gz")
(asdf-install:install "/var/tmp/stefil.tar.gz")
(asdf-install:install "/var/tmp/defclass-star.tar.gz")
(asdf-install:install "/var/tmp/cl-serializer.tar.gz")

試してみる


(require :cl-serializer)

;; データ
(defvar obj '(a (b c) a b (d e (f g (h i)))))

;; 書き出し
(let ((sr (cl-serializer:serialize obj)))
  (with-open-file (out "/var/tmp/ser.dat" :direction :output :if-exists :supersede
		       :element-type 'unsigned-byte)
    (series:collect-stream out (series:scan sr) #'write-byte)))

;; 読み込み
(with-open-file (in "/var/tmp/ser.dat" :element-type 'unsigned-byte)
  (pprint (cl-serializer:deserialize (coerce (series:collect (series:scan-stream in #'read-byte)) 'vector))))
;=> (A (B C) A B (D E (F G (H I))))

serializeでシリアライズして、deserializeで戻し。

なるほど、なるほど。

私には用途が思い付きませんが、きっと凄いものなのでしょう(´▽`*)

2008-01-16

cl-audioscrobbler

| 00:09 | cl-audioscrobbler - わだばLisperになる を含むブックマーク はてなブックマーク - cl-audioscrobbler - わだばLisperになる

今回は、cl-audioscrobblerを試してみます。

これは、last.fmに曲情報をポストしたりする、Audioscrobblerと連携するパッケージです。

この前私はlast.fmに曲情報をポストするコードを書いて認証が通らず頓挫したりしましたが、そんな私も一応作る前にClikiを調べて、last.fm関連のものが無いかは確認してみたつもりでした。これを発見したときには、なんだ、そのものズバリがあるんじゃないかよ!、と思ってしまいました。

Clikiの検索では、存外、目的のパッケージが見付けられないことが多い気がします。

この前も、AllegroのHTMLパーザを移植してClikiに公開した人が、「それ、もう移植されてるよ」と指摘される、なんてことがありました。

ちなみに、私もClikiでpxmlutilsを発見できずに、Allegroのオープンソース版をSBCLに移植した後で発見するという、全く同じ体験をしました。

移植ははちょっと直せば良いので簡単ではあるのですが、同じことをしてる人が他にも沢山いるような気がしてなりません(笑)

pxmlutilsっていう名前が良くないと思うなあ。

パッケージ名cl-audioscrobbler
本拠地サイトcl-audioscrobbler
ClikiCLiki: cl-audioscrobbler
ASDF-INSTALL

インストール

(asdf-install:install :cl-audioscrobbler)一発です。

試してみる


(require :cl-audioscrobbler)

;; クライアント作成
(defparameter *c*
  (cl-audioscrobbler::make-client "user" "password" "tst" "1.0"))

;; 曲情報をポスト
(cl-audioscrobbler::post-song *c* :1.1
			      "Bonnie Pink"
			      "Even So"
			      "Private Laughter"
			      "179"
			      "1")

という感じで曲情報がポストできます。

プロジェクトのサイトには非常に丁寧に作られたドキュメントが沢山用意されていて非常に親切です。

2008-01-14

cl-glfw

| 22:33 | cl-glfw - わだばLisperになる を含むブックマーク はてなブックマーク - cl-glfw - わだばLisperになる

今回は、cl-glfwをインストール。

glfwのCommon Lispバインディングの様子。

パッケージ名cl-glfw
本拠地サイト不明
ClikiCLiki: cl-glfw
ASDF-INSTALL

インストール

(asdf-install:install :cl-glfw)一発です。

glfw(libglfw.so)が必要なので、予めインストールして置く必要があります。

試してみる

デモが附属してくるので試してみます。

(load "cl-glfwのソースの場所/cl-glfw_0.3/examples/gears.lisp")

するとGLではお馴染みの歯車がぐるぐる回ります。

2008-01-13

ttf-ascii

| 17:45 | ttf-ascii - わだばLisperになる を含むブックマーク はてなブックマーク - ttf-ascii - わだばLisperになる

TTFファイルから、アスキーアートのバナーを作るらしいパッケージ。とりあえず、試しでインストール。

パッケージ名ttf-ascii
本拠地サイトhttp://www.yagc.ndo.co.uk/code/ttf-ascii/
ClikiCLiki: ttf-ascii
ASDF-INSTALL×
インストール方法ASDFには対応している。

インストール

このパッケージは、ASDFには対応しているのですが、bzip2で圧縮されているため、asdf-installできず。最近のASDF-INSTALLだとbz2も扱えるのでしょうか…。

面倒なので、asdf-installをbz2も扱えるように変更してみました。CL-PPCREとか、KMRCL依存というのに問題ありな気が激しくしますが、面倒だったので…。(find-packageで判定してオリジナルと動作を切り分ければ、幾分ましかもしれません)

;; 判定する関数をでっちあげ
(defun get-archive-type (name)
  (let ((file-type (kmrcl:command-output "~A ~A" "file" (namestring name))))
    (cond ((ppcre:scan "bzip2" file-type) :bz2)
	  ((ppcre:scan "gzip" file-type) :gz)
	  ('T :unknown))))

(defun get-tar-directory (packagename)
  (let* ((tar (with-output-to-string (o)
                (or
                 (sb-ext:run-program *tar-program*
                                     (list (case (get-archive-type packagename)
					     (:gz "-tzf")
					     (:bz2 "-tjf")
					     (otherwise (error "unknown archive type")))
					   (namestring packagename))
                                     :output o
                                     :search t
                                     :wait t)
                 (error "can't list archive"))))
         (first-line (subseq tar 0 (position #\newline tar))))
    (if (find #\/ first-line)
        (subseq first-line 0 (position #\/ first-line))
        first-line)))

(defun untar-package (source packagename)
  (with-output-to-string (o)
    (or
     (sb-ext:run-program *tar-program*
			 (list "-C" (namestring source)
			       (case (get-archive-type packagename)
				 (:gz "-xzvf")
				 (:bz2 "-xjvf")
				 (otherwise (error "unknown archive type")))
			       (namestring packagename))
			 :output o
			 :search t
			 :wait t)
     (error "can't untar"))))

それで、このパッケージは、ZPB-TTFパッケージに依存しているので、(asdf-install:install :zpb-ttf)でインストールします。

試してみる。

ドキュメントはないですが、ソース本体であるfont.lispの最後にテストが書いてあるので、それを真似て試してみます。

ちなみに、シンボルはエクスポートされていない様子です。

日本語フォントは無理かなーと思って試してみたのですが、ちゃんと表示されました。

(let ((font-loader
       (zpb-ttf:open-font-loader "/usr/share/fonts/truetype/kochi/kochi-gothic-subst.ttf")))
  (ttf-ascii::print-message (ttf-ascii::make-message font-loader "漢" 64 64))
  (zpb-ttf:close-font-loader font-loader))
;=>
################################################################
##########+#####################################################
#########++##################++############++###################
########++++#################+++++#########+++++################
#######+++++#################++++++########++++++###############
#######++++++################+++++#########++++++###############
########+++++################+++++#########+++++################
########++++++##+++++++++++++++++++++++++++++++++++++++++++++###
#########+++++##+++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
###########++++#+++++++++++++++++++++++++++++++++++++++++++++###
###########++################+++++++++++++++++++################
#############################+++++++++++++++++++################
#############################+++++++++++++++++++################
########################+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
######+#################+++++++++++++++++++++++++++++###########
####+++#################+++++++++++++++++++++++++++++###########
###+++++################++++#########+++#########++++###########
###++++++###############++++#########+++#########++++###########
####+++++###############++++#########+++#########++++###########
####++++++##############++++#########+++#########++++###########
#####+++++##############++++#########+++#########++++###########
#####++++++#############++++#########+++#########++++###########
######+++++#############++++#########+++#########++++###########
######++++++############++++#########+++#########++++###########
#######++++#############+++++++++++++++++++++++++++++###########
#######++###############+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
########################+++++#######+++++#######+++++###########
####################################+++++#######################
####################################+++++#######################
##############++#####+++++++++++++++++++++++++++++++++++########
##############+++####+++++++++++++++++++++++++++++++++++########
#############++++####+++++++++++++++++++++++++++++++++++########
#############+++++###+++++++++++++++++++++++++++++++++++########
############++++++###+++++++++++++++++++++++++++++++++++########
############++++++################++++++########################
###########+++++++################+++++#########################
###########++++++#################+++++#########################
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
#########++++++++++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
########++++++#################+++++++#+++++####################
########++++++#################++++++##++++++###################
#######+++++++################+++++++###+++++###################
#######++++++################++++++#####+++++++#################
######+++++++################++++++######+++++++################
######++++++#################++++++######++++++++###############
#####+++++++###############+++++++#########+++++++##############
#####++++++###############++++++++#########+++++++++############
####++++++###########++#+++++++++###########++++++++++##########
####++++++#########+++++++++++###############+++++++++++########
###+++++++#####++++++++++++++##################+++++++++++#+####
#########+#####+++++++++++++####################++++++++++++####
################++++++++++########################+++++++++#####
################+++++++++############################+++++######
#################++++###########################################
################+###############################################
################################################################

cl-sparsematrix

| 16:07 | cl-sparsematrix - わだばLisperになる を含むブックマーク はてなブックマーク - cl-sparsematrix - わだばLisperになる

Clikiで更新されたものを片っ端からインストールしてみるということは、当然ながら自分が理解できる以外のものもインストールするということであり、今回は、疎行列に関してのパッケージなわけですが、疎行列って何?という私が試してみるのも無理がありますね(´▽`*)

ということで、インストールしただけで終了しました…。

作者は、Tamás K Papp氏で、他にも色々面白そうなパッケージを作成されている方のようです。

パッケージ名cl-sparsematrix
本拠地サイト404 Not Found
ClikiCLiki: cl-sparsematrix
ASDF-INSTALL
(asdf-install:install :cl-sparsematrix)

インストール

asdf-install可能なので、(asdf-install:install :cl-sparsematrix)すると、関連するパッケージを芋蔓式に取得します。

cl-numlib、ffa、cl-utilities等がインストールされるようです。

丁寧なPDFのドキュメントが附属してきます。

2008-01-12

lisp-unit

| 16:54 | lisp-unit - わだばLisperになる を含むブックマーク はてなブックマーク - lisp-unit - わだばLisperになる

Clikiからは新しく登録されたり更新されたパッケージ(ライブラリ)のRSSがフィードされているのですが、ふと思い立って、更新されたパッケージを追い掛けてやたらインストールして、試したログをここに書いてみることにしました。

色々な面白いパッケージが沢山あるのですが、如何せん情報がみつけられないことが多いので、片っ端からインストールしてみれば、何か面白いもの発見できるかな、という安易な考えです。

とりあえず、今回は、lisp-unitを試してみることにしました。前までは、LispUnitという名前だったのですが、この度名前をlisp-unitに変更したようです。

パッケージ名lisp-unit
本拠地サイトno title
ClikiCLiki: lisp-unit
ASDF-INSTALL
(asdf-install:install :lisp-unit)

インストール

asdf-install可能なので、(asdf-install:install :lisp-unit)で一発インストール完了です。

使ってみる

かなり古くからある、リグレッションテストのパッケージ:RTと大体同じような使い勝手に思えました。

テストをDEFINE-TESTで定義して、RUN-TESTで実行するところなど共通点は多いと思います。

(defpackage #:cl-2008-01-12 
  (:use #:cl))

(in-package #:cl-2008-01-12)

(defun fib (n)
  (cond ((< n 2) n)
	('T (+ (fib (1- n))
	       (fib (- n 2))))))

(defun fib-iter (n)
  (do ((cnt n (1- cnt))
       (a1 1 (+ a1 a2))
       (a2 0 a1))
      ((< cnt 2) a1)))

のようなファイル(cl-2008-01-12.lisp)があるとすると、

(require :lisp-unit)

(load "cl-2008-01-12")

(defpackage :test_cl-2008-01-12
  (:use #:cl #:lisp-unit))


(in-package #:test_cl-2008-01-12)


(define-test fib
  (assert-eql 55 (cl-2008-01-12::fib 10))
  (assert-eql 1 (cl-2008-01-12::fib 1))

  (loop :for i from 1 :to 30
        :do (assert-eql (cl-2008-01-12::fib-iter i) (cl-2008-01-12::fib i)))
  
  )

(run-all-tests :test_cl-2008-01-12)

(cl-2008-01-12::fib-iter 0)
;=>FIB: 32 assertions passed, 0 failed.

のように書いてテストが書けます。

RTでは、deftestに一つずつ別の名前を付けなくちゃいけなかったりするので、自分は、それ用のマクロを定義して使ったりしてましたが、lisp-unitはRTより使い勝手は良いようです。

本拠地のサイトに丁寧な説明が用意されています。

自分も一時ユニットテストを使っていたのですが、テストを書くのが段々面倒になってしまい、ひたすらSLIMEのコンパイルエラーの指摘に頼ってコードを書くようになってしまいました。

これを使ってもう少し、精神衛生上すっきりしたコード書きができるようになりたいものです。

SLIMEで支援用ELISPを書いてCompile Defunと同じ位簡単にテストまで完了したいという妄想はあるのですが、なかなか自分の力量的に難しいなあ。

2008-01-10

TIのLispマシン - TI-Explorerのエミュレータ

| 15:00 | TIのLispマシン - TI-Explorerのエミュレータ - わだばLisperになる を含むブックマーク はてなブックマーク - TIのLispマシン - TI-Explorerのエミュレータ - わだばLisperになる

Lispマシンというのは、ある意味Lisp文化の頂点の一つだったんじゃないかと思うのですが、今年は、Lispマシン近辺をもう少し探索してみたいなと思い、手始めに、これまで、別のブログに書いていたLispマシン関連の記事もこのブログにカテゴリ:「Lispマシン」として纏めてみることにしました。

これまでは、MIT CADRや、INTERLISP-Dを、ちょっといじったりしてました。結構情報は古くなってしまったんですが…。

それで、今回は、TI-Explorerのエミュレータの導入をまとめてみることにしました。

TI Explorerとは

テキサスインスツルメンツも昔はLispマシンを製造していまして、その名をExplorerといいました。

これは、Greenbratt氏のLMIからライセンスを受けて製造されていたマシンということで、LMI系のLispマシンです。

MITのCADRを起源としているので共通点は非常に多いのですが、それなりに違いはあります。

このTI Explorerのエミュレータを開発して配布しているところがあるので、ありがたく使わせて頂きます。

Merokoという名前のようです。

なんか、日本のアニメのキャラから名前がとられているっぽいのですが、元ネタが分からない…。

インストール

ここでは、Ubuntu 7.10 x86_64にインストールする方法を書きます。

もともとコンパイル済みのLinux用のバイナリが同梱されているので、32bit環境ならば何もしなくても起動できるとは思います。

  • ダウンロード
$ wget http://www.unlambda.com/download/meroko/meroko-20060610.tar.gz
$ wget http://www.unlambda.com/download/meroko/X1-DISKS.tgz
  • 解凍
tar zxvf X1-DISKS.tgz
tar zxvf meroko-20060610.tar.gz

解凍するとsvnフォルダができます。この中に、ソースと実行バイナリがあります。

自分は、x86_64用にMakefileを書き換えて、コンパイルしなおしてみています。といってもCPUの指定を変更するだけです。

--- svn/Makefile        2006-06-11 23:57:03.000000000 +0900
+++ /share/sys/emu/Explorer64.emu/svn/Makefile  2007-12-22 07:49:53.000000000 +0900
@@ -15,7 +15,7 @@
 DISPLAY_OBJ = sdl.o
 endif
 
-CFLAGS= -O3 -ggdb -Wall -march=pentium3 -mfpmath=sse -mmmx -msse $(DEFINES) -DENABLE_ENET
+CFLAGS= -O3 -ggdb -Wall -mfpmath=sse -mmmx -msse -msse2 -msse3 $(DEFINES) -DENABLE_ENET
 # -DTRACELOG
 # -DDEI_TRACELOG
 # -DTRACELOG2

コンパイルすると、merokoという実行ファイルができるのでこれを直接実行します。

実行ファイルと同じディレクトリにディスクイメージを解凍してできたX1-DISKSディレクトリを移動します。デフォルトだと1階層上にMerokoというディレクトリを作成してそこに置くみたいですが、同じディレクトリに配置することにしてみます。

いじってみる

./meroko

で起動します。

  • 起動時に何やら質問されるのですが、とりあえず、D=Default。
  • ネットワーク関連で色々文句を言われるのですが、とりあえず無視。Ctrl-Zでトップレベルに抜けられます。
  • リスナーが立ち上がっている状態なので、ここに色々式を入力します、たとえば、(ed)でZmacsが起動します。
  • ホームディレクトリの作成
(fs:create-directory ";g000001")

";"がパスネームセパレータの様です。この場合、ルートディレクトリ直下にg000001というディレクトリを作成します。

  • ログイン
(login 'ユーザ名)

で、ログインします。デフォルトでは、ルート直下の同じログイン名と同じ名前のディレクトリがホームディレクトリとして利用されます。

ログイン初期化ファイルを作成する

リスナーに(ed)と打込むか、System Eでエディタが起動します。エミュレータでは、Systemは、F1にアサインされています。(E→エディタ、L→リスナー、P→Peek(PSのようなもの)、M→メーラ)

Zmacsが起動するので、自分用のログイン初期化ファイルを作成してみましょう。

ファイル名は、login-init.lispで、

Emacsと同様にC-X C-Fで作成します。

ログインされると、この中のLispの式が評価されます。

とりあえず、簡単なところで、自分は、

(tv:black-on-white) 
(ed "g000001;gazonk.del")

のようにしています。

black-on-whiteは、画面を黒地に白にする命令で、ed〜は、ログインしたら、Zmacsで、gazonk.delというファイルを開けということです。

大体こんな感じなのですが、基本的なEmacsの機能は大体あるので、色々試してみると面白いかと思います。

Lispの開発もSlimeのようにかなり対話的に行なえます。エディタ上の式を評価するには、C-Shift-E、コンパイルするには、C-Shift-Cです。画面のエコーエリアか、長い場合は、画面の上から、スルスルと結果が表示されてきます。これが結構良い感じで、SLIMEもこういう風に表示できたら良いのにな、とか思います。

マニュアルとかシステムのソースとか

膨大なマニュアルがbitsaversに保管されています。

システムコードの一部がウェブで公開されています

まとめ

以上、非常に簡単にですが、インストールからログイン位までで、自分の知っていることを書いてみました。

Lispマシンってどんな感じだったのか雰囲気位は、感じられるかと思います。

SymbolicsのLispマシンはもっと凄くて、TI Explorerより、もっと洗練されていて驚く程、高機能です。ただ、エミュレータは公開されているものの本格的に利用するには、Symbolicsのソースが必要なようです。こちらも、ちょっと起動するところまではできたので、そのうち纏めて書いてみたいと思います。

このエミュレータは重たくて、Core2位でないと使いものにならないかもしれません。また、どうやら外部とネットワークで通信もできるようなのですが、ドキュメントも少なく自分は、まだ使いこなせてません。もし、なにか情報お持ちでしたら、ツッコミ等大歓迎です!

2008-01-07

ABCL 0.0.10をインストールしてみる

| 17:31 | ABCL 0.0.10をインストールしてみる - わだばLisperになる を含むブックマーク はてなブックマーク - ABCL 0.0.10をインストールしてみる - わだばLisperになる

※antを使う方法が一番楽なようです

----

私は、割とOSや処理系のインスコ厨です。

特に使う目的もない処理系をインストールして、それで満足して終了、ということを繰り返しているのですが、今回は、ABCLをインストールしてみることにしました。

ABCLはJavaVM上で動くCommon Lispの処理系です。

に詳しい解説があります。

私のインストールポリシーとしては、

  1. /usr/local/abcl/0.0.10以下にファイルを置く

ということ位です。

必要なもの

  1. とりあえず、JDKが必要です。ubuntu 7.10 x86_64には、sun-java5-jdkがあるので、パッケージで導入しました。
  2. Common Lisp処理系。コンパイルするのに必要になります。今回はSBCLを使用しました。

インストール

  1. READMEを読んで、customizations.lispを設定します。
(case *platform*
  (:windows
   (setq *jdk*           "C:\\Program Files\\Java\\jdk1.5.0_11\\")
   #+(or) (setq *java-compiler* "jikes")
   )
  (:darwin
   (setq *jdk*           "/usr/")
   (setq *java-compiler* "jikes")
   #+(or) (setq *jar*    "jar"))
  ((:linux :unknown)
   (setq *jdk*           "/usr/lib/jvm/java-1.5.0-sun/")
   (setq *jar*           "jar")))
  1. ホストの処理系でbuild-abcl.lispをロードします。
(load "build-abcl.lisp")
  1. ホストの処理系でコンパイル開始
(build-abcl:build-abcl :clean t :full t)

しばし待つとabclという起動の為のスクリプトが生成されるので、これで完了です。

なんとなく分かったこと

  • ASDFは組み込みで、(require :asdf)で使えます。
  • SLIMEに対応している。
  • CL-PPCRE、ITERATE等、それなりに動くパッケージはある。

分からないこと

  • UTF-8でSLIMEと通信できない模様。ただ、処理系はUTF-8なので、日本語が表示できないというわけではない様子。
  • イメージのダンプとかできるんだろうか。とりあえずは、初期化ファイルを作って、swankまで起動させて、SLIMEと通信して使用してみています。起動は、
/usr/local/abcl/0.0.10/abcl --load init-abcl.lisp

Armed Bear Common Lisp 0.0.10 (built Mon Jan 7 2008 16:27:15 --900)
Java 1.5.0_13 Sun Microsystems Inc.
Java HotSpot(TM) 64-Bit Server VM
Control-C handler installed.
Low-level initialization completed in 0.398 seconds.
Startup completed in 1.822 seconds.
〜〜
;; Swank started at port: 4013.
Type ":help" for a list of available commands.
CL-USER(1)

といった感じ。

2008-01-05

FORMATは深すぎる

| 18:09 | FORMATは深すぎる - わだばLisperになる を含むブックマーク はてなブックマーク - FORMATは深すぎる - わだばLisperになる

一体どんな機能があるのか極一部しか把握できていないFORMATなのですが、今日ふとFORMATTER関数ってどういう時に使うと効果的なのかな、と思い、CLtL2のFORMATTERのところを読んでみてました。

それで、FORMATは、フォーマット指定文字列だけでなく、関数も引数として取れるということを初めて知ったのですが、FORMATTERというのは、フォーマット指示文字列に従って引数を解釈して文字列を出力する関数とのこと。

うーん、そうだったのか!、と思い色々実験。

(format t (lambda (stream &rest args)
	    (do ((cnt 0 (1+ cnt))
		 (a args (cdr a)))
		((endp a))
	      (format stream "Arg:~D => ~A~%" cnt (car a)))
	    args) 
	'foo 'bar 'baz)
;=>
;Arg:0 => FOO
;Arg:1 => BAR
;Arg:2 => BAZ

定義する関数は、2引数の関数で、streamと残りの引数、といった構成。つまりformatが取る引数と同じ構成にする模様。

うーん、これだ!という便利そうな良い例が思い付かないけれど、なんだか凄そうだー。

(defun type-of-printer (stream &rest args)
  (dolist (item args)
    (format stream "Arg:~A Type => ~A~%" item (type-of item)))
  args)

(format t #'type-of-printer 'foo '(foo bar baz) 1 2 3 4)
;=>
;Arg:FOO Type => SYMBOL
;Arg:(FOO BAR BAZ) Type => CONS
;Arg:1 Type => BIT
;Arg:2 Type => (INTEGER 0 1152921504606846975)
;Arg:3 Type => (INTEGER 0 1152921504606846975)
;Arg:4 Type => (INTEGER 0 1152921504606846975)

(funcall (formatter "Hello, ~{~A ~^~}!~%") t '(foo bar baz))
;=>
;Hello, FOO BAR BAZ !

(let ((print-items-in-list (formatter "~{~A~%~}") ) )
  (funcall #'print-items-in-list t '(foo bar baz)))
;=>
;FOO
;BAR
;BAZ

(mapc (formatter "~A~%") '(t t t) '(foo bar baz))
;=>
;FOO
;BAR
;BAZ

(format t #'format #'format #'format "Hello, ~@(~A~)" 'world!)
;=>
;Hello, World!

こうやってみてみると、FORMATっていうのは、外枠だけ提供してるようなもので、どっちかというとFORMATTERが頑張っている構成になっているように見える。

2007-12-29

Common Lispであんまり衛生的ではないdefine-syntax

| 02:03 | Common Lispであんまり衛生的ではないdefine-syntax - わだばLisperになる を含むブックマーク はてなブックマーク - Common Lispであんまり衛生的ではないdefine-syntax - わだばLisperになる

2月にはGauche本が出版されるとのことで、2月位からSchemeの風が吹きまくると思われ、来年は、ちょっとしたSchemeブームになると思うのです。

On Lispを買いそびれている、Schemeのことはあんまり知らない、どっちかっていうとCommon Lispしか知らない自分でさえ買っちゃおう、と思っているのですから絶対来ると思うのです。

それで、Common Lispですが、Schemeブームのお蔭でそれなりに耳目も集まると思うのです。

Common Lispもなんとはなしに盛り上がると良いですね。

自分もGauche本買ったら、Common Lispで試してみたいと思います(*'-')

そんなSchemeですが、SchemeにはCommon Lispみたいなマクロの機構以外にパターンマッチングをベースにした衛生的なマクロ機構がR5RSで規定されています。

これのCommon Lispがあったので試してみました。

作者は、t-y-schemeのDorai Sitaram氏で配布元は、Scheme Macros for Common Lispです。

これを見付けた時には、これで、SRFI-42を移植しよう!とか思ったのですが、実際に色々試してみるとそんなにするするっと達成できることでもなさそうです。

これを使うと、


(define-syntax aif
  (syntax-rules ()
    ((aif expression then else) (let ((it expression))
				  (if it then else))))
    ((aif expression then) (let ((it expression))
			     (if it then)))))

のようにほとんど、まんまR5RSのdefine-syntaxのようにマクロが書けます。

ちなみに...はCommon Lisp的に実用的でないので、デフォルトは***に設定されています。

SRFI-42はとりあえず置いて、練習としてSRFI-26のcutを移植してみました。


(defpackage :srfi-26
  (:use :cl :mbe)           ;mbeとしてパッケージを作って取り込んでみています。
  (:export :cut :cute))

(in-package :srfi-26)

(define-syntax srfi-26-internal-cut
  (syntax-rules (<> <...>)

    ;; construct fixed- or variable-arity procedure:
    ;;   (begin proc) throws an error if proc is not an <expression>
    ((srfi-26-internal-cut (slot-name ***) (proc arg ***))
     (lambda (slot-name ***) (funcall (progn proc) arg ***)))
    ((srfi-26-internal-cut (slot-name ***) (proc arg ***) <...>)
     (with ((rest-slot (gensym)))
       (lambda (slot-name *** &rest rest-slot) (apply proc arg *** rest-slot))))

    ;; process one slot-or-expr
    ((srfi-26-internal-cut (slot-name ***)   (position ***)      <>  . se)
     (with ((x (gensym)))
       (srfi-26-internal-cut (slot-name *** x) (position *** x)        . se)))
    ((srfi-26-internal-cut (slot-name ***)   (position ***)      nse . se)
     (srfi-26-internal-cut (slot-name ***)   (position *** nse)      . se))))

; exported syntax

(define-syntax cut
  (syntax-rules ()
    ((cut . slots-or-exprs)
     (srfi-26-internal-cut () () . slots-or-exprs))))

殆ど、まんまでOKで、LISP-1と、LISP-2の違いを手動で修正すれば良いだけという感じなのですが、残念ながら、MBEは、define-syntaxが衛生的と言われる所以でもある変数補足の問題までは全自動で解決できないので、(gensym)を使って回避する必要があります。(with 〜)で囲んでgensymと置き換える訳なのですが、これの見極めがちょっと難しい。馴れてないということもあるんでしょうが、どれが補足される可能性があるのか普通のマクロより難しい気がします。

ということで、一応動くことは動くんですが、これで良いのやらという感じです。

しかしこのマクロはかなり凄い気がするので、仕組を理解できたら良いなとは思っています。

;; 動作
;(cut cons (+ a 1) <>) 	is the same as 	(lambda (x2) (cons (+ a 1) x2))
(let ((a 3))
  (funcall (cut #'cons (+ a 1) <>) 3))
;==> (4 . 3)

;(cut list 1 <> 3 <> 5) 	is the same as 	(lambda (x2 x4) (list 1 x2 3 x4 5))
(funcall (cut #'list 1 <> 3 <> 5) 2 4)
;==> (1 2 3 4 5)

;(cut list) 	is the same as 	(lambda () (list))
(funcall (cut #'list))
;==> nil

;(cut list 1 <> 3 <...>) 	is the same as 	(lambda (x2 . xs) (apply list 1 x2 3 xs))
(funcall (cut #'list 1 <> 3 <...>) 2 4 5 6 7)
;==> (1 2 3 4 5 6 7)

;(map (cut * 2 <>) '(1 2 3 4))
(mapcar (cut #'* 2 <>) '(1 2 3 4))
;==> (2 4 6 8)

;(map (cut vector-set! x <> 0) indices)
(let ((x (make-array '(5) ) )
      (indices '(1 3 0 2 4)))
  (flet ((vector-set! (vec idx obj)
	   (setf (aref vec idx) obj)))
    (mapc (cut #'vector-set! x <> 0) indices)
    x))
;==> #(0 0 0 0 0)

;(for-each (cut write <> port) exprs)
(let ((exprs '("foo" "bar" "baz") ) )
  (mapc (cut #'write <> :stream *standard-output*) exprs))
;==> "foo" "bar" "baz"

;(map (cut <> x y z) (list min max))
(let ((x 1) (y 2) (z 3))
  (mapcar (cut <> x y z) (list #'min #'max)))
;==> (1 3)

;(for-each (cut <>) thunks)
(let ((thunks (list (lambda () (print "hello") )
		   (lambda () (print "world")))))
  (mapc (cut <>) thunks))
;==>"hello" "world" 

2007-12-25

INTERLISP的Xmas

| 23:38 | INTERLISP的Xmas - わだばLisperになる を含むブックマーク はてなブックマーク - INTERLISP的Xmas - わだばLisperになる

昨日突然、INTERLISPの処理系の新バージョン登場というふれこみで、comp.lang.lispにINTERLISP系の処理系のタレこみがありました。

タレこんだ人は、作者さん本人で、Blake McBrideさんなのですが、INTERLISP系というのは珍しいので、早速ダウンロードして試してみました。

Windowsと32bit Linuxだと素直に使えます。

INTERLISPには馴染みが薄い自分はなんとも言えませんが、大体普通のINTERLISPと同じ感じです。

INTERLISPにはマクロがなくその代わりに、引数を評価しないで取り込む、NLAMBDAという仕組があるのですが、この辺の使い方がちょっと違うかもしれません。

NLAMBDAはどんなもんなのかというと、

((nlambda (x y z) (list x y z)) foo bar baz)
;=> (foo bar baz)

というものです。

確かにこの仕組があれば、MACLISP系のマクロに相当するものは書けそうです。

ということで、色々試してみましたが、Lispf4では良く分からなかったので、

確認のため、PDP-10のINTERLISP-10でDOLISTを作ってみることにしました。

defineq (
    (dolist (nlambda l
	     ((lambda (var list body tag l)
		(eval `(prog (,var)
			     (setq ,l ,list)
		        ,tag (cond ((null ,l) (return)))
			     (setq ,var ,(car l))
			     ,@body
			     (setq ,l (cdr ,l))
			     (go ,tag))))
	      (caar l) (cadar l) (cdr l) (gensym) (gensym)))) )

という感じに作ってみましたが、EVALを呼んだりしてところなどがちょっと違うんじゃないかなあ、と思っています。

もう少し資料を探さなくては…。Lispf4でも大体近い感じなのですが、バッククオート等は使えないようです。うーん。どうするのが定石なのか。

文章の流れとは全然関係ないのですが、今日は12/25日ということもあり、INTERLISP-10の処理系を起動すると、

@lisp
INTERLISP-10  31-Dec-84 ...
Merry Christmas.
3_

と挨拶してくれます。

いつもは、Hi.だけなのですがクリスマスや、ハロウィンなどでメッセージが変わるようです。

地味にいい味出してます。

2007-12-22

45年前の処理系 元祖LISP 1.5 を試してみる

| 06:41 | 45年前の処理系 元祖LISP 1.5 を試してみる - わだばLisperになる を含むブックマーク はてなブックマーク - 45年前の処理系 元祖LISP 1.5 を試してみる - わだばLisperになる

先日は、PDP-1のエミュレータで、PDP-1 Lispを動かしてみましたが、やっぱり元祖である、LISP 1.5も動かしてみたいところ。

でも、さすがに、50年前のIBM7094の環境はかなり厳しいだろうと思いつつ、調べてみたら、なんとこれも簡単に動かせるようにまとめている方がいました。

約50年前の環境が再現できるというのは色々な意味で凄い。まず、データが保存されていて、今日のコンピュータで読めるってのが凄い。

こちらのページに詳しい方法が記載されています。

手短にまとめると、準備するものとしては、

が必要です。

上記のファイルを揃えて設定すれば、IBM 7094でLISP 1.5のバッチジョブを流せます。

しかし、若干面倒なので、Emacsのcompileを使って、バッチ処理のシェルスクリプトを起動させてみることにしました。

とはいえ、適当なでっち上げなので、試されたい方は各自作成されると良いと思います。

自分の環境では、lisp1.5:loadというcompileをラップした関数と、シェルスクリプトの組み合わせで*compilation*バッファに結果が表示されるようにしてみました。

  • バッチ用シェルスクリプト(load-lisp1.5)
#!/bin/sh

INFILE=$1
EMUDIR=~/lisp/lisp1.5-linux/

cd $EMUDIR
[ -f sys.log ] && rm sys.log
cat head.job $INFILE tail.job >cur.job
./txt2bcd -s cur.job lisp.job.mt
./i7094 lisptapeboot.ini
cat sys.log
  • head.job
       TAPE    SYSTMP,B3
       TAPE    SYSTAP,A4
       TAPE    SYSPOT,A3
       TAPE    SYSPPT,A7
       TEST  WHATEVER
  • tail.job
STOP)))   )))   )))   )))
       FIN      END OF LISP RUN
  • Emacsのcompile関数をラップしたバッチ処理を呼び出す関数
(defun lisp1.5:load ()
  (interactive)
  (let ((compile-command (concat "~/bin/load-lisp1.5 " (buffer-file-name))))
    (compile compile-command)))

これで若干対話的にコードが書けるようになったので、適当に試してみます。

  • reverseとmapcarを作ってみる
define ((
(r1 (lambda (m l)
      (cond ((null l) m)
	    ((quote t) (r1 (cons (car l) m) (cdr l))))))

(reverse (lambda (u) (r1 () u)))

(mapcar (lambda (lst fn)
	  (prog (l res)
	     (setq l lst)
	     again
	     (cond ((null l) (return (reverse res))))
	     (setq res (cons (fn (car l)) res))
	     (setq l (cdr l))
	     (go again))))
))

mapcar((1 2 3 4)
       (quote (lambda (x) (plus 10 x))))

cond(((quote t) (print (quote hello))))

今日からみると色々変ったところが多いのですが、まず、トップレベルで関数に外側の括弧が付いてなかったりします。

これは、evalquoteと呼ばれるらしいですが、evalで評価するか、applyで評価するかと考えれば良い、と The Evolution of Lisp に書いてました。ちなみにInterlispでは、evalquoteの形式でコーディングできます。

それで、マニュアルを見る限りではreverseは標準で付いてくるっぽいのですが、見付からないので作ってみました。

mapcarの引数の順番が関数とリストとで逆ですが、元々は、リスト→関数の順番だったようです。これまたInterlisp系では、伝統に則ってCommon Lisp(Maclisp系)とは逆です。

  • 結果
MTA: unit is read only
LPT: creating new file

HALT instruction, PC: 10524 (TRA 10523)
Goodbye
             TAPE    SYSTMP,B3

   B3 IS NOW LISP SYSTMP.
             TAPE    SYSTAP,A4

   A4 IS NOW LISP SYSTAP.
             TAPE    SYSPOT,A3

   A3 IS NOW LISP SYSPOT.
             TAPE    SYSPPT,A7

   A7 IS NOW LISP SYSPPT.
             TEST  WHATEVER



  THE TIME ( 0/ 0  000.0) HAS COME, THE WALRUS SAID, TO TALK OF MANY THI
NGS .....   -LEWIS CARROLL-
 EVALQUOTE OPERATOR AS OF 1 MARCH 1961.    INPUT LISTS NOW BEING READ.


  THE TIME ( 0/ 0  000.0) HAS COME, THE WALRUS SAID, TO TALK OF MANY THI
NGS .....   -LEWIS CARROLL-
  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
 DEFINE

 (((R1 (LAMBDA (M L) (COND ((NULL L) M) ((QUOTE T) (R1 (CONS (CAR L) M)
(CDR L)))))) (REVERSE (LAMBDA (U) (R1 NIL U))) (
 MAPCAR (LAMBDA (LST FN) (PROG (L RES) (SETQ L LST) AGAIN (COND ((NULL L
) (RETURN (REVERSE RES)))) (SETQ RES (CONS (FN (
 CAR L)) RES)) (SETQ L (CDR L)) (GO AGAIN))))))


 END OF EVALQUOTE, VALUE IS ..
 *TRUE*

  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
 MAPCAR

 ((1 2 3 4) (QUOTE (LAMBDA (X) (PLUS 10 X))))


 END OF EVALQUOTE, VALUE IS ..
 (11 12 13 14)

  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
 COND

 (((QUOTE T) (PRINT (QUOTE HELLO))))


 HELLO

 END OF EVALQUOTE, VALUE IS ..
 HELLO



  THE TIME ( 0/ 0  000.0) HAS COME, THE WALRUS SAID, TO TALK OF MANY THI
NGS .....   -LEWIS CARROLL-
 END OF EVALQUOTE OPERATOR
             FIN      END OF LISP RUN

なんでか知りませんが、ルイス・キャロルの文言が引用されてたりします。

若干わかりづらいですが、

END OF EVALQUOTE, VALUE IS ..

の後が評価結果です。なんとなく良い味を醸し出しています。

やっぱり手近に処理系があって手軽に試せるというのは良い!

PDFのマニュアルもあるので、これを見ながらLISP 1.5を探索してみるのも面白いと思います。