【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

LearningFScriptIn20Minutes - 20分で分かる F-Script ... と同時に Core Image で遊んでみる

目次

20分で分かる F-Script ... と同時に Core Image で遊んでみる

この記事について

20分で分かる F-Script ... と同時に Core Image で遊んでみる

2009 年 1 月

F-Script 入門シリーズ (原文)

はじめに

F-Script は Cocoa のために作られたオープンソースなスクリプティング環境です。もしまだ使ったことがなければ、これを機会に F-Script でどれだけ仕事が早くなるかを体験してみてください。あなたの書いた Cocoa アプリケーションを使うユーザーの生産性が上がる可能性だってあります。この記事のゴールは、 Core Image のファンシィな機能を使ってちょっとしたアニメーションを作ってみることです。それでは、 Mac の前に腰を落ち着けて、F-Script の最新版を http://www.fscript.org からダウンロードしましたね? では楽しい旅を!

※ この記事は MacTech 誌 2007 年 5 月号に掲載された 「20分で学ぶ F-Script」を元に加筆されたものです。

未知との遭遇

まず、 F-Script のメイン機能の 1 つを使いながら第一歩を進めましょう。 F-Script の対話コンソールです。コンソールにコマンドを入力することで、リアルタイムに Objective-C のオブジェクトを操作することができます。 F-Script.app を起ち上げたら、 F-Script コンソールが自動的に開くので、 F-Script の文やスクリプトを入力して Return キーを押せばそれがただちに実行されます。

F-Script は Cocoa 向けに書かれた Smalltalk の一種なので、 Objective-C を知っている方なら見慣れた感じがするでしょう。実際、 Objective-C の作者であるブラッド・コックスは、Objective-C のことを「 C 言語 100 % プラス Smalltalk の主な部分からなるハイブリッド言語」と言っています。ここで Objective-C と F-Script でメッセージを送る例をそれぞれ出してみましょう。 Cocoa で提供されている NSDate クラスに現在の日付を聞いてみます。

Objective-CF-Script(i.e. Smalltalk)
[NSDate date] NSDate date

文法は似ています。ただ、 F-Script ではメッセージ式のまわりを括弧で囲む必要がありません。これは F-Script がシンプルな言語であり、できるのはメッセージを送ることくらいなためです。なので、特別なシンタックスを入れてメッセージ式を区別する必要がそもそもないのです。では、このメッセージ式をコンソールに入力して Return キーを押してください。すぐに式が評価され、結果が表示されるはずです。(もちろん、下のとは違う値が返ってくるはずです。)

 > NSDate date
 2009-01-16 22:08:23 +0900

このように、 F-Script が提供する環境の中では、オブジェクトと好きなように対話することができます。何かやってみたくなる度に専用のアプリを作ったりする必要もありません。 こうしたインタラクティブな Cocoa セッションを便利にする様々なツールを F-Script は提供しています。特に初めてのときには以下のことを頭のすみに置いておくとよいでしょう:

Smalltalk との関係

Smalltalk の話の前に、その歴史をお話ししておきましょう。 Smalltalk は 70 年代のはじめ、アラン・ケイが率いるチームによって、有名な Xerox パロ・アルト研究所 (PARC) で開発されました。ご存知かもしれませんが、それ以来 Smalltalk はソフトウェア業界に大きな影響を与え続けています。例えば、スティーブ・ジョブズが 1979 年に PARC へ遊びに行ったときの話を聞いたことがあるかもしれません。このときの体験が、 Lisa や Macintosh コンピューターのデザインにかなりの影響を与えたとのことです。 PARC でスティーブ・ジョブズが見せてもらったのが Smalltalk です。 GUI もあれば、初のオブジェクト指向のシステムでもあり、ネットワーク機能も付いていました。「金鉱に座っていながら、どうして売らないんだ?」と若きスティーブ・ジョブズは訊き、その少し後には PARC のメンバーの数名がアップルで働き始め、その後は知られている通り...

