[EDA][SKILL] SKILL for the Skilled: Introduction to Classes -- Part 1
By Jim Newton on August 15, 2011
(この記事は、SKILL for the Skilled: Introduction to Classes -- Part 1の超訳です。)
これまでの"SKILL for the Skilled"シリーズでは、SKILL++の特徴を見てきた。例えば、局所定義関数、高階関数、レキシカルスコーピングである。しかし、まだSKILL++のオブジェクトシステムについては、説明していない。これはSKILLアプリをオブジェクト指向風に実装する標準的な方法である。
Object Orientation -- オブジェクト指向 --
オブジェクトシステムとは、プログラマがオブジェクトグループの特性や振る舞いを制御するための手法である。ある種の問題は、この方法を使用することで簡単に解くことができる。
もし、C++, Javaや他の言語に詳しければ、C++/Javaなどのオブジェクト指向と同じように考えてしまうかもしれない。私は、そのような限定的な誤ったコンセプトは捨てて欲しい、と思っている。1970年代に言語にオブジェクト指向を取り入れた最初の言語の一つとして、Lispがある。これは、C++やJavaが現れるよりも以前のことである。SKILL++のオブジェクトシステムは、Lispのアプローチを基にしている。今後の記事で、SKILLのオブジェクトの指向の強力さやエレガントさに気づいてもらえるはずだ。
The SKILL++ Object System -- SKILL++でのオブジェクトシステム --
SKILL++は、オブジェクトシステムに動的性とリフレクションを加えようとした。これは、実行中のVMイメージに対して、クラスやメソッドを加えることができたり、それらの内部を調査・デバッグしたり、編集・再定義できたりすることを意味している。SKILL++を知れば知るほど、動的オブジェクト指向言語の強力さに驚くだろう。
SKILL++オブジェクトシステムについて、一言で説明すると、SKILLプログラマが構造や定義・振る舞いを共有するためにオブジェクトのクラスを定義することである。クラスは、インスタンスがどのように構造化されるか、を定義したものである。それに対して、総称関数におけるメソッドは、クラスから生成したインスタンスがどのように振る舞い、相互に影響を及ぼすか、と言うのを定義している。
SKILL++オブジェクトシステムは、上記のようなクラスとメソッドを実現することができる。そして、プログラマはクラスとメソッドが独立に作用するのか、それとも相互に影響を及ぼしあうものにするか、選択することができる。つまり、クラスやインスタンスを理解するために、総称関数やメソッドを理解する必要はない、ということである。次からのシリーズで、数独パズルを解くためにクラスをツールとして使用する方法を説明する。
The Sudoku puzzle -- 数独パズル --
まず、数独パズルとは何であろうか? 数独パズルは、9x9のグリッドに分割されたマス目を3x3で9つにグループ化したものを使う。空いたマス目には、{1, 2, 3, 4, 5, 6, 7, 8, 9}のいずれかを、縦、横、そして3x3のブロック内に一つだけ配置する。この暗黙のルールにより、縦、横、3x3のブロック内には、1-9が一度しか現れない。
Sudoku in SKILL++ -- SKILL++での数独
では、下の例のように数独パズルを解くSKILL関数SkuSolveを実装していこう。この例は、Wikipediaの数独のエントリから採ってきたものだ。
SkuSolve、並びにサポート関数を実装できたら、下の例のように、数独パズルを解くことができるだろう。
(SkuSolve '((5 3 ? ? 7 ? ? ? ?) (6 ? ? 1 9 5 ? ? ?) (? 9 8 ? ? ? ? 6 ?) (8 ? ? ? 6 ? ? ? 3) (4 ? ? 8 ? 3 ? ? 1) (7 ? ? ? 2 ? ? ? 6) (? 6 ? ? ? ? 2 8 ?) (? ? ? 4 1 9 ? ? 5) (? ? ? ? 8 ? ? 7 9)))
この問題に対して、次のように出力されるプログラムである。
starting with:
5 | 3 | 7 | ||||||
6 | 1 | 9 | 5 | |||||
9 | 8 | 6 | ||||||
8 | 6 | 3 | ||||||
4 | 8 | 3 | 1 | |||||
7 | 2 | 6 | ||||||
6 | 2 | 8 | ||||||
4 | 1 | 9 | 5 | |||||
8 | 7 | 9 |
found solution:
5 | 3 | 4 | 6 | 7 | 8 | 9 | 1 | 2 |
6 | 7 | 2 | 1 | 9 | 5 | 3 | 4 | 8 |
1 | 9 | 8 | 3 | 4 | 2 | 5 | 6 | 7 |
8 | 5 | 9 | 7 | 6 | 1 | 4 | 2 | 3 |
4 | 2 | 6 | 8 | 5 | 3 | 7 | 9 | 1 |
7 | 1 | 3 | 9 | 2 | 4 | 8 | 5 | 6 |
9 | 6 | 1 | 5 | 3 | 7 | 2 | 8 | 4 |
2 | 8 | 7 | 4 | 1 | 9 | 6 | 3 | 5 |
3 | 4 | 5 | 2 | 8 | 6 | 1 | 7 | 9 |