CLでSRFI-1 — #:g1

Posted 2011-05-13 12:11:00 GMT

自分的にたまーに欲しいと思うことがあるSRFI-1ですが思い切ってCLにまるごと移植してみました。
- srfi-1.
- (http://srfi.schemers.org/srfi-1/srfi-1.html)
SRFI-1は過去のSchemeのライブラリやCommon Lispのリスト系の関数を調査して作成したとのことで、リスト操作で欲しそうなものは一通り揃っている気がします。
移植方法ですが、最初は、ちまちまdefineをdefunに直したりしてのんびり気長に行こうと思っていたのですが、途中で面倒になってdefineというマクロを定義してみたあたりから、オリジナルのソースをできるだけいじらない、という方針に切り替えました。
ということで字面的には、ほぼオリジナルのままです。(変更はcheck-argが微妙だったのでdeclareの型宣言で置き換えた位)
ありがちな書き換えとしては、
- condのelse節を:elseと書くことでなんとなく対応
- null?等をCLの関数のエイリアスとして作成
- named letはマクロでlabelsに変形。末尾呼び出しの最適化は処理系に期待。
- letrecは、labelsに形が近いので手書きで変形
- defineの引数は、CLの&rest、&optionalをそのまま使う
書き換えにチャレンジしなかったところとしては、
- functionの廃止 (lisp1化)
- condを再定義して=>とelseが使えるようにする
- named letを再帰除去してループに
というところです。
Scheme->CLのソースコードのトランスレータもどっかに落ちてそうなので探してみたいところではあります。

comments powered by Disqus