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-10-08

LTD

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

なんとなく前から試してみたかったPeter Norvig氏のLTD(Common lispからDylanにコンバートするツール)がどんなものなのか試してみました。

Converting Common Lisp to Dylan

多分、暫くすると導入方法等は完全に忘れてしまうのでメモ。

インストール

概要は、サイトにドキュメントがあるので、そのまま進んで行けば導入はできるようです。

最初SBCLで試してみましたが、あまり上手く動かず、試用版のAllegroはそこそこ上手く使えるようです。Clispでも打ち死しました。

関数の定義の順番で上手くloadできなかったり、パッケージのロックとぶつかってしまったりしますが、ぶつかる個所を適当にコメントアウトしたり、定義の順番を入れ換えたりしてちょっといじってやりすごしました。

;; make-ltd-core.lisp
(load "load")
(load-ltd :compile t)
(load-ltd)
(dumplisp :name "ltd-allegro.core")
(exit)

のようなファイルを作って、codeのディレクトリに移動し、

% alisp -L ../make-ltd-image.lisp

のように実行すると、イメージができるので、

alisp -I ltd-allegro.core

のように実行するとLTD込みのAllegroが起動。

変換してみる

;; foo.lisp
(defun fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
	 (fib (- n 2)))))

(defun tarai (x y z)
  (cond ((> x y)
	 (tarai
	  (tarai (1- x) y z)
	  (tarai (1- y) z x)
	  (tarai (1- z) x y) ))
	(t y) ))

のようなファイルを作って、

(ltd-files "foo.lisp")

とすると、

// foo.lisp
define method fib (n)
  if (n < 2) n; else fib(n - 1) + fib((n - 2)); end if;
end method fib;

define method tarai (x, y, z)
  if (x > y)
    tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y));
  else
    y;
  end if;
end method tarai;

のようにdylanに変換されたfoo.dylanが生成されます。

testディレクトリには、このツールで変換された約4万行の変換されたファイルがあり、なかなか壮観です。

…しかし、自分は上手く変換できませんでした。

色々探ってみる必要がありそうです。しかし、難しそう。

Gaucheのファイルを読み込んで、Common Lispに書き出してくれるようなツールがあると便利そうだなとしばし妄想。