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-06-24

オリジナルのSchemeインタープリタを動かそう

| 00:31 | オリジナルのSchemeインタープリタを動かそう - わだばLisperになる を含むブックマーク はてなブックマーク - オリジナルのSchemeインタープリタを動かそう - わだばLisperになる

Accesscom.com | SF Bay Area Internet Access Providerさんのページを眺めていたら、最初のSchemeの論文のインタープリタをCLに移植した(オリジナルはMacLISP)という面白そうなものがあったので早速試してみることにしました。

ここのlambda papersのリンクからファイルを取得できます。

このファイルをコンパイルして読み込ませたイメージをSBCLを使って実行ファイルにしてみました。

(compile-file "/tmp/scheme")
(load "/tmp/scheme")

(defun scheme-repl ()
  (handler-case (scheme)
    (error (cond)
      (declare (ignore cond))
      (format t "An error occurred.")
      (scheme-repl))))

(pushnew (lambda ()
           (scheme-repl))
         sb-ext:*init-hooks*)

(sb-ext:save-lisp-and-die "/tmp/scheme-1975" :purify 'T :executable 'T)

というようなファイルをmake-scheme.lispとでも名前を付けて、配布物の中のscheme.lispを/tmpに置いて、

$ sbcl --load make-scheme

と実行しすると、/tmp/にscheme-1975ができます。

実行可能ファイルになってますので、実行するとschemeのインタープリタが起動します。

そのままでは、エラー時にデバッガに落ちて面倒なので、適当に再度実行するようにしてありますが、もっとちゃんとした対処方法があると思います。

This is SCHEME 0 running in SBCL 1.0.17
SCHEME -- Toplevel

(define fact-iter
  (lambda (n)
    (labels ((fact1 (lambda (m ans)
                      (if (= m 0)
                          ans
                          (fact1 (- m 1)
                                 (* m ans))))))
      (fact1 n 1))))
==> 
FACT-ITER 
==> 
3628800 
==> 

まとめ/その他

にオリジナルのSchemeの論文があります。

また、EMACSで、(run-scheme "/tmp/scheme-1975")とすれば、EMACS経由で使えます。(quit)で終了。

どうも、doマクロ等がちゃんと動いてない気もするのですが、その辺をデバッグするのも一興ではないでしょうか(*'-')