これは何か?
R6RSという Scheme の新しい言語仕様に準拠することを目指している高速な Scheme インタプリタです。
※インタプリタの名称を変更しました。
何が出来るの?
Perl や Ruby で行っているような実用的なプログラミングができます。(現時点ではもちろん機能は限られますが)
例えばサンプルとして Mosh で書かれた Wiki が動いています。
なぜ Scheme なの?
Scheme という言語が柔軟で素晴らしい言語だからです。
Scheme について知りたい方は、計算機プログラムの構造と解釈やプログラミングGaucheなどを読まれると良いでしょう。
ダウンロードとインストール
Google Code からソースコードをダウンロードして下さい。
ソースコードのビルドにはGauche が必要です。
./configure make make check make install
ビルドできない、できたなどの情報もぜひこちらか、日記へのコメントにお寄せ下さい。
機能概要
- Scheme としてのコア
- UTF-8 の入出力
- Quasiquote
- 正規表現
- 伝統的なマクロ
- 30bit の Fixnum
- シンプルなポート
- シンプルなCGI
- format 手続き
ドキュメント
- リファレンスマニュアル
- ロードマップ
制限と注意
このリリースは一番最初のリリースであり、Mosh にはまだ多くのバグや不具合がある可能性が高いです。
もしバグを見つけたらこちらか、日記へのコメント、などでご指摘頂けると助かります。
また現時点で対話的な REPL は実装されていません。
募集
Mosh では開発に参加して下さる方を募集しています。
ソースを読んで参加してみたいと思った方はご連絡下さい。
謝辞
Mosh の開発にあたって多くの方の助けていただきました。
この場をお借りしてお礼を申し上げます。
Gauche 開発者の川合史朗さんには Scheme やインタプリタ全般に関して専門的で貴重なアドバイスをたくさん頂きました。
また Mosh は read.cpp やコンパイラの最適化部分など一部の機能を Gauche のコードを利用しています。Gauche という良質のソースコードを公開してくださっていることに感謝します。
Ruby YARV 開発者の笹田さんには、VM の高速化手法や論文の紹介などたくさんのアドバイスを頂きました。
mumurik さんには FFI や場当たり的なパフォーマンスチューニングから始まるエントリーなど多くのご助言を頂きました。
Gaku さんにはパフォーマンスチューニングについて良き相談相手となっていただきました。私が客観的に見られない部分も明確にしてもらえるなど大変助かりました。
同僚の光成さん、奥さん(id:kazuhooku)には、Scheme オブジェクトをどのように C++ で表現するかについて多くのご助言とレビューを頂きました。
id:sumii さんには A正規形について詳しく教えて頂きました。(結局つかいませんでしたすみません。)
また上記以外にもたくさんの方にコメント、IRC、Lingr、飲み会などでアドバイスを頂きました。
本当にありがとうございます。
ライブラリ
Mosh は以下のライブラリやツールを使わせていただいています。
コメント (4)
エラーメッセージを見ると、どうも
const ucs4char*
と
const ucs4char*const
の違いのようですね。constは自動に補ってしかるべき文脈とそうでない文脈があると思うので(コンパイルやダウンロードすらしてません)コンパイラが悪いのかプログラムが悪いのかは分かりませんが...。
以前javaでschemeの超サブセット(とは言えcall/ccは実装してます -- jarが10数Kの凄く小さいもの)を実装したことがあるのですが、マクロの実装で躓いてからさわってないです。
GaucheとかVM(中間言語)にコンパイルする方式もありますが、xybakを使って一気にマシン語レベルにコンパイルするのが出来たら面白いなぁとか思います。
投稿者: dsk | 2008年05月14日 13:14
日時: 2008年05月14日 13:14
>constは自動に補ってしかるべき文脈とそうでない文脈があると思うので
そうですね。この問題を修正し 0.0.2 をリリースしました。
>以前javaでschemeの超サブセット(とは言えcall/ccは実装してます -- jarが10数Kの凄く小さいもの)を実装したことがあるのですが、マクロの実装で躓いてからさわってないです。
おお。call/cc を実装している時点でかなり本気ですね。
すばらしい。
>GaucheとかVM(中間言語)にコンパイルする方式もありますが、xybakを使って一気にマシン語レベルにコンパイルするのが出来たら面白いなぁとか思います。
僕もそう思います。
投稿者: ひげぽん | 2008年05月14日 15:01
日時: 2008年05月14日 15:01
> この問題を修正し 0.0.2 をリリースしました。
MacOS10.5.2(intel)で正常に動きました。
ソースをちらっと見たのですが、ひょっとしてgaucheとVM互換だったりします?define-insnとか下位2bitの扱いとか、似ているような感じがするんですけど。
C++なのでGaucheに比べてソースがずいぶん見やすい気がします。
でも、開発者向け、inside moshみたいなのがあるともっと嬉しいです。
> おお。call/cc を実装している時点でかなり本気ですね。
call/ccの勉強が半分目的だったので...。
・pcもspもツリー上を動いているような実装
・call/ccされるとスタック(treeだけど)を遡って「そのcontinuationはプログラマから見えてますよ」マークを付けて行く
・マークのついているスタックを使うときはcloneしてマークを外す
というような実装です。一般的かどうかは知りません。高速化とかcompilerとかには向いていないかも、です。
投稿者: dsk | 2008年05月14日 21:01
日時: 2008年05月14日 21:01
>MacOS10.5.2(intel)で正常に動きました。
確認ありがとうございました。
>ソースをちらっと見たのですが、ひょっとしてgaucheとVM互換だったりします?define-insnとか下位2bitの扱いとか、似ているような感じがするんですけど。
互換ではないです。
ただオブジェクトのメモリ上の表現(タグビット)などはだいぶ参考にしています。
>C++なのでGaucheに比べてソースがずいぶん見やすい気がします。
でも、開発者向け、inside moshみたいなのがあるともっと嬉しいです。
リクエストありがとうございます。
もうすこし落ち着いたら徐々にドキュメントをふやしていきたいと思います。
>pcもspもツリー上を動いているような実装
おぉ。それは面白そうです。
自分は call/cc の実装に数週間悩んだのですが、そのようなやりかたもあるのですね。
投稿者: ひげぽん | 2008年05月19日 10:47
日時: 2008年05月19日 10:47