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 |

2011-05-13

CLでSRFI-1

| 21:11 | CLでSRFI-1 - わだばLisperになる を含むブックマーク はてなブックマーク - CLでSRFI-1 - わだばLisperになる

自分的にたまーに欲しいと思うことがあるSRFI-1ですが思い切ってCLにまるごと移植してみました。

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のソースコードのトランスレータもどっかに落ちてそうなので探してみたいところではあります。

ゲスト



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