Scheme

**Scheme**（スキーム）はコンピュータ・プログラミング言語 LISPの方言のひとつで、静的スコープなどが特徴である。仕様（2017年現在、改7版まで存在する）を指すこともあれば、実装を指すこともある。Schemeにより、LISP方言に静的スコープが広められた。

## 概要
Schemeは、MIT AIラボにて、ジェラルド・ジェイ・サスマンとガイ・スティール・ジュニアによって1975年頃に基本的な設計がなされた。動機は、カール・ヒューイットの提案によるエレガントな並行計算モデル「アクター」と、同じくその言語のPLASMA（Planner-73）を理解するためであった。

静的スコープ（ALGOL由来とされる）は、状態を持つデータであるアクタ（クロージャ）の実現以外にも、`lambda` 構文を用いた**[[λ計算]]**や**[[末尾再帰]]**の最適化に不可欠な機構であった。

また、プログラムの制御理論から当時出てきた**[[継続]]**及びアクタ理論におけるアクタへの**メッセージ渡し**の概念から触発された**[[継続渡しスタイル|継続渡し形式]]**と呼ばれるプログラミング手法は以後の継続の研究に大きな影響を与えた。

## 歴史
MIT人工知能研究所においては以下のとおりLISPに始まるいくつかの言語が作られた。

この中でカール・ヒューイットが設計した規則ベースの言語 Planner はあまりに複雑な機構を持っていたため当初設計された全機能の実装は困難であり、サスマン等はそれをサブセット言語の  として実現し、さらには、 Planner の流れを汲んだ独自言語として  を作成した。

同じくカール・ヒューイットが設計したアクタ言語  (-73) も複雑な機構を持っていたため、 による実装が存在したものの、その動作の仕組みを理解するのは困難であった。サスマン及びガイ・スティール・ジュニアは  を理解するために、不要な機能を省いた  構文を持つ小さな  を設計した。

上記の  からその小さな  の設計に至る過程は  から  及び  へ至る過程を彷彿とさせるものであったため、その言語は （計画する者）及び （策略を巡らす者）の次という意味で当初 （陰謀を企てる者）と名付けられた。しかし、当時のオペレーティングシステムのファイルシステムの制限からファイル名が6文字に切られたことから  という名前が使われるようになった。

## 機能
### 静的スコープ

マッカーシーが1979年に回顧で、1960年の最初のLISP（LISP I）に関して「In modern terminology, lexical scoping was wanted, and dynamic scoping was obtained.」と書いているように、本来意図していた挙動は、静的スコープであった。動的スコープは、意図していたものではなかったため、FUNARG機構を導入して対処されたが、これは言語のスコープルールを静的にするのではなく、クロージャーを意図したように機能させるための部分的な修正であった。なお、動的スコープ自体は有用性が認められたため後のLispにも機能として残ることとなったが、これらの対処について、1962年の LISP 1.5 も1960年代後半の Maclisp もスコープの変数束縛に関しては色々と不完全だったとする意見もある。

ガイ・スティールは、1962年の LISP 1.5 からの変更点として最初に静的スコープの採用と実装を挙げており、サスマンが静的スコープを実装したALGOL 60に関して持っていた興味からによるもので、ALGOLの直接の影響だと述べている。
なお、Scheme開発のきっかけとなったPlasmaも挙動としてはレキシカルスコープといえるが、Plasmaからの影響についての記述はない。

funarg問題としてLISPの初期から既に認識され議論されていたことでもあり、ALGOLとの融合が試みられた1964年のLISP 2でも静的スコープが採用されていたりと、必ずしも1975年のSchemeから始まったとは言えないが、Scheme以後のLISP方言に静的スコープが広まったのはSchemeからの影響と言ってよく、殊にCommon Lispは特筆される。

### 継続
#### <code>call-with-current-continuation</code>
 は``（略称：`call/cc`）と呼ばれるピーター・ランディンやジョン・レイノルズに始まる脱出オペレータの命令を提供する。

## 言語仕様
 の言語仕様はIEEEによって公式に定められ、その仕様は「」と呼ばれている。2016年現在広く実装されているものは改訂第五版に当たるR5RS（1998年）である。

なお、2007年9月に「」が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。R5RSまでは小さな言語仕様に対してのこだわりが見られたが、 サポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。しかし、多くの機能が盛り込まれたにもかかわらず細部の練りこみが不十分であるといった批判もあり、非公式にR5RSを拡張する形でERR5RS () という規格を検討する党派も現れている。

2009年8月、 言語運営委員会は、 を大規模バージョンと、大規模バージョンのサブセットとなる小さな言語仕様のふたつの言語に分割することを推奨する意向を発表した。

2013年7月、「」 () が成立した。

### 仕様の決定

## 実装
 の仕様書はR5RSだと50ページにも満たないため、かなりの数の実装が存在する。

* - 高速な実行ファイルを作るコンパイラ。
* -  による実装。ブラウザ上で動作する。
* - もと商用だったが、現在はオープンソースの高速な実装。
* - 可搬性の高い実用的コンパイラ。
* - インタプリタ。多言語への対応、 を発展させた（メタ）オブジェクトシステムを持つ。
*（英語版） - Schemeインタプリタ及びScheme→Cコンパイラ。
* -  の公式な拡張用言語。 を元にしている。
*
*
*
* -  アプリケーション組み込み用のドライバ
* - プロジェクトのひとつ。 プログラムを  仮想機械用にコンパイル可能。
* - IA-32、 の機械語を出力。IEEE/ANSI、R5RS、ERR5RS, R6RS準拠。
* -  用の実装。無料。
* - x86アーキテクチャ用の  実装。無料。
*Mosh  - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。
*
* -  用の実装。
* - 旧称 。教育用の豪華な開発環境、柔軟なシステムで広く使われる。
*
*
*
* -  拡張による（並列）。
* - アプリケーション組み込みを目的としたR5RS準拠の実装。uimで使用されている。
* - 。 仮想機械上で動作するR5RS準拠の実装。 オブジェクトを  上から利用することが可能。
* - 非常に小さい実装。などでも走る。正規表現やソケット通信もサポート。
* -  用の実装。
* - R6RSに準拠するリアルタイムアプリケーション向けの実装。

### SRFI（サーフィ）
 は言語機能を必要十分の最低限まで単純化することを目指した言語である。そのため仕様書が簡素な反面、実用に際して各種のライブラリが乱立し、移植性が問題になっていた。そこで実装間の統一をとるため、コミュニティ内の議論を集約しているのが「」である。 ではライブラリ仕様、言語拡張仕様などがインデックス化されており、 準拠の実装系は「◯◯に準拠」といった形で利用者の便宜を図ることができる。

なお、 では言語機能とライブラリ機能は分けて考えられているため、 と  言語仕様のコミュニティは原則分離している。

## 応用
 はしばしば他のアプリケーションの拡張用言語として使われる。代表的なアプリケーションには以下のようなものがある。
* の 
*uim
*

より専門的な応用としては、映画ファイナルファンタジーのために3Dレンダリングエンジンに  インタプリタを組み込んだ例や、リトルウイングのピンボールコンストラクションシステムの記述に  を使った例がある。

 用の  では、 コンパイラである  を使って仮想マシン用のバイトコードを生成している。

## 出典
### ラムダ論文一覧
 が発表された一連の論文は、ラムダ論文と呼ばれている。

### 参考文献
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
*  和訳

## 脚注
### 注釈

### 出典

## 関連項目
*アクターモデル
*継続
*末尾再帰
*
*計算機プログラムの構造と解釈 -  を用いた計算機科学分野の古典的な教科書。

## 外部リンク

*<code>schemers.org</code>
*<code>R6RS.org</code>
*
*プログラミング言語 
*R5RS
*R5RS日本語版
*
*独習  三週間
*
*もうひとつの Scheme 入門