SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

プログラミング言語「Nu」入門

プログラミング言語Nuの基本とインストール方法

LispをベースにObjective-Cのオブジェクトシステムを組み合わせた言語


  • X ポスト
  • このエントリーをはてなブックマークに追加

オブジェクトシステム

 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 をインストールして実際にコードを動かしてみてください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
プログラミング言語「Nu」入門連載記事一覧

もっと読む

この記事の著者

吉田裕美(ヨシダユウミ)

有限会社 EY-Office 取締役CADのベンチャー企業でCADのコア部分や図面管理システムなどの開発に従事した後、独立しJava,Ruby,PerlでWebアプリを中心に開発してきた。現在は殆どの開発はRuby on Rails。ここ数年はソフトウェアエンジニアの教育に興味をもち、従来の知識偏重な教育ではなく現実の問題を解決できるエンジニアを育てる教育に注力している。またLisp等に関心...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4698 2010/04/19 19:51

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング