در کل مسیر آموزشی 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 وجود دارد:
استفاده از کلیدواژهی function
function muladd(x, y, z)
x * y + z
end
تورفتگی با ۴ فاصله برای خوانایی مرسوم است، اما کامپایلر آن را نادیده میگیرد.
کلیدواژهی end ضروری است.
توجه کنید که میتوانستیم return x * y + z را بنویسیم.
اما توابع Julia همیشه آخرین عبارت ارزیابیشده را برمیگردانند، بنابراین کلیدواژهی return اختیاری است.
بسیاری از برنامهنویسان ترجیح میدهند آن را بنویسند تا منظورشان صریحتر باشد.
استفاده از «شکل انتساب»
muladd(x, y, z) = x * y + z
این شکل بیشتر برای ساختن توابع کوتاه تکعبارتی به کار میرود.
کلیدواژهی return در شکل انتساب هرگز استفاده نمیشود.
این دو شکل معادلاند و دقیقاً به یک شکل استفاده میشوند، پس هرکدام را که خواناتر است انتخاب کنید.
برای فراخوانی یک تابع، اسم آن را مینویسید و برای هر یک از پارامترهای تابع آرگومان میفرستید:
# 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 میخواهد که اسمها (اسم متغیرها، توابع و بسیاری موارد دیگر) با یک حرف شروع شوند و پس از آن هر ترکیبی از حروف، رقمها و زیرخطها بیاید.
بر اساس قرارداد، اسم متغیرها، ثابتها و توابع با حروف کوچک نوشته میشود و تعداد زیرخطها تا حد معقولی کم نگه داشته میشود.
در این تمرین میخواهید کدی بنویسید که به شما کمک کند یک لازانیای عالی را از کتاب آشپزی محبوبتان بپزید.
شما چهار کار دارید که همه به زمان صرفشده برای پخت لازانیا مربوط میشوند.
ثابت expected_bake_time را تعریف کنید که تعداد دقیقههایی را برمیگرداند که لازانیا باید در فر بپزد.
طبق کتاب آشپزی، لازانیا باید در مجموع ۶۰ دقیقه در فر بماند.
julia> expected_bake_time
60
تابع preparation_time را تعریف کنید که تعداد لایههایی را که به لازانیا اضافه کردهاید به عنوان ورودی میگیرد و تعداد دقیقههایی را برمیگرداند که صرف آمادهسازی لازانیا کردهاید، با این فرض که آماده کردن هر لایه ۲ دقیقه طول میکشد.
julia> preparation_time(4)
8
تابع remaining_time را تعریف کنید که تعداد واقعی دقیقههایی را که لازانیا در فر بوده است به عنوان ورودی میگیرد و تعداد دقیقههایی را برمیگرداند که لازانیا هنوز باید در فر بماند.
julia> remaining_time(50)
10
تابع total_working_time را تعریف کنید که دو ورودی میگیرد: ورودی اول تعداد لایههایی است که به لازانیا اضافه کردهاید و ورودی دوم تعداد دقیقههایی است که لازانیا در فر بوده است.
تابع باید تعداد کل دقیقههایی را برگرداند که صرف پخت لازانیا کردهاید؛ این مقدار برابر است با مجموع زمان آمادهسازی بر حسب دقیقه و زمانی که لازانیا تا این لحظه در فر گذرانده است.
julia> total_working_time(3, 20)
26