オブジェクトシステム
Nu は Objective-C のオブジェクトシステムをほぼそのまま採用しています。Objective-C は Mac OS X や iPhoneアプリの開発に使われている言語で、Smalltalk のオブジェクトシステムをC言語に組み合わせた言語です。従って同じく Smalltalk のオブジェクトシステムに大きく影響を受けてる Ruby のオブジェクトシステムにも似ています。
クラスの利用
Objective-C では [レシバー メッセージ...] のような構文でクラス(オブジェクト)を利用します、ここでレシーバーはオブジェクト(インスタンス)で、メッセージはメソッド+引数です。 Nu の場合は [] を () に書き換えるだけです。
% ("abc" uppercaseString) "ABC" % ("12" intValue) 12 % ("abc" caseInsensitiveCompare:"ABC") 0 % ("abc" stringByPaddingToLength:16 withString:"+--" startingAtIndex:1) "abc--+--+--+--+-"
- 最初の例は、文字列(オブジェクト=レシバー)に大文字に変換するメッセージ(≒メソッド)を適応しています。
- 2番目は数値への変換メッセージを送っています。
- 3番目の例は引数付のメッセージの例です、引数のあるメソッドと同じですね。Java的に書けば "abc".caseInsensitiveCompare("ABC") です。
- 4番目の例は引数が3つあるメッセージで2、3番目の引数の前にもセレクター(キーワード)を書きます。これは Smalltalk からきた文法です。
Nu にはNu Class Referenceに書かれた組込クラスがあります。またNSで始まるクラスは Objective-C のクラスを拡張したものです。もちろん、Objective-C で書かれたクラスはすべて利用できるのでMac OS X Reference LibraryにあるMac OS X のほとんどのAPIを自由に使う事ができます。
クラスの定義
クラスの定義は class オペレータを使います。またメソッドの定義は Objective-C に似せて - オペレターでインスタンスメソッド、+ でクラスメソッドを定義します。
身長、体重から BMI値を計算できる Healthクラスを定義すると以下のようになります。
(class Health is NSObject (ivars) (- initWithHeight:h weight:w is (set @height h) (set @weight w) self) (+ healthWithHeight:h weight:w is ((Health alloc) initWithHeight:h weight:w)) (- bmi is (/ @weight (** (/ @height 100.0) 2))) )
・1行目
クラスの定義でクラス名を書き is の後ろに継承する親クラスを指定します(省略した場合は NSObject になります)。また、Nu も Java や Ruby と同様に単一継承の言語です。
・2行目
ivarsオペレータはインスタンス変数を動的に定義するという宣言です。ivarオペレータを使ってインスタンス変数を明示的に宣言する事もできます。
・(- initWithHeight: から始まる式
インスタンスに初期値を設定するインスタンスメソッドです。このメソッドは 身長(cm単位)h と体重(Kg単位)w を引数に受け取り、その値をインスタンス変数@height、@weight に設定しています。Ruby同様 @ から始まるシンボルはインスタンス変数です。
・(+ healthWithHeight: から始まる式
インスタンスの生成と初期値を設定を同時に行うクラスメソッドです。(Health alloc) で Healthクラスをのインスタンスを作成し、そのインスタンスに initWithHeight:メソッドを使って初期値を設定しています。
・(- bmi から始まる式
BMI値を計算するインスタンスメソッドです。BMI値は体重(kg単位)を身長(m単位)の2乗で割った値です。
Nu(Objective-C)では C++ や Java のようにインスタンスの作成と初期値の設定を同時に行うコンストラクターは無く、allocクラスメソッドでインスタンスを作成し、初期値の設定は別のインスタンスメソッドで行います。しかし、使いやすくするために、この例のようにコンストラクターのようなクラスメソッドを定義することがよくあります。
実行例
上のコードを health.nuファイルに書いて、「nush -f ファイル名」で実行します。
% nush -f health.nu Nu Shell. % (set a (Health healthWithHeight:170 weight:60)) ...結果は省略... % (a bmi) 20.76124567474049
まとめ
今回は Nu 言語の基本的な部分とオブジェクトシステムに付いて説明してきました。Nu は Lisp と Objective-C というメジャーとは言い難い言語を足した言語なので、どちらの言語もご存知ではない方には新しく知る事が多く頭のリフレッシュになったのではないかと思います。
Macを使用している方はぜひ Nu をインストールして実際にコードを動かしてみてください。