Learn AppleScriptObjC


Learn AppleScriptObjC


第2章 AppleScript

home  前へ  次へ  mail


Fortunes プロジェクト

前章の Fortune とは一字違いのプロジェクト名ですが、この章では、Fortunes という GUI を持たないアプリケーションを作りながら AppleScript の文法を学習します。次の手順に従ってプロジェクトを作成してください。

  1. File > New > Project... を選んでテンプレート・ウィンドウを表示
  2. OS X カテゴリーの Application か Other の中から Cocoa-AppleScript テンプレートを選び Next ボタンをクリック
  3. 次の画面で Product Name に Fortunes、Organization Name と Organization Identifier は、前回入力したものが表示されています。もし間違っていれば入力し直します。 Create Documnet-Based Application のチェックが外れていることを確認して Next をクリック
  4. 次の画面で Source Control のチェックを外し、任意の保存場所を選んで Create をクリック

前章では、このあとに、MainMenu.xib の Use Auto layout のチェックを外しましたが、今回はレイアウトを行わないので、その必要はありません。そのかわりにウィンドウが表示されないようにします。次の図のように、縦のスペースで一番下のウィンドウのアイコンを選択し、プロジェクトウィンドウ右上ペインで、左から4番目の Show the Attributes inspector タブを選択してください。そして Visual At Launch のチェックを外します。これでウィンドウは表示されなくなります。

次にソースコードを書くためのファイルを用意します。前章と同じように、左ペインを右クリックし、New File... を選択してください。選ぶテンプレートは白い Empty ファイルです (青い Empty ファイルではありあません)。今回はファイル名を Fortune.applescript にします。最後に s は付けませんので注意してください。また、MVC は、あくまでも GUI を持つアプリケーションの場合のデザイン様式です。今回は、Controller と呼ばれる View と Model の中継ぎをするファイルは作りません。Fortune.applescript ファイルが作成できましたら、次のようにコーディングしてください。

script Fortune
    
    property parent : class "NSObject"
    
    on awakeFromNib()
        
    end awakeFromNib_

end script

コーディングが終わりましたら、右ペイン下部のライブラリーから Object を縦スペースまでドラッグ & ドロップします。そして右上部のインスペクターペインで右から 3 番目の Show the Identity inspector タブを選び、Class に Fortune を選択してください。

ところで、前章では Object に Controller クラスを設定し、今回は Fortune クラスを設定しました。これは一何のためにしているのでしょうか。
awakeFromNib メソッドの Nib とは MainMenu.xib のことです。そして.xib は、以前 .nib という拡張子でした。Controller クラスや Fortune クラスを MainMenu.xib に登録することで、はじめて awakeFromNib メソッドを受け取ることが出来るようになるのです。
MainMenu.xib はアプリケーションに読み込まれた時、つまりアプリケーションが起動した時に、MainMenu.xib に登録されている、すべてのオブジェクト (クラス) の awakeFromNib メソッドを呼び出します。

なお、MainMenu.xib で作業をしている時にプロジェクトウィンドウの上部に警告マーク (黄色の三角) が表示されていることに気付かれましたか。この症状がバグなのか仕様なのかはわかりませんが、この警告を消すには MainMenu.xib に含まれているウィンドウの縦のサイズを次の図のように 360 未満にすると消えます。インスペクターペインの右から5番目の Show the Size inspector タブを選ん Window Size の Height を小さくしてください。

これで、AppleScript を学習するための下準備が整いました。次節からは awakeFromNib メソッドの中に AppleScirpt 固有のコーディングを施し、学習を続けていきます。


Variables

Variable 【変数】

変数は、値 (データ) を入れる入れ物です。実際にはメモリーに変数のための場所が確保されます。変数に入れた値は入れ替えることができます。この入れ替えのことを「代入」といいます。Lottery.applescript を次のようにコーディングして実行してみてください。赤色の部分が追加もしくは変更するコードです。log というキーワードはログ画面に結果を表示するものです。

script Fortune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set var to 100
        log var
        set var to 200
        log var
    end awakeFromNib_
    
end script

AppleScript では、set ○○ で ○○ という変数名を指定して to で値を代入します。上記のコードの結果は次のようになります。

AppleScript の変数には型がありません。型とは整数値なのか小数値なのか文字列なのかという決まりです。次のようにコーディングしてみてください。赤色の部分が追加もしくは変更するコードです。AppleScriptではダブルクォーテーション (二重引用符) で囲まれた箇所が文字列とみなされます。

script Forotune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set var to 100
        log var
        set var to 3.14
        log var
        set var to "AppleScript"
        log var
    end awakeFromNib_
end script

変数 var の値を、整数→少数→文字列と代入 (入れ替え) を続けても問題はありません。このコードの結果は次のようになります。

変数を使って加減乗除などの計算をすることができます。また、& を使って文字列を連結することもできます。

script Fortune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set x to 300
        set y to 200
        set z to "AppleScript"
        log x / 2
        log x + y
        log z & "ObjC"
    end awakeFromNib_
end script

結果

なお、AppleScript には定数を表すキーワードはありません 。定数はコードに直接書かれたリテラル定数といわれるものだけになります。


Loops

Loops 【繰り返し】

プログラムにとって繰り返しは、お得意の分野です。AppleScript での繰り返しは repeat キーワードを使ってコーディングします。

script Fortune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set i to 0
        repeat 10 times
            log i
            set i to i + 1
        end repeat
    end awakeFromNib_
end script

set i to i + 1 は、数学的には不思議なコードですが、プログラミングでは良く使われるコーディングで、i の値を一つ増やすことになります。

結果

前記のコードでは repeat 10 times と繰り返す回数を指定しましたが、while キーワードを使って条件が一致する間は繰り返すこともできます。

script Fortune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set i to 0
        repeat while i < 10
            log i
            set i to i + 1
        end repeat
    end awakeFromNib_
end script

このコードの実行結果は前記とまったく同じになります。< (小なり) という記号は左辺の値が右辺より小さいことを表します。また > (大なり) という記号は左辺の値が右辺の値より大きいことを表します。


List

List 【配列】

多くのプログラミング言語で、配列の英語名は Array といいますが、AppleScript では List (リスト) といいます。AppleScript の変数に型がないのと同様に、List にも型がありません。つまり整数も、少数も、文字列も、同じ List に加えることができます。ほとんどのプログラミング言語では、こういうことはできません。

List では、それぞれのデータを index (インデックス) と呼ばれる番号で区別します。つまり、各データに 1 から始まる続き番号が割り当てられ、その番号によって各データを取り出したり書き換えたりします。

【注意】
多くのプログラミング言語では、配列のインデックス番号は 0 から始まります。しかし、AppleScript では 1 から始まります。注意してください。

では、サンプルを示します。次のコードの4行目で「-- missing value のかわりに null でも可」という箇所があります。この -- (ハイフン2つ) で始まる箇所は、その行末までがコメントといわれるものになります。コメントはプログラムに影響を与えません。あくまでも覚書として残しておくものです。

7行目では set lotteryNum to lotteryNum & i * 3 というぐあいに & 演算子を使って、すでに存在している変数に、新しい値を追加しています。この段階で変数 lotteryNum は普通の変数から複数の値を持つ List に変化します。

12行目では、List から特定のインデックスの値を取り出しています。 item ○ of List と記述すると、○に指定したインデックス番号の値が取得できます。

【ちょっとした知識】
List は、あらかじめ次のようにコーディングしておくことができます。
set lotteryNum to {3, 6, 9 }
このようにコードをビルドする前に「あらかじめ」値が決まっていることを「静的 (static)」といいます。一方、今回のサンプルのようにプログラムの実行中に値が決まることを「動的 (dynamic)」といいます。

script Fortune
    property parent : class "NSObject"
    
    on awakeFromNib()
        set fortuneNum to missing value -- missing value のかわりに null でも可
        set i to 1
        
        repeat 10 times
            set fortuneNum to fortuneNum & i * 3
            set i to i + 1
        end repeat
        
        set i to 1
        
        repeat 10 times
            log "The number at index " & i & " is " & item i of fortuneNum
            set i to i + 1
        end repeat
        
    end awakeFromNib_
    
end script

このサンプルの実行結果は次のようになります。

リスト lotteryNun の1番目に missing value が残ったままになっているので、後に続く「インデックスの3倍の値」がずれてしまっています。コンピューターは「無」と「無限大」という概念を理解できません。その欠点をカバーするために、多くのプログラミング言語では、無を意味する null や nil という値を代用します (AppleScript ではmissing value や null を代用します)。しかし、この missing value や null は、あくまでも無を表す「値」です。したがってリストに値を追加するときに最初の値として残ったままになってしまっているわけです。

次節では、この問題について解決したいと思います。


Conditional Steatment

Conditional Steatment 【条件文】

条件文は、変数などの値が、ある条件に該当しているかどうかによって、次におなう処理を分岐するものです。条件分岐ともいいます。多くのプログラミング言語では、この条件分岐と前述の繰り返しによってすべての処理を実行していると言っても過言ではありません。

Entry.applescript を次のように変更してください。赤色の箇所が変更・追加するコードです。

script Fortune
    property parent : class "NSObject"

    on awakeFromNib()
        set fortuneNum to missing value -- missing value のかわりに null でも可
        set i to 1
        
        repeat 10 times
            if fortuneNum is missing value then
                set fotuneNum to i * 3
            else
                set fortuneNum to fortuneNum & i * 3
            end if
            set i to i + 1
        end repeat
        
        set i to 1
        
        repeat 10 times
            log "The number at index " & i & " is " & item i of fortuneNum
            set i to i + 1
            
        end repeat
        
    end awakeFromNib_

end script

実行結果

コード説明

7行目から11行目までが条件文と呼ばれるものです。1行ずつ説明いたします。

7行目:if fortuneNum is missing value then
「もし fortuneNum が missign value なら」という意味になります。ほとんどいうかまったく英語のままです。なお、if fortuneNum is equal missing value then、もしくは、if fortuneNum = missing valuen then と記述することもできます。また fortuneNum に null を代入していた場合は、if fortuneNun is null then としなければなりません。
8行目:set fortuneNum to i * 3
fotuneNumの値を i の 3 倍い入れ替えろ (代入せよ) という意味になります。これで fortuneNum から missing value、もしくは、null という値がなくなることになります。
9行目:else
7行目で示した条件に合わない場合の処理を else 以下に記述します。
10行目:set fortuneNum to fortuneNum & i * 3
fortuneNum に i * 3 の値を代入 (入れ替え)するのではなく & 演算子を使って、元の fortuneNum に配列 (リスト) として追加しています。
11行目:end if
if 文が終わったことを明示しています。明示しなければエラーになります。


さらに磨きをかける

script Fortune
    property parent : class "NSObject"

    on awakeFromNib()
        set fortuneNum to {}
        set i to 1
        
        repeat 10 times
            set fortuneNum to fortuneNum & i * 3
            set i to i + 1
        end repeat
        
        set i to 1
        
        repeat 10 times
            log "The number at index " & i & " is " & item i of fortuneNum
            set i to i + 1
            
        end repeat
        
    end awakeFromNib_

end script

このコードの実行結果は、前節と同じになります。4行目で set lotteryNum to missing value とするかわりに set fortuneNum to {} となっています。変数の値は「無」にはできないと言いました。しかしコレクション (collection、複数の値が集められたもの) といわれるデータが収められる変数は、値を「無」にすることができます。コレクションというのはプログラミング言語の一般的な言い方です。AppleScript ではリスト (配列) とレコード (record、まだ紹介していません) がコレクションになります。コレクションを「無」にするコードの書き方は、言語によって違いますが、AppleScript ではサンプルコードのように変数に {} を代入すると、その変数は値のないコレクションになります。

fortuneNum を「無」にできたので、7行目は set fortuneNum to fortuneNum & i * 3 に戻しています。


【ちょっとした知識】
コレクションの変数の値は「無」にすることができます。これにはポインターという考えが関わってきます。「ポインターって C 言語だけなのでは?」と思われた方は多いと思います。ポインター (名前は言語によって違うでしょうが) というのは、すべての言語で存在します。しかし、C言語以前では、そのポインターをプログラマーが触れないようにしていました。理由は危険度が高いからです。ですから、C 言語で一旦プログラマーに解放されたポインターは、Java の登場以降、ふたたび閉ざされてしまいました。前置きが長くなりました。話しを戻します。

それで、コレクション変数ですが、その中には実際にはポインターが入っています。なぜそうするのか。コレクションは値の個数が可変する可能性が高いからです。なので、最初の値のある場所だけを変数の中に代入して、あとはインデックスなどでたどるようにしているわけです。変数の中にあるのは値がある場所であって、値そのものではありません。ですから値のない空 (無) のコレクション変数も作ることが可能になっているわけです。


第2章の終わりに

本章では、簡単に AppleScript の文法を見ていきました。AppleScript はオブジェクト指向型の言語です。次章では、その AppleScript でのオブジェクト指向の要とも言える、スクリプトオブジェクトについて見ていきます。また、本章では紹介できなかった、レコードというコレクションデータも登場してきます。


home  前へ  次へ  mail


無断転載禁止
Copyright 2014. applescript.jp All right reserved.