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 |

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を探索してみるのも面白いと思います。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071222