The Reasoned 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 Reasoned Schemer

The Reasoned Schemer」より。

“The Reasoned Schemer”は、Daniel P. Friedman、William E. Byrd、Oleg Kiselyovによって書かれた、Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSL論理プログラミング言語であるminiKanrenを使った問題解決の書籍となる。

miniKanrenは、制約論理プログラミングの一種であり、Prologの影響を受けている。miniKanrenを使うことで、問題を制約として表現し、自動的に解決することができる。

“The Reasoned Schemer”では、miniKanrenを使って、制約論理プログラミングによる問題解決の方法を解説している。また、プログラミングにおける重要な概念や、Schemeにおける関数型プログラミングのテクニックについても解説している。

この書籍は、”The Little Shema“や”The Seasoned Schemer“と同様に、S-expressionを使ってSchemeのプログラムを記述することを前提としている。また、miniKanrenを使った制約論理プログラミングについての知識が必要となる。

“The Reasoned Schemer”は、miniKanrenを使った問題解決の手法に興味がある人、あるいはSchemeや関数型プログラミングに詳しい人におすすめの一冊となる。

The Reasoned Schemer』の目的は、関数型プログラマーが論理的に考え、論理型プログラマーが機能的に考えるのを助けることです。The Reasoned Schemer』の著者は、論理プログラミングは関数型プログラミングを自然に拡張したものであると考え、関数型言語であるSchemeを論理的な構造で拡張することで、双方のスタイルの利点を組み合わせていることを示しています。この拡張は、論理プログラミング言語Prologのアイデアのほとんどを内包しています。The Reasoned Schemer』の教育方法は、『The Little Schemer』や『The Seasoned Schemer』に見られるような特徴的なユーモアを交えた質問と回答の連続である。関数型言語や『The Little Schemer』の最初の8章に慣れていることが前提です。ロジック機能を追加するには、新しいフォームを導入する必要があります。著者の目的は、論理プログラムを書くことが、これらのフォームを使って関数型プログラムを書くこととどの程度同じであるかを示すことである。このようにして、『The Reasoned Schemer』の読者は、論理プログラミングがいかに簡単であるか、関係のように振る舞う関数を定義することがいかに簡単であるかを理解するようになります。」

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

1. Playthings 
2. Teaching Old Toys New Tricks
3. Seeing Old Friends in New Ways
4. Double Your Fun
5. Members Only
6. The Fun Never Ends..
7. A Bit Too Mutch
8. Just a Bit More
9. Thin Ice
10. Under The Hood
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 Reasoned Schemer」を参照のこと。

コメント

  1. […] Python, JavaScript, Scala, Ruby, OCaml, and PHPと多様で、刊行されている図書「The Reasoned Schemer」ではSchemeでの紹介で、Clojureではcore.logicで […]

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

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

  4. […] The Reasoned Schemer Schemaによる論理プログミングDSL(miniKanren) […]

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