さて、では Smalltalk のコンセプトは何でしょうか? Smalltalk の言語設計を支えているのは、すべてのものはオブジェクトで説明できるという考えです。アラン・ケイの言葉を借りると「 Smalltalk の設計は以下の考えによっています: 考え得るすべてのものは、 ある 1 種類の構成要素の再帰的な集まりとして表現できる。この構成要素は状態と振る舞いを内部に隠し持っていて、メッセージのやり取りのみによって外部と関係を持つ」。実際、 Smalltalk ではすべてのものが、数字や真偽値さえもオブジェクトになっています。

F-Script の文法

F-Script で書かれたプログラムではメッセージ送信が主な制御構造です。 Objective-C と同様、 F-Script でも、引数を持たないメッセージは 単項メッセージ と呼ばれます。 1 個以上コロンがメッセージに入っているものは キーワードメッセージ です。そして、ここが Objective-C と違うのですが、 F-Script には 3 つ目のメッセージの種類があります: アルファベット以外の記号、たとえば + や - を使ったメッセージで、 二項メッセージ です。二項メッセージは常に 1 つの引数を持ちます。

Objective-CF-Script
単項メッセージ[NSDate date] NSDate date
キーワードメッセージ[NSDate dateWithTimeIntervalSinceNow:10]NSDate dateWithTimeIntervalSinceNow:10
二項メッセージなし date1 < date2

date1 < date2 を Objective-C で書くとするなら、 [date1 compare:date2] == NSOrderedDescending になります。

Objective-C と同様、メッセージは次々に送ることができます。このとき、式は左から右に順番に評価されるので、 Objective-C と F-Script で同等の意味になります。

Objective-CF-Script
[[NSDate date] description] NSDate date description

時にはメッセージ式を評価する順番を判断しなければいけないこともあります。 F-Script では以下の優先順位が定められています (唯一の優先順位です): まず単項メッセージ式を評価し、次に二項メッセージ式、それからキーワードメッセージ式。順番を変えたいときは、括弧を使ってください。

次は Objective-C と F-Script との違いの例になっています。

Objective-CF-Script
NSDate *date1 = [NSDate date]; date1 := NSDate date.

F-Script ではすべてのものがオブジェクトであり、変数は型宣言をする必要はありません。代入は Objective-C のように = ではなく := を使い、文の区切りはセミコロンではなくピリオドになります。以下の表に違いがまとめられています。文字列はシングルクオーテーションで囲み、コメントはダブルクオーテーションで囲みます。

Objective-CF-Script
@"a string" 'a string'
/* a comment */ "a comment"
@selector(dateWithTimeIntervalSinceNow:) #dateWithTimeIntervalSinceNow:
[NSMutableArray arrayWithObjects:@"Hi",@"mom",nil] {'Hi','mom'}
NSMakePoint(200,80) 200<>80

訳注: 表内の , は wiki 文法のテーブルセル区切りと解釈されるのを避けるため、全角になっている

画面に絵を出す

F-Script で Core Image プログラミングをはじめるだけの基礎知識をおさらいしました。ではまず表示したい画像ファイルを指す NSURL オブジェクトを作りましょう。今回はディスク上のデスクトップピクチャフォルダにある画像を使います。以下のコードを F-Script コンソールに入力して、実行してください。

 imageLocation := NSURL fileURLWithPath:'/Library/Desktop Pictures/Nature/Clown Fish.jpg'.

imageLocation 変数に NSURL オブジェクトが入りました。次に CIImage オブジェクトを作って、ディスク上の画像で初期化しましょう。

 image := CIImage imageWithContentsOfURL:imageLocation.

Mac OS X のフレームワーク群で提供されている標準的なメソッドを使っていることに注意してください。 CIImage オブジェクトができたので、これまでと同様、標準的なメソッドを使って自分自身を描画するよう頼んでみます。

 image drawInRect:(200<>80 extent:600<>400) fromRect:image extent \
  operation:operation fraction:1.

訳注: ここで operation := n s compos_i_t_e source over (キャメルケースにして _ は除く)。そのまま書くとなぜか保存できません。

このコードを実行すると、コンソールに小さな美しい画像が表示されます。

(続く)