Schemeプログラミング
Scheme(スキーム)は、関数型プログラミング言語の一つであり、Lispの方言の一つで、1950年代から存在している古い言語となる。
Schemeプログラミングの特徴は以下のようになる。
- シンプルで一貫性のある構文: Schemeはシンプルな構文を持ち、コンパクトで読みやすいプログラムを書くことができる。Lispファミリーの言語に共通する括弧による式のグループ化が特徴的なものとなる
- 強力な手続き型プログラミング: Schemeは手続き(関数)を第一級のオブジェクトとして扱うことができる。これにより、高階関数(関数を引数として受け取ったり、戻り値として返したりする関数)やクロージャ(環境と共に束縛された関数)など、柔軟なプログラミングスタイルを実現可能となる。
- 再帰的なデータ構造の操作: Schemeは再帰的なデータ構造(リストや木構造など)の操作に適しており、再帰関数を使ってデータ構造を走査し、効率的かつ柔軟なアルゴリズムを実装することができる。
- 動的型付け: Schemeは”プログラミングにおける静的型付け/動的型付け言語の違い“でも述べているような動的型付けの言語であり、変数の型を宣言する必要がない。これにより、柔軟性が高く、プログラムの記述が簡潔になる。ただし、動的な型チェックによるエラーの可能性があるため、注意が必要となる。
- 強力なマクロシステム: Schemeは強力なマクロシステムを持っており、プログラムの構文を拡張したり、独自のDSL(Domain-Specific Language)を作成したりすることができる。これにより、より高度な抽象化や自動化が可能となる。
- 安定した仕様と実装: Schemeには「RnRS(Revised^n Report on the Algorithmic Language Scheme)」という標準仕様があり、さまざまな実装が存在する。これにより、異なる実装間での互換性が高く、安定したプログラムの開発が可能となる。
代表的なSchemeの実装としては、MIT Scheme、GNU Guile、Racketなどがあり、教育や研究の分野で広く使用されるだけでなく、実用的なプログラムの開発にも適している言語となる。
実装例
Schemeプログラミングの実装は、以下のようになる。
Hello World:
(display "Hello, World!")
(newline)
帰的な階乗関数の定義:
(define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
(display (factorial 5))
(newline)
リストの要素を合計する手続きの定義:
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
(display (sum-list '(1 2 3 4 5)))
(newline)
高階関数の使用例として、リストの各要素を2倍にする手続きの定義:
(define (double-each lst)
(map (lambda (x) (* x 2)) lst))
(display (double-each '(1 2 3 4 5)))
(newline)
クロージャを使用して、カウンタを実現する手続きの定義:
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define counter (make-counter))
(display (counter)) ; 1
(newline)
(display (counter)) ; 2
(newline)
schemeプログラミングが活用される領域
Schemeプログラミングは、以下のような領域で活用されている。
- 教育: Schemeはシンプルで一貫性のある構文を持ち、関数型プログラミングの基礎を学ぶのに適している。Schemeは学術的なコンピュータサイエンスの教育やプログラミング入門の授業で広く使用されている。
- 研究: Schemeは抽象化や自動化の強力な手段として使われることがある。Schemeのマクロシステムを活用して、新しいプログラミング言語の特性や機能を実験するために使用されることがあり、また、Schemeは関数型プログラミングの概念やアルゴリズムの研究にも適している。
- プログラムのプロトタイピング: Schemeのシンプルな構文と強力な手続き型プログラミングの特性により、アイデアの検証やプログラムのプロトタイピングに適している。素早く実験的なコードを書き、動作を確認することができる。
- スクリプト言語としての使用: Schemeはコマンドラインツールやスクリプトとして使用されることもある。簡単なタスクや自動化のために、Schemeを利用してスクリプトを作成することができる。
- 小規模な組み込みシステム: Schemeはコンパクトであるため、リソースの制限がある組み込みシステムやエンベデッドシステムでの使用に適している。特にR7RS(Revised^7 Report on the Algorithmic Language Scheme)に基づく小さな実装がある。
ただし、一般的なアプリケーション開発や大規模な商用プロジェクトにおいては、Schemeが主要なプログラミング言語として選ばれることは比較的少なく、より一般的な用途には、より一般的な言語(Java、Python、C++など)がより広く使われている。
The Little Schemer
「The Little Schemer」より。

「The Little Schemer」とは、Daniel P. FriedmanとMatthias Felleisenによって書かれた、Schemeプログラミング言語の教育書となる。この本は、リスト構造や再帰的な関数など、基本的なコンピュータサイエンスの概念を、独特な問いかけと答えの形式で教えてくれる。
この本は、読者がSchemeのコードを書く前に、簡単な問題を解くための小さなステップを提供する。そして、その解決策を通じて、読者はSchemeのプログラム作成に必要な考え方を学ぶ。
この本は、プログラミング言語に慣れ親しんでいる人でも、新しいプログラミング言語を学ぶ前に読む価値がある。また、プログラミング初心者にも、コンピュータサイエンスの基本的な概念を習得するための良い入門書となっている。
本書の続編として「The Seasoned Schemer」がある。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続く。
内容としては、再帰と無名関数、λ関数にYコンビネーターそして簡単なインタープリタへと続く。
「コンピュータについて考えることは、人間の心ができる最もエキサイティングなことの一つである」という考え方は、『The Little Schemer』(旧称『The Little LISPer』)とその新しい姉妹編である『The Seasoned Schemer』を、LISPに関する他の書籍とは一線を画すものにしています。抽象的な概念をユーモラスで理解しやすい方法で提示しているため、著者のテーマに対する熱意が伝わってきます。この本を読めば、コンピュータとは何かを知りたいと思っている人に、新しい思考の扉を開くことができるでしょう。The Little Schemer』では、コンピュータを、小学校や高校で習う算数や代数の延長線上にあるものとして紹介しています。プログラムを再帰関数として紹介し、コンピュータができることの限界についても簡単に触れています。著者は、これらの抽象的なアイデアを説明するために、Schemeというプログラミング言語と面白い食べ物を使っています。The Seasoned Schemer』では、値としての関数、状態の変化、例外的なケースなど、計算機のさらなる側面を読者に伝えています。The Little LISPer』は、LISPの入門書として長年親しまれてきました。フランス語や日本語でも出版されています。The Little Schemer』と『The Seasoned Schemer』は、その後継書にふさわしく、Schemeコースの教科書として、またComputer Scienceの完全な入門コースのコンパニオン・テキストとしても、同様に人気を博すことでしょう。」
以下目次を示す。
1. Toys 2. Do it, Do it Again, and Again, and Again 3. Cons the Magnificent 4. Number Games 5. *Oh My Gawd: It7s Full of Stars 6. Shadows 7. Friend and Relations 8. Lambda the Ultimate 9. and Again, and Again,... 10. What is the value of All of This?
Schemaを使ってみる
MacでSchemeを使うためには、Scheme処理系のインストールが必要になる。これはHomebrewを使ってインストールすることができます。ターミナルを開いて、以下のコマンドを実行する。
>brew install mit-scheme
これにより、MIT/GNU Schemeがインストールされ。次にテキストエディタを用いてコードを書く。”ITインフラストラクチャ技術“のTEXT EDITORの項に様々なテキストエディタの紹介をしてあるので、それらを参考のこと。
次にREPLを起動する。REPLは、Schemeのインタラクティブな実行環境となる。REPLを起動するには、ターミナルで scheme コマンドを実行すればよい。これにより、Scheme処理系が起動し、REPLが開始される。REPLでは、Schemeの式を入力して、すぐに結果を確認することができる。
テキストエディタで作成したコードファイルの実行は、ターミナルで scheme < filename コマンドを実行することで行う。
以下に簡単なHello Worldのコードを参考までに記載する。これらはREPLでの確認のものとなる。
まずdisplay手続きを使用するものは以下のコードを実行する。
> (display "Hello World!")
Hello World!
次にprint手続きを使用するケースは以下のようになる。
> (print "Hello World!")
"Hello World!"
さらに詳細の実装は「The Little Schemer」を参照のこと。

Chinoba
Intelligence as Relationship
Research Platform
founded by
Masao Watanabe
AI Systems Architecture
Decision Trace
Human–AI Coordination
Algorithmic Governance
Related Research
この記事は Chinoba Knowledge Base の一部です。

コメント
[…] Schema(LISPの派生語)による関数型プログラミングに関する図書であり、以前述べた「The Little Shema」や「The Seasoned Schemer」の続編となる。「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書でもある。 […]
[…] schema(LISPの派生語)による関数型プログラミングに関する図書であり、前編となる「The Little Schemer」から続くものとなる。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続くものでもある。 […]
[…] The Little Schemer LISPの派生語であるSchemaによる関数型言語の教科書 […]