Smalltalk use: better; episode: #001b ”メタプログラミングへの道”

前の記事記事一覧次の記事
Smalltalk use: better;



episode: 001

メタプログラミングへの道



目標に向かって一段ずつ階段を上っていく上で
いちばん肝心なことは
必ず最初の一段を上るということである
そしてまた次に一段上るということである
Hideo Itokawa - Wikipedia

■ クラスを定義する:メタプログラミング

クラスを定義するために利用者(プログラマー)が行った操作はすべて、プログラム(コードの断片)で再現できます。そこで、Person と同等のクラス Person2 を定義する過程を通して、その理解を深めます。
☞《余録》ツールを使ってクラス/メソッドを定義する

ツールを利用して定義したクラスには、次の記述が見つかります。

Smalltalk defineClass: #Person
	superclass: #{Core.Object}
	indexedType: #none
	private: false
	instanceVariableNames: 'name '
	classInstanceVariableNames: ''
	imports: ''
	category: ''

よく見るとこのクラス定義そのものが「メッセージ式」になっています。つまり、クラスオブジェクト Smalltalk に向けて、あるメッセージを送信しています。ただし、有効なクラスを定義するには、不十分です。というのも、パッケージを指定していないからです。

ワークスペースを開く


メニューから[ツール→ワークスペース]を選択します。すると、新たなワークスペースが現れます。タブ項目[1 ページ]に、次のコードの断片を記入します。

category := 'Tutorial-Apple'.
aPackage := Store.Registry packageNamed: category.
aClass := Smalltalk
        defineClass: #Person2
        superclass: #{Core.Object}
        indexedType: #none
        private: false
        instanceVariableNames: 'name'
        classInstanceVariableNames: ''
        imports: ''
        category: category.
aClass comment: 'Smalltalk Tutorial'.
aPackage addClass: aClass

クラスを定義するには、メソッド NameSpace>>defineClass:superclass:indexedType:private:instanceVariableNames:classInstanceVariableNames:imports:category: を利用します。ここでは、注目すべき引数だけを紹介します。

  • defineClass: 定義したいクラスの名前を、シンボルで指定します
  • superclass: 親となるクラスの名前を、シンボルで指定します。ただし、名前にピリオドが含まれるときには、括弧 #{Core.Object} で囲みます
  • instanceVariableNames: インスタンス変数の名前を、文字列で指定します
  • category: カテゴリーの名前を、文字列で指定します



必要なら、メソッド ClassDescription>>comment: を利用して、コメントを追加できます。

 ↑ TOP

*Created: 1989/01/29|Last updated: 2013/03/25 19:52:17