コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
Wikippe
検索
検索
表示
ログイン
個人用ツール
ログイン
Schemeのソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
Scheme
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
{{otheruses2|プログラミング言語|その他の語句|スキーム|スキーマ}} {{Infobox プログラミング言語 |名前=Scheme |ロゴ=[[ファイル:Lambda lc.svg|100px]] |パラダイム=[[マルチパラダイムプログラミング言語|マルチパラダイム]] |released=1975年<ref>{{Cite journal |author={{lang|en|Gerald J. Sussman}}, {{lang|en|Guy L. Steele Jr.}} |title={{lang|en|Scheme: An interpreter for extended lambda calculus}} |journal={{lang|en|MIT AI Memo 349}} |volume= |issue= |year=1975 |month=December |publisher={{lang|en|Massachusetts Institute of Technology}} |pages= }}</ref> |設計者=[[ガイ・スティール|ガイ・L・スティール]]、[[ジェラルド・ジェイ・サスマン]] |型付け=強い、[[動的型付け]] |処理系=[[Gauche]], [[Racket]], [[MIT/GNU Scheme]], [[Scheme 48]], [[GNU Guile|Guile]], [[Chez Scheme]] |影響を受けた言語=Plasma, Conniver, Planner, [[ALGOL|ALGOL 60]], [[Lisp]] }} '''Scheme'''(スキーム)は構文スコープを持つ[[LISP]]の方言の一つである<ref>Schemeは構文スコープを持つ初めてのLISP方言である。</ref>。 LISP系統の言語としては[[Common Lisp]]と並んで現在でもよく使われている。 言語仕様の小ささとその出自からプログラミングの教育分野でもよく使われている。 ==概要== Schemeは、[[マサチューセッツ工科大学]]の人工知能研究所において[[カール・ヒューイット]]の設計したアクタ言語Plasma (Planner-73) の動作を理解するために、[[アロンゾ・チャーチ]]のλ計算を基盤に持つLISP方言として、カール・ヒューイットの学生であった[[ジェラルド・ジェイ・サスマン]]と[[ガイ・スティール]]によって1975年頃に設計された。 [[アクターモデル|アクタ]]を言語に導入するにあたって採用されたALGOL 60由来の構文スコープは、状態を持つデータであるアクタ([[クロージャ]]<ref>{{lang-en-short|closure}}</ref>)の実現以外にも、<code>lambda</code> 構文を用いた'''[[λ計算]]'''<ref>{{lang-en-short|lambda calculus}}</ref>や'''[[末尾再帰]]'''<ref>{{lang-en-short|tail-recursion}}</ref>の最適化に不可欠な機構であった。 また、プログラムの制御理論から当時出てきた'''継続'''<ref>{{lang-en-short|continuation}}</ref>及びアクタ理論におけるアクタへの'''メッセージ渡し'''<ref>{{lang-en-short|message passing}}</ref>の概念から触発された'''継続渡し形式'''<ref>{{lang-en-short|continuation passing style}}、CPS</ref><ref>継続渡し形式は一連のλ論文において導入された。ただし、体系として確立されてはいないものの、同様の手法は「{{lang|en|{{Citation|author=John C. Reynolds|year=1972|title=Denitional Interpreters for Higher-Order Programming Languages|url=http://cs.au.dk/~hosc/local/HOSC-11-4-pp363-397.pdf}}}}」にもみられる。</ref>と呼ばれるプログラミング手法は以後の継続の研究に大きな影響を与えた。 ==歴史== [[MIT人工知能研究所]]においては以下のとおりLISPに始まるいくつかの言語が作られた。 {| class=wikitable !年!!言語!!作者 |- |1958年||LISP||マッカーシー、他 |- |1964年||Meteor||ボブロウ |- |1969年||Convert||ガズマン |- |1969年||Planner||ヒューイット |- |1970年||Muddle||サスマン、ヒューイット、他 |- |1971年||Micro-Planner||サスマン、他 |- |1972年||Conniver||サスマン、他 |- |1973年||Plasma||ヒューイット、他 |- |1975年||Schemer||サスマン、スティール |} この中でカール・ヒューイットが設計した規則ベースの言語Plannerはあまりに複雑な機構を持っていたため実装されなかった。サスマン等はそれを使いやすい言語Micro-Planner、Conniverとして実現した。 同じくカール・ヒューイットが設計したアクタ言語Plasma (Planner-73) も複雑な機構を持っていたため、MacLispによる実装が存在したものの、その動作の仕組みを理解するのは困難であった。サスマン及びガイ・スティールはPlasmaを理解するために、不要な機能を省いたLISP構文を持つ小さなPlasmaを設計した。 上記のPlasmaからその小さなPlasmaの設計に至る過程はPlannerからMicro-Planner及びConniverへ至る過程を彷彿とさせるものであったため、その言語はPlanner(計画する者)及びConniver(策略を巡らす者)の次という意味で当初Schemer(陰謀を企てる者)と名付けられた。しかし、当時のオペレーティングシステムのファイルシステムの制限からファイル名が6文字に切られたことからSchemeという名前が使われるようになった。 ==機能== ===構文スコープ=== Scheme以前のLISP方言では変数束縛が実行履歴を元に決定される[[動的スコープ]]が採用されていたが、Schemeでは変数の意味が構文的に定まるという'''[[構文スコープ]]'''をLISP方言として当時初めて採用した。構文スコープは'''環境'''の機構により実現される。 Algol 60からの直接の影響はこの構文スコープである<ref>「Scheme 過去◇現在◇未来 前編」より</ref>。構文スコープは後にSchemeからの影響を受けた形でCommon Lispにも採用されたと言われる。 ===継続=== ====<code>call/cc</code>==== Schemeは<code>call-with-current-continuation</code>(略称:<code>call/cc</code>)と呼ばれる<ref>当初は <code>CATCH</code> という名称であった。</ref>ピーター・ランディンやジョン・レイノルズに始まる脱出オペレータ<ref>{{lang-en-short|escape operator}}</ref>の命令を提供する。 ==言語仕様== Schemeの言語仕様は[[IEEE]]によって公式に定められ<ref name="ieee1178">{{lang|en|1178-1990 (Reaff 2008) IEEE Standard for the Scheme Programming Language. IEEE part number STDPD14209, [http://standards.ieee.org/board/rev/308minutes.html unanimously reaffirmed] at a meeting of the IEEE-SA Standards Board Standards Review Committee (RevCom), March 26, 2008 (item 6.3 on minutes), reaffirmation minutes accessed October 2009. NOTE: this document is only available for purchase from IEEE and is not available online at the time of writing (2009).}}</ref>、その仕様は「{{lang|en|Revised<sup>n</sup> Report on the Algorithmic Language Scheme (R''n''RS)}}」と呼ばれている。現在広く実装されているものは改訂第五版に当たるR5RS(1998年)である。 LISP系言語はSchemeとCommon Lispを二大潮流とするが、提案された機能を原則全て導入するCommon Lispに対して、成員の全員一致を原則とするSchemeという特徴を持っている。 なお、2007年9月に「{{lang|en|The Revised<sup>6</sup> Report on the Algorithmic Language Scheme (R6RS)}}」<ref>{{Cite web |author=Michael Sperber ほか |url=http://www.r6rs.org/ |title={{lang|en|The Revised<sup>6</sup> Report on the Algorithmic Language Scheme}} |language=英語 |accessdate=2009-02-02 }}</ref>が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。R5RSまでは小さな言語仕様に対してのこだわりが見られたが、Unicodeサポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。しかし、多くの機能が盛り込まれたにもかかわらず細部の練りこみが不十分であるといった批判もあり、非公式にR5RSを拡張する形でERR5RS (Extended R5RS Scheme) という規格を検討する党派も現れている。 2009年8月、Scheme言語運営委員会は、Schemeを大規模バージョンと、大規模バージョンのサブセットとなる小さな言語仕様の2つの言語に分割することを推奨する意向を発表した<ref>{{Cite web |url=http://scheme-reports.org/2009/position-statement.html |title={{lang|en|Position statement}} |language=英語 |accessdate=2013-12-16 }}</ref>。 2013年7月、「{{lang|en|The Revised<sup>7</sup> Report on the Algorithmic Language Scheme (R7RS)}}」<ref>{{Cite web |url=http://trac.sacrideo.us/wg/wiki |title={{lang|en|Scheme Working Groups}} |language=英語 |accessdate=2013-12-16 }}</ref> (small language) が成立した。 ===仕様の決定=== {{節stub}} ==実装== Schemeの仕様書はR5RSだと50ページにも満たないため、かなりの数の実装が存在する。 *[http://www-sop.inria.fr/mimosa/fp/Bigloo/ Bigloo] - 高速な実行ファイルを作るコンパイラ。 *[http://www.biwascheme.org/ BiwaScheme] - [[JavaScript]]による実装。ブラウザ上で動作する。 *[http://www.scheme.com/ Chez Scheme] - 商用の高速な実装。 *[[Chicken (Scheme)|Chicken]] - 可搬性の高い実用的コンパイラ。 *[[Gauche]] - インタプリタ。多言語への対応、STklosを発展させた(メタ)オブジェクトシステムを持つ。 *[[GNU Guile]] - [[GNU]]の公式な拡張用言語。Schemeを元にしている。 *[http://hscheme.sourceforge.net/ HScheme] *[http://www.codeplex.com/IronScheme IronScheme] *[http://www.norvig.com/jscheme.html Jscheme] *[http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/jakld/index-j.html jakld] - [[Java]]アプリケーション組み込み用のLISPドライバ *[http://www.gnu.org/software/kawa/ Kawa] - GNUプロジェクトのひとつ。SchemeプログラムをJava仮想機械用にコンパイル可能。 *[http://www.larcenists.org/ Larceny] - [[IA-32]], [[SPARC]]のネイティブコードを出力。IEEE/ANSI, R5RS, ERR5RS, R6RS準拠。 *[http://www.lispme.de/ LispMe] - [[Palm OS]]用の実装。無料。 *[http://www.swiss.ai.mit.edu/projects/scheme/ MIT Scheme] - [[x86]]アーキテクチャ用のScheme実装。無料。 *[http://code.google.com/p/mosh-scheme/ Mosh] - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。 *[http://will.iki.fi/software/ocs/ Ocs] *[http://www.mazama.net/scheme/pscheme.htm PocketScheme] - [[Windows CE]]用の実装。 *[[Racket]] - 旧称PLT Scheme。教育用の豪華な開発環境、柔軟なシステムで広く使われる。 *[http://www.sof.ch/dan/qscheme/index-e.html QScheme] *[http://www.kt.rim.or.jp/~qfwfq/rhiz-pi/index.html rhizome/pi] *[http://s48.org/ Scheme48] *[http://www.maroon.dti.ne.jp/nagar17/mulasame/ SECDR-Scheme] - Lispkit Lisp拡張による(並列)Scheme。 *[http://code.google.com/p/sigscheme/ SigScheme] - アプリケーション組み込みを目的としたR5RS準拠の実装。[[uim]]で使用されている。 *[http://sisc-scheme.org/ SISC] - {{lang|en|Second Interpreter of Scheme Code}}。Java仮想機械上で動作するR5RS準拠の実装。JavaオブジェクトをScheme上から利用することが可能。 *[http://tinyscheme.sourceforge.net/ TinyScheme] - 非常に小さい実装。[[ザウルス|Zaurus]]などでも走る。正規表現やソケット通信もサポート。 *[http://code.google.com/p/vx-scheme/ Vx-scheme] - [[VxWorks]]用の実装。 *[http://code.google.com/p/ypsilon/ Ypsilon] - R6RSに準拠するリアルタイムアプリケーション向けの実装。 ===SRFI=== Schemeは言語機能を必要十分の最低限まで単純化することを目指した言語である。そのため仕様書が簡素な反面、実用に際して各種のライブラリが乱立し、移植性が問題になっていた。そこで実装間の統一をとるため、コミュニティ内の議論を集約しているのが「{{lang|en|Scheme Requests for Implementation ([[SRFI]])}}」である。SRFIではライブラリ仕様、言語拡張仕様などがインデックス化されており、SRFI準拠の実装系は「''X''に準拠」といった形で利用者の便宜を図ることができる。 なお、Schemeでは言語機能とライブラリ機能は分けて考えられているため、SRFIとScheme言語仕様のコミュニティは原則分離している。 ==応用== Schemeはしばしば他のアプリケーションの拡張用言語として使われる。代表的なアプリケーションには以下のようなものがある。 * [[GIMP]]のScript-Fu * [[uim]] * [[GNU LilyPond|LilyPond]] より専門的な応用としては、映画[[ファイナルファンタジー (映画)|ファイナルファンタジー]]のために3DレンダリングエンジンにSchemeインタプリタを組み込んだ例<ref>{{cite web |url=http://practical-scheme.net/docs/ILC2002.html |author=川合史朗 |title=Gluing Things Together - Scheme in the Real-time CG Content Production |date=October 2002 |accessdate=2014-06-20 }}</ref>や、[[リトルウイング]]のピンボールコンストラクションシステムの記述にSchmeを使った例<ref>{{cite web |url=http://www.littlewingpinball.com/doc/ja/ypsilon/ |author=藤田善勝 |title=YPSILON |accessdate=2014-06-20 }}</ref>がある。 [[Android]]用の[[App Inventor]]では、SchemeコンパイラであるKawaを使って[[Java仮想マシン|JVM]]用のバイトコードを生成している。 ==出典== ===ラムダ論文一覧=== Schemeが発表された一連の論文は、ラムダ論文と呼ばれている<ref name="readscheme_lambda">{{PDFlink|[http://library.readscheme.org/page1.html Online version of the Lambda Papers]}}</ref>。 {|class=wikitable !年!!題名 |- |nowrap|1975年||{{lang|en|Scheme: An Interpreter for Extended Lambda Calculus}} |- |nowrap|1976年||{{lang|en|Lambda: The Ultimate Imperative}} |- |nowrap|1976年||{{lang|en|Lambda: The Ultimate Declarative}} |- |nowrap|1977年||{{lang|en|Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO}} |- |nowrap|1978年||{{lang|en|The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two)}} |- |nowrap|1978年||{{lang|en|RABBIT: A Compiler for SCHEME}} |- |nowrap|1979年||{{lang|en|Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode}} |- |nowrap|1980年||{{lang|en|Compiler Optimization Based on Viewing LAMBDA as RENAME + GOTO}} |- |nowrap|1980年||{{lang|en|Design of a Lisp-based Processor}} |} ===参考文献=== * {{Citation|author=ガイ・スティール・ジュニア|year=1996|title=Scheme 過去◇現在◇未来 前編・後編|url=http://www010.upp.so-net.ne.jp/okshirai/scheme-20070402222203.txt}} * {{Citation|author=ガイ・スティール・ジュニア|year=2006|title=The History of Scheme|url=http://deptinfo.unice.fr/~roy/JAOO-SchemeHistory-2006public.pdf}} * {{Citation|author=ジェラルド・サスマン、ガイ・スティール・ジュニア|year=1975|title=Scheme: An Interpreter for Extended Lambda Calculus|url=ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf}} * {{Citation|author=ジェラルド・サスマン、ガイ・スティール・ジュニア|year=1976|title=Lambda: The Ultimate Imperative|url=http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-353.pdf}} * {{Citation|author=ガイ・スティール・ジュニア|year=1976|title=Lambda: The Ultimate Declarative|url=http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-379.pdf}} * {{Citation|author=ガイ・スティール・ジュニア|year=1977|title=Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO|url=http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-443.pdf}} * {{Citation|author=ジェラルド・サスマン、ガイ・スティール・ジュニア|year=1978|title=The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two)|url=http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-453.pdf}} * {{Citation|author=ガイ・スティール・ジュニア|year=1978|title=Rabbit: A Compiler for Scheme|url=ftp://publications.ai.mit.edu/ai-publications/pdf/AITR-474.pdf}} * {{Citation|author=ジェラルド・サスマン、ガイ・スティール・ジュニア|year=1979|title=Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode|url=http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-514.pdf}} * {{Citation|author=カール・ヒューイット|year=1967|title=PLANNER A Language for Proving Theorem|url=http://dspace.mit.edu/bitstream/handle/1721.1/6144/AIM-137.pdf}} * {{Citation|author=ジェラルド・サスマン、テリー・ビノグラード|year=1970|title=Micro-Planner Reference Manual|url=http://dspace.mit.edu/bitstream/handle/1721.1/5833/AIM-203.pdf}} * {{Citation|author=V・マクダモット、ジェラルド・サスマン|year=1972|title=The CONNIVER Reference Manual|url=http://dspace.mit.edu/bitstream/handle/1721.1/6204/AIM-259a.pdf}} * {{Citation|author=アイリーン・グライフ、カール・ヒューイット|year=1974|title=Actor Semantics of PLANNER-73|url=http://dspace.mit.edu/bitstream/handle/1721.1/41116/AI_WP_081.pdf}} * {{Citation|author=ピーター・J・ランディン|year=1965|title=A Generalization of Jumps and Labels|url=http://mirrors.csl.sri.com/www.brics.dk/%257Ehosc/local/HOSC-11-2-pp125-143.pdf}} * {{Citation|author=ヘイヨー・シーレッケ|year=1998|title=An Introduction to Landin’s “A Generalization of Jumps and Labels”|url=http://cs.au.dk/~hosc/local/HOSC-11-2-pp117-123.pdf}} * {{Citation|author=ジョン・C・レイノルズ|year=1972|title=Denitional Interpreters for Higher-Order Programming Languages|url=http://cs.au.dk/~hosc/local/HOSC-11-4-pp363-397.pdf}} * {{Citation|author=ジョエル・モーゼス|year=1970|title=The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem|url=http://dspace.mit.edu/bitstream/handle/1721.1/5854/AIM-199.pdf}} [http://kreisel.fam.cx/webmaster/clog/img/www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/p/funarg/funarg.html 和訳] ==脚注== {{Reflist}} ==関連項目== *[[アクターモデル]] *[[継続]] *[[末尾再帰]] *[[SRFI]] ==外部リンク== {{Wikibooks|Scheme|Scheme}} *[http://schemers.org/ <code>schemers.org</code>] *[http://www.r6rs.org/ <code>R6RS.org</code>] *[http://srfi.schemers.org/ {{lang|en|Scheme Requests for Implementation}}] *[http://www.sci.u-toyama.ac.jp/~iwao/Scheme/scheme.html プログラミング言語 Scheme] *[http://www.swiss.ai.mit.edu/~jaffer/r5rs_toc.html R5RS] *[http://www.swiss.ai.mit.edu/~jaffer/r5rsj_toc.html R5RS日本語版] *[http://scheme-punks.cyber-rush.org/wiki/index.php?title=Main_Page SchemePunks] *[http://www.sampou.org/scheme/t-y-scheme/t-y-scheme.html 独習 Scheme 三週間] [[Category:LISP|SCHEME]] [[Category:プログラミング言語]] [[Category:関数型言語]]
このページで使用されているテンプレート:
テンプレート:Citation
(
ソースを閲覧
)
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Infobox プログラミング言語
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Otheruses2
(
ソースを閲覧
)
テンプレート:PDFlink
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:Wikibooks
(
ソースを閲覧
)
テンプレート:節stub
(
ソースを閲覧
)
Scheme
に戻る。
検索
検索
Schemeのソースを表示
話題を追加