-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Meevax は Lisp-1 に分類されるプログラミング言語です。
言語機能の大半が R7RS Scheme そのままに実装されており、基本的な使い勝手もそれに準じています。 しかし、開発者の美的感覚に基づいて導入された少なくない数の非互換要素が存在しており、本文書はその解説を目的としています。
また、Meevax の全性能を発揮するためには、ユーザには Lisp-1 プログラミング言語の運用能力に加えて、一定以上のモダン C++ プログラミングおよび Unix 系オペレーティングシステムのシステムプログラミングに精通していることが要求される点に留意してください。これは Meevax の設計目的を忠実に反映した結果です。詳しくは Meevax Core C++ Library の項をご覧ください。
以下では次の三つの観点から説明を述べます。
C++ プログラマ向け。 あくまで、利用のための簡易な解説であることに留意してください。 おそらく「お気楽 Scheme」等の Scheme プログラミング解説サイトをご覧になる方がずっとためになるでしょう。
Common Lisp プログラマ向け。 Common Lisp と Scheme の違いに近い話題ではありますが、Meevax は Scheme と非互換であることに注意してください(Scheme との違いについては for Schemer の説明が参考になるでしょう)。 また、筆者は Common Lisp の利用経験が無い点にも留意してください。
Scheme プログラマ向け。 Scheme に対する Meevax の非互換要素の解説が主になります。 非互換とは言っても、マクロシステムがあるため、Schemer であれば Scheme 相当の機能を再現することは難しくないと思います。 Meevax は将来的に Scheme 互換モードが搭載できれば嬉しいと考えていますが、今は人手が足りておらず、また、Meevax の開発目標ではないため消極的な対応にとどまっています。
大雑把に言って、言語コアは以下の必要最小限度の機能のみを持ちます。
- オブジェクト外部表現の内部表現化
- オブジェクト内部表現の外部表現化
- SECD 仮想マシンおよび、そのコンパイラ
- 残りのすべての言語機能を構築するために必要なプロシージャおよびスペシャルフォーム
- ダイナミックリンカ
「オブジェクト外部表現の内部表現化」を担当する手続きです。
「手続き」はいわゆる関数と同じものと考えて差し支えありません。 これは、厳密に数学的な「関数」とは限らないため区別のためにこのように呼ばれます。 逆説的に言えば、Meevax は関数型プログラミングを推奨しそれを強くサポートする言語ではありますが、純粋関数型ではなく、副作用を許容する言語であるということです。
「オブジェクト内部表現の外部表現化」を担当する手続きです。
SECD マシン語へのコンパイル、およびそのマシン語へのユーザアクセスを担う機能です。
将来的に compile
、disassemble
の名称でユーザ空間から利用可能にする計画がありますが、現時点(0.2)では実装されておらず、また、それが必要になることは無いと考えられています。
非推奨扱いですが、Meevax のクロージャは「式と環境のペア」という原則に忠実に実装されているため、ペアアクセッサにより両者を自由に取り出し、利用・変更することが可能です。 クロージャの car 部にはコンパイル済みの SECD マシン語が proper list として、cdr 部にはレキシカル環境が association list として格納されています。 ただし、それによる安全性は保証されません。 また、将来的に内部表現が変更される可能性があることに留意してください。
純粋な言語コアが提供する手続きおよびスペシャルフォームを以下に列挙します。 この内容は言語仕様がある程度固まるまで、頻繁に増えたり減ったりします。
バインディング | 効果 |
---|---|
begin | 逐次実行 |
call-with-current-continuation | 与えられたプロシージャを現在の継続を引数として起動する |
define | 変数定義 |
environment | 環境コンストラクタ |
if | 条件分岐 |
lambda | クロージャコンストラクタ |
quote | オブジェクト外部表現のリテラル化 |
set! | 代入 |
すべてのリストはペア型から構築されます。