Scheme実行環境 - オンラインPlayground
プログラミングツールコードを入力して「実行する」ボタンを押すと、実行結果がすぐに表示されます。
結果:
Schemeプログラミング入門
基本構文
Schemeは前置記法(ポーランド記法)を使用し、演算子がオペランドの前に来て、すべてが括弧で囲まれます。
コード例
上のPlaygroundでこれらの例を試してみてください。「実行する」ボタンで結果が表示されます。
算術演算
基本的な四則演算。演算子は複数の引数を取れます。
(+ 1 2 3) ; => 6
(* 4 5) ; => 20
(- 10 3) ; => 7
(/ 15 3) ; => 5変数
defineで値に名前を束縛します。
(define x 42)
(define name "hello")
x ; => 42関数
(define (名前 引数...) 本体) で関数を定義します。
(define (square x)
(* x x))
(square 5) ; => 25条件分岐
単純な条件にはif、複数の分岐にはcondを使います。
(if (> 3 2)
"yes"
"no") ; => "yes"
(cond
((< x 0) "negative")
((= x 0) "zero")
(else "positive"))リスト
リストは基本的なデータ構造です。carは先頭要素、cdrは残りを返します。
(list 1 2 3) ; => (1 2 3)
(car '(1 2 3)) ; => 1
(cdr '(1 2 3)) ; => (2 3)
(cons 0 '(1 2)) ; => (0 1 2)ラムダ(無名関数)
Lambdaは名前のない関数を作ります。mapやfilterなどの関数型プログラミングパターンに不可欠です。
; 無名関数
((lambda (x) (* x x)) 5) ; => 25
; lambdaを変数に束縛
(define double
(lambda (x) (* x 2)))
(double 7) ; => 14
; 高階関数
(map (lambda (x) (+ x 1))
'(1 2 3)) ; => (2 3 4)再帰
Schemeではループの代わりに再帰を多用します。
(define (fibonacci n)
(if (<= n 1)
n
(+ (fibonacci (- n 1))
(fibonacci (- n 2)))))
(fibonacci 10) ; => 55重要なコンセプト
- すべてが式 — if文やdefineを含め、Schemeのすべてのコードは値を返します。
- 第一級関数 — 関数は引数として渡したり、戻り値として返したり、変数に格納したりできます。
- 末尾呼び出し最適化 — Schemeは末尾再帰関数が一定のスタック領域で動作することを保証しており、再帰がループと同等の効率で実行されます。
- レキシカルスコープ — 変数は呼び出し時ではなく、定義された環境で解決されます。
- ミニマリスト設計 — Schemeの特殊形式は非常に少なく、ほとんどの機能が少数のプリミティブから構築されています。
用語集
- Scheme
- Scheme(スキーム)は1975年にMITのGuy L. SteeleとGerald Jay Sussmanによって作られたLispファミリーのプログラミング言語です。クリーンでミニマリストな設計で知られ、計算機科学の教育で広く使われています。
- S式
- S式(シンボリック式)はLisp系言語の基本的な構文単位です。アトム(数値やシンボル)か、括弧で囲まれたS式のリスト(例:(+ 1 2))のいずれかです。
- ラムダ(Lambda)
- ラムダは無名(名前のない)関数を作ります。例えば (lambda (x) (* x x)) は引数を二乗する関数を作ります。名前は関数型プログラミングの数学的基盤であるラムダ計算に由来します。
- 末尾呼び出し最適化
- 末尾呼び出し最適化(TCO)は、末尾位置にある関数呼び出しで現在のスタックフレームを再利用する技術です。これにより再帰関数がコールスタックを増やさずに実行でき、スタックオーバーフローを防止します。
- SICP
- 「計算機プログラムの構造と解釈」はHarold AbelsonとGerald Jay Sussmanによる伝説的な教科書です。MITで使用され、Schemeを使って基本的なプログラミングの概念を教えます。オンラインで無料公開されています。 SICPを購入する
- LIPSインタプリタ
- このPlaygroundではLIPS(Lisp In Parentheses Syntax)というJavaScriptで書かれたSchemeインタプリタを使用しています。R7RS Schemeの主要な機能をサポートし、完全にブラウザ上で動作します。
よくある質問
- Q: SchemeとCommon Lispの違いは?
- A: Schemeは単一の名前空間と末尾呼び出し最適化の保証を持つミニマリスト言語です。Common Lispは関数と変数で別の名前空間を持ち、より大規模な標準ライブラリを備えています。Schemeはエレガンスとシンプルさを重視しています。
- Q: なぜ括弧がこんなに多いのですか?
- A: Schemeの括弧はコードの構造(S式)を定義します。この統一的な構文により、言語のパースが容易になり、マクロによる強力なメタプログラミングが可能になります。多くのエディタには自動マッチング機能があり、管理しやすくなっています。
- Q: Schemeは今でも使われていますか?
- A: はい。Schemeは計算機科学の教育で広く使われています(名著SICPなど)。Schemeの派生言語であるRacketは活発に開発されており、Guile SchemeはGNUソフトウェアの拡張言語として使われています。
- Q: コードはサーバーで実行されますか?
- A: いいえ。すべてのコードはLIPS Schemeインタプリタ(JavaScript製)を使ってブラウザ上で完全に実行されます。サーバーには一切送信されません。