Macも計算機なんだし

そういえば計算機だった

 文章を書いたり、絵を描いたり、曲を演奏したり、ゲームをしたり・・・・・・。
 Macをこのように使っていると忘れがちになりますが、Macの内部にあるCPUは猛烈なスピードで数値を計算してこれらの作業を実現しています。

 今回は、AppleScriptを使って四則演算をはじめさまざまな計算を行います。
 今後スクリプトを作成する際に重要になる内容ですので、エディタ(注1)に計算式を入力しながら、しっかりと理解して読み進めてください。

 では、さっそくエディタを起動して、数値(number)計算を行いましょう。スクリプト入力欄に、次のような数式を入力ます。

2 + 3

「実行」ボタンを押すと、結果(Result)に、計算結果の「5」が表示されます。
 ウインドウ下に結果が表示されていないときは、[表示]-[結果を表示](または[command+2])で表示できます。

結果:5

 何度も「結果にxxが表示されます」と書くのもまどろっこしいので、これから結果を書く場合「-->」という記号の後に書きます。

 次は少し複雑な式を書いてみましょう。

64 * 8 * 2 / 512
 	--> 2.0

 普通の電卓とは違ってエディタでは、このように式を全部書いて実行できるので計算式を把握できて便利です。
 計算に使う記号は演算子(Operator)と呼び、AppleScriptでは電卓やテンキーにある「+」や「-」などの標準的なものが用意されています。
 掛け算は「*」で割り算が「/」なところが少し奇妙に映るかもしれません(注2)が、コンピュータの世界では共通した記号なので、慣れてしまいましょう。

括弧でまとめよう

 式にカッコを付けると、カッコのなかを優先して計算できます。例えば、次の式を見て下さい。

10 + 2 * 5
 	--> 20

 これは四則演算のルールに従って「2*5」が先に計算されるため、計算結果は「20」になります。
 ここで「10+2」を先に計算するには、次のように書きます(これも通常の四則演算のルールです)。

(10 + 2) * 5
 	--> 60

「2*5」を先に計算する場合は、「10+2*5」のままでもよいのですが、次のように書けば、計算内容を把握しやすくなります。

10 + (2 * 5)
 	--> 20

 エディタは、AppleScriptの構文を確認をするときに自動的にカッコを付ける場合もあります。
 またカッコは、次のように何重にもくくることができます。

(1542 + 3) / (((12 - 4) * 5) + 2.7)
 	--> 36.182669789227

 計算に使うカッコの種類は「( )」のみで、数式のように「{ }」や「[ ]」は使えません。
 非常に複雑な計算式を入力した場合、AppleScriptがどの順番で計算を行えばいいのか判断できなくなり、エラーが発生することがあります。
 このような事態を起こさないためにも、区切りごとにカッコでくくるクセをつけましょう。
 人間が読むときも、読みやすいですしね。

結果を使って計算する

 まず、次の2行の計算式をスクリプト入力欄に打ち込んで実行してください。

10 + 5
result + result - 5
	--> 25

 「result」は1行目の計算結果「15」を表しており、2行目ではその値を利用して、次の内容の計算を行っています。

15 + 15 - 5

 「result」を使えば直前の行の結果を保存でき、それを使ってさらに計算を進められます。
 では3行目に「result」を使った式を書くと、結果はどうなるでしょうか。

10 + 5
result + result - 5
result * 2
	--> 50

 2行目の「result」には1行目の計算結果が、3行目の「result」には2行目の計算結果が記録されているわけです。
 このように「result」の値は常に変わります。
 AppleScriptでは、ほとんどの操作の結果が「result」に記録されます。
「result」はこれから作成していくスクリプトで重要になりますので、しっかりと仕組みを覚えておきましょう。

単位を使ってみよう

 AppleScriptでは、さまざまな度量衡の単位を扱えます(注1)。
 単位を利用するには数値に「as 単位」を付けて変換します。例えば100mは、次のように表せます。

100 as meters

 同じように、50kgは次のように書きます。

50 as kilograms

 AppleScriptで別の単位に変換する場合は、さらに「as」演算子を使います。

(1240 as meters) as kilometers
	--> kilometers 1.24

 変換は、長さや面積など同種の単位同士で行えます。変換する単位がそろっていないと 正しい結果が得られないので注意しましょう。これらの単位を使って計算する場合は、次のように「as」を使って単位を数値(number)に変換する必要があります。

((400 as miles) as number) + ((10 as miles) as number)
	--> 410.0

「as number」とすることで、結果には数値だけが表示されます。

(1400 as grams) as pounds as number
	--> 3.0864708

 これで「as pounds」でグラムをポンドに変換したあとで、数値だけを取り出せます。

文字を扱ってみよう

 またAppleScriptでは、計算式で文字を扱うことも可能です。
 文字は、文字の前後を「"」(ダブルクォート)でくくって使います。
 カッコでくくった文字を文字列(string)と呼び、文字列同士は「&」で連結できます。

"機関車" & "客車" & "客車"

 上記の計算式をスクリプト入力欄に打ち込むと、結果には"機関車客車客車"と表示されます。
 文字列も「result」に記録されるので、次のように書くと...。

"こんにゃく"
"たまご" & result & "ちくわ"

 1行目の計算結果である「こんにゃく」が「result」に代入されて、2行目では"たまごこんにゃくちくわ"という計算結果を得られます。

 文字列の一部を取り出すこともできます。
 1つの文字を示す「character」を使って、次のようなスクリプトを書いてみましょう。

character 5 of "AppleScript"

 実行すると文字列"AppleScript"の前から5番目の文字"e"を結果に表示します。
 また、アルファベットの場合は「word」という命令を使って単語単位で文字列を取り出せます。
 しかし日本語の文法では単語同士をスペースで区切らないので、「word」命令を使うと代わりに仮名や漢字、句読点などで文字列を区切ります(注1)。

word 2 of "1 two 3 four"
	--> "two"
word 5 of "日本語は区切りが違う"
	--> "が"

複数行を扱ってみる

 ダブルクォートでくくられている文字列であれば、そのなかに改行も含めることが可能です。文字列を段落単位で取り出す場合は「paragraph」を使います。

"first paragraph
2行目
last paragraph"
paragraph 2 of result
	--> "2行目"

 このようにして、指定した行数(ここでは「2行目」)だけを取り出せます。さらに、「result」を使って次のように書くと、3行目の2番目の単語を取り出せます。

"first paragraph
2行目
last paragraph"
paragraph 2 of result
word 1 of result
	--> "2"

 このスクリプトは、「result」を使わずに、次のように書き換えることもできます。

word 1 of paragraph 2 of "first paragraph
2行目
last paragraph"

 つまり、「of」を使えば次々と範囲を絞り込んでいけるわけです。「result」を使った場合は、一度「result」に値を代入する操作が必要なため、処理に少し時間がかかります。通常は「of」でつなげてまとめるとよいでしょう。

範囲指定をしてみよう

 範囲を指定して文字列の一部を取り出すことができます。次の例では5番目から7番目の文字がresultになります。

text from character 5 to character 7 of "AppleScript"
	--> "eSc"

 また、範囲の前後を別の単位で指定することもできます。

text from character 3 to word 2 of "Apple Japan"
	--> "ple Japan"

 このように、文字列は「character」や「word」などのさまざまな単位で区切ることが可能です。また区切り位置の指定には、次のように「-」(マイナス)を使うこともできます。

character -1 of "一番最後は?"
	--> "?"

 ここで使った「-1」は、文字列の末尾からの順番を示しています。もちろん「word」や「paragraph」を使う場合でも「-」で範囲指定を行えます。

 ちなみに、文字が入っていない文字列を「空文字列(くうもじれつ・からもじれつ)」と言います。

""  -- 空文字列

日付けの計算をしてみよう

 AppleScriptでは、日付や時刻は、まとめて日付(date)として扱えます。

current date

 このスクリプトはシステム環境設定の「日付と時刻」で設定した日付を「date"Thursday, September 02, 1999 21:59:34"」のように結果に表示できます。
 この値は、秒数を足したり引いたりして計算できます。例えば、次の計算式では、現在から2分(120秒)後の日付を表示できます。

(current date) + 120

 また、「weeks」「days」「hours」「minutes」などの単語を使って、それぞれ週/日/時/分などの計算を行えます。
 これらの単語を直接使って計算式を実行した場合、それぞれの結果は秒数で表されます。

hours
--> 3600

 60秒×60分=3600秒というわけです。では、これらの単語を使って日付を計算してみましょう。
 2日前の日付は、次のように表現できます。

(current date) - 2 * days

 4週間後の日付は、次のように表せます。

(current date) + 4 * weeks

 AppleScriptでは、日付が持っている「属性(property)」を取り出すことも可能です。
 例えば、今が何日かを知りたい場合は、属性の「day」を使って次のように書くことで、日を数値として取り出せます。

day of (current date)

 先ほど行った日付の計算と組み合わせれば、今から100日後が何日かを導き出せます。

day of ((current date) + 100 * days)

 日付を文字列として取り出す方法もあります。

date string of (current date)

 これで、システム環境設定の「日付と時刻」で設定した、書式(時刻を含まない)の日付を結果に表示できます。
 このほかにも日付にはデータを取り出す方法が用意されています。
 詳細は、日付(date)の用語説明を、ご覧ください。

時間の単位ごとに取り出そう

 他に、年/時/分/秒だけを日付から取り出す方法が用意されています(注1)ので、それぞれの方法を紹介します。

year of (current date) -- 西暦
hours of (current date) -- 時
minutes of (current date) -- 分
seconds of (current date) -- 秒

 monthやweekdayは数字ではなく英語名が返ってきます。

month of (current date) -- 月
weekday of (current date) -- 曜日

 数字で得たい場合は、さらにas integerをつけて整数に変換します(注2)。

(month of (current date)) as integer -- 月(整数)
(weekday of (current date)) as integer -- 曜日(整数)

白黒をはっきりさせてみる

 比較演算子を使えば、値の大きさを判定して「真偽値(boolean)」を結果に表示できます。
 真偽値とは、正しい場合は真(true)、異なる場合は偽(false)を結果として表示する値です。例えば、次の計算式は、「(100 * 20)」が「(400 / 3)」より大きいかどうかを結果で確認できます。

(100 * 20) > (400 / 3)
	--> true

 また数値以外でも大きさを比べることが可能です。次の式で日付を比較した結果(真偽値)を取り出せます(注1)。

(current date) /= (current date) + 20
	--> true

 日付の場合は数値とは異なり、古い日付より新しい日付のほうが値が大きいと判断されます。
 つまり今日より明日、8時より10時が大きな値になります。

 包含演算子を使えば、指定した文字が文字列に含まれているかどうかを判定できます。
 値の大きさの判定と同様に、真偽値を結果に表示します。

"AppleScript" contains "apple"
	--> true

 文字列を比較する場合は、アルファベットの大文字と小文字を区別しません(注2)。
 日本語では、半角と全角、ひらがなとカタカナなどが区別されません(注2)。

"グァテマラ" = "グァテマラ"
	--> true
"りっとる" = "㍑"
	--> true

 漢字の場合は今ひとつ理屈が不明で、次の式は偽(false)と判定されます。

"株式会社" = "㍿"
	--> false

 字体の違いなどは区別されたりされなかったり、少々不安定感があります。

"神" = "神"
	--> true
"高" = "髙"
	--> false

 他のプログラミング言語では見ない文字判定基準(注4)で、意識しなくても便利に使える場合も多いのですが、意外な結果が出る場合もあるので気をつけましょう。

 今回はいきなり難しくなったと感じたかもしれません。
 しかし何度も言うように最初にすべて理解する必要はありません。
 しばらくたってから読み返して「ああ、そういう意味だったのか」となればよいのです。
 特に今回の内容は、あとで読み返すことをお勧めします。

【今回のまとめ】

エディタでは、

  • 計算式を書いて[実行]ボタンで結果を表示
  • resultを使って、計算結果を次の計算に使用
  • カッコを使って計算式を整理整頓ができる

演算子を使って計算が行えるのは

  • 数値
  • 文字列や日付
  • 度量衡単位の変換

真偽値を返す演算子は、

  • 数字や文字列、日付の大きさを比べる「比較演算子」
  • 指定した文字列が含まれるかどうかを調べる「包含演算子」