-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Meevax は Lisp-1 に分類されるプログラミング言語です。
言語機能の大半が R7RS Scheme そのままに実装されており、基本的な使い勝手もそれに準じています。 しかし、開発者の美的感覚に基づいて導入された少なくない数の非互換要素が存在しており、本文書はその解説を目的としています。
大雑把に言って、言語コアは以下の必要最小限度の機能のみを持ちます。
- オブジェクト外部表現の内部表現化
- オブジェクト内部表現の外部表現化
- SECD 仮想マシンおよび、そのコンパイラ
- 残りのすべての言語機能を構築するために必要なプロシージャおよびスペシャルフォーム
- ダイナミックリンカ
「オブジェクト外部表現の内部表現化」を担当する手続きです。
「手続き」はいわゆる関数と同じものと考えて差し支えありません。 これは、厳密に数学的な「関数」とは限らないため区別のためにこのように呼ばれます。 逆説的に言えば、Meevax は関数型プログラミングを推奨しそれを強くサポートする言語ではありますが、純粋関数型ではなく、副作用を許容する言語であるということです。
「オブジェクト内部表現の外部表現化」を担当する手続きです。
SECD マシン語へのコンパイル、およびそのマシン語へのユーザアクセスを担う機能です。
式は read されると即座にコンパイルされ、実行されます。 そのため、単に利用する立場からすれば、特に意識する必要の無い機能です。 ただ、後述するマクロシステムの理解のため、「入力された式は read され、compile され、評価される」という一連の実行フェーズは覚えておくべきでしょう。
将来的に compile
、disassemble
の名称でユーザ空間から利用可能にする計画がありますが、現時点(0.2)では実装されておらず、また、それが必要になることは無いと考えられています。
非推奨扱いですが、Meevax のクロージャは「式と環境のペア」という原則に忠実に実装されているため、ペアアクセッサにより両者を自由に取り出し、利用・変更することが可能です。 クロージャの car 部にはコンパイル済みの SECD マシン語が proper list として、cdr 部にはレキシカル環境が association list として格納されています。 ただし、これを変更したりした場合の安全性は保証されません。 また、将来的に内部表現が変更される可能性があることに留意してください。
また、SECD マシンは Peter Landin の SECD マシンに対してアレンジが加えられている点にも留意してください(SECDR-Scheme のものに近いです)。
純粋な言語コアが提供する手続きおよびスペシャルフォームを以下に列挙します。 この内容は言語仕様がある程度固まるまで、頻繁に増えたり減ったりします。
バインディング | 効果 |
---|---|
begin | 逐次実行 |
call-with-current-continuation | 与えられたプロシージャを現在の継続を引数として起動する |
define | 変数定義 |
environment | 環境コンストラクタ |
if | 条件分岐 |
lambda | クロージャコンストラクタ |
quote | オブジェクト外部表現のリテラル化 |
set! | 代入 |
すべてのリストはペア型から構築されます。