Juliaのトラック全体を通して、解答は小さなライブラリのように扱うことが求められます。つまり、関数や型などを定義し、それをテストスイートで実行することになります。 そのため、最初の概念として名前付き関数を紹介します。
Juliaは動的で、型付けの強いプログラミング言語です。 プログラミングのスタイルは主に関数型ですが、Haskellなどの言語よりも柔軟です。
変数は事前に宣言する必要はありません。 適切な名前を決めて、値を代入するだけです。
julia> myvar = 42 # an integer
42
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
プログラム全体で使いたい値がある一方、その値が変わる予定がない場合は、定数として扱うのがよいでしょう。
代入の前にconstキーワードを付けると、コンパイラーは変数の場合よりも効率のよいコードを生成できます。
定数は、プログラミングのミスを防ぐのにも役立ちます。
うっかりconstの値を変更しようとすると、警告が出ます。
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
constは関数の外側でしか宣言できないことに注意してください。
ふつうは*.jlファイルの先頭付近、関数定義の前に置きます。
これらは多くの言語と同じです。
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division with floating-point result)
8 % 3 # 2 (remainder)
Juliaで名前付き関数を定義する方法は、よく使われるものが2つあります。
functionキーワードを使う方法
function muladd(x, y, z)
x * y + z
end
読みやすさのために4スペースのインデントが慣例ですが、コンパイラーはこれを無視します。
endキーワードは必須です。
return x * y + zと書くこともできたことに注意してください。
ただし、Juliaの関数は常に最後に評価された式を返すので、returnキーワードは省略できます。
意図をより明確にするために、あえて書くプログラマーも多くいます。
「代入形式」を使う方法
muladd(x, y, z) = x * y + z
これは、式1つの簡潔な関数を書くときによく使われます。
代入形式ではreturnキーワードを決して使いません。
2つの形式は等価で、まったく同じように使えるので、読みやすいほうを選んでください。
関数を呼び出すには、その名前を指定し、関数のそれぞれの入力に値を渡します。
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
多くの言語と同じく、Juliaでは(変数、関数、その他さまざまなものの)名前は文字で始まり、そのあとに文字、数字、アンダースコアを好きなだけ続けられます。
慣例として、変数、定数、関数の名前は小文字で書き、アンダースコアはほどほどに抑えます。
この演習では、お気に入りの料理本を見ながら絶品ラザニアを作るためのコードを書いていきます。
4つのタスクがあり、どれもラザニアを作るのにかかる時間に関するものです。
ラザニアをオーブンで何分焼けばよいかを返すexpected_bake_time定数を定義します。
料理本によると、ラザニアはオーブンで合計60分焼く必要があります。
julia> expected_bake_time
60
preparation_time関数を定義します。この関数は、ラザニアに重ねた層の数を入力として受け取り、ラザニアの準備に何分かかったかを返します。1層につき2分かけて準備するものとします。
julia> preparation_time(4)
8
remaining_time関数を定義します。この関数は、ラザニアがすでにオーブンに入っていた実際の分数を入力として受け取り、ラザニアをあと何分オーブンに入れておく必要があるかを返します。
julia> remaining_time(50)
10
total_working_time関数を定義します。この関数は2つの入力を受け取ります。1つ目の入力は、ラザニアに重ねた層の数です。2つ目の入力は、ラザニアがオーブンに入っていた分数です。
この関数は、ラザニアの調理に合計で何分取り組んだかを返します。これは、準備にかかった分数と、その時点でラザニアがオーブンに入っていた分数を足したものです。
julia> total_working_time(3, 20)
26