The Seasoned Schemer

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 機械学習 自然言語処理技術 推論技術 セマンティックウェブ技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 プログラミング言語 LISPと派生言語 本ブログのナビ

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 Seasoned Schemer

The Seasoned Schemer」より。

“The Seasoned Schemer”は、Daniel P. FriedmanとMatthias Felleisenによって書かれた、Schemeプログラミングの中級者向けの書籍となる。

この書籍は、Schemeに関する知識を深めるための短いパズルやエクササイズを提供している。また、プログラミングにおける重要な概念や、Schemeにおける関数型プログラミングのテクニックについても解説している。

“The Seasoned Schemer”の特徴は、シンプルでわかりやすい問題設定にある。各問題には、正しい答えがあるわけではなく、答えが複数あることが多いため、読者は自分なりの解法を見つけ出す必要がある。

この書籍は、”The Little Schemer“と同様に、S-expressionを使ってSchemeのプログラムを記述することを前提としている。また、関数型プログラミングのテクニックについても詳しく解説しているため、関数型プログラミングの初心者にもおすすめの一冊となる。

また本書は、以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続くものでもある。

「コンピュータについて考えることは、人間の心ができる最もエキサイティングなことの一つである」という考え方は、『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の完全な入門コースのコンパニオン・テキストとしても、同様に人気を博すことでしょう。」

内容は以下のようになる。

11. Welcome Back to the Show 
12. Take Cover
13. Hop, Skip, and1 Jump
14. Let There Be Names
15. The Difference Between Men and Boys... 
16. Ready, Set, Bang!
17. We Change, Therefore We Are!
18. We Change, Therefore We Are the Same!
19. Absconding with the Jewels
20. What's in Store?
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 Seasoned Schemer」を参照のこと。

コメント

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

  2. […] Little Shema」や「The Seasoned Schemer」の続編となる。「Clojure […]

  3. […] The Seasoned Schemer The Little Schemerの続編 […]

タイトルとURLをコピーしました