コンテンツにスキップ

48時間でSchemeを書こう/まとめと参考資料

出典: フリー教科書『ウィキブックス(Wikibooks)』

これで、関数、ラムダ、レキシカルスコープ、シンボル、文字列、整数、リスト操作、代入など、標準の大部分を実装したSchemeインタプリタが使えるようになりました。REPLを使って対話的に使うこともできますし、バッチモードでスクリプトファイルを実行することもできます。Scheme関数のライブラリを作成し、プログラムに組み込んだり、対話型インタプリタに読み込ませたりすることができる。awkやsedで少しテキスト処理をすれば、UNIXコマンドの出力を括弧付きのLispリストとして整形し、Schemeプログラムに読み込んで、このインタプリタを使ってシェルスクリプトを書くことができます。

このインタプリタには、まだまだ追加できる機能がたくさんあります。健全なマクロ( hygienic macros )を使えば、実行前にソースコードに変換を加えることができます。これは新しい言語機能を追加するのに非常に便利な機能で、Schemeのいくつかの標準的な部分(let-bindingsや追加の制御フロー機能など)は、これを用いて定義されています。R5RSの4.3節でマクロシステムの構文と意味が定義されており、実装に関する論文も多数存在します。基本的には、readExprとevalの間に、フォームとマクロ環境を受け取り、変換キーワードを探し、パターン言語の規則に従って変換し、必要に応じて変数を書き換える関数を挟みたいと思うでしょう。

継続は、「計算の残り」をキャプチャし、保存し、おそらく複数回実行する方法です。これを使えば、主要なプログラミング言語のほぼすべての制御フロー機能を実装することができます。継続を実装する最も簡単な方法は、プログラムを継続パッシングスタイルに変換し、evalが結果を返す代わりに、追加の継続引数を受け取り、それを呼び出すようにすることです。この引数は eval のすべての再帰的な呼び出しに通されますが、 call-with-current-continuation の呼び出しを評価するときにのみ操作されます。

Dynamic-wind は、現在の継続を離れるときに実行する関数のスタックを保持し、継続を再開するときに実行する関数のスタックを(継続データ型の中に)保持することで実装できます。

もしあなたがHaskellをもっと学びたいと思っているのであれば、役に立つライブラリがたくさんあります:

  • ウェブアプリケーション:WASH、モナディックなウェブフレームワークです。
  • データベース: haskelldb, SQL を Haskell 関数のセットとしてラップするライブラリで、データベースへのクエリ時に言語のすべての型安全性を提供します。
  • GUIプログラミング:FudgetswxHaskellがあります。wxHaskellはどちらかというと従来のMVC GUIライブラリですが、Fudgetsには関数型プログラミング言語でGUIを表現する方法について多くの新しい研究が含まれています。
  • 同時実行:Software Transactional Memory、論文 Composable Memory Transactionsで説明されています。
  • ネットワーク: GHCのネットワーキングライブラリです。

これで、この言語についてさらに調べるための出発点となるはずです。ハッキングを楽しんでください!

謝辞

[編集]

Ketil Maldeさん、Pete Kazmierさん、Brockさん、このチュートリアルに関する質問と提案を送っていただきありがとうございました。その他のコメント、説明、訂正は、このチュートリアルの page(訳註:リンク先は翻訳元(英語)の議論のページです) で行ってください。