برنامه نویسی به زبان ارلنگ

ارلنگ زبان برنامه نویسی تابعی و همروند است

برنامه نویسی به زبان ارلنگ

ارلنگ زبان برنامه نویسی تابعی و همروند است

برنامه نویسی به زبان ارلنگ

در این وبلاگ مطالب مربوط به ارلنگ و الیکسیر منتشر خواهد شد

۱۵ مطلب در ارديبهشت ۱۳۹۷ ثبت شده است

  • ۰
  • ۰

مثال بعدی در ظاهر بسیار ساده است. برنامه‌ئی بنویسید که دو عدد را از ورودی بگیرد و چهار عمل اصلی را با آن دو عدد انجام دهد. برای نمونه اگر بترتیی 4و 5 را وارد کنید باید خروجی مشابه زیر داشته باشیم:

4 + 5 = 9

4 – 5 = -1

4 * 5 = 20

4 / 5 = 0

 البته تقسیم در محاسبات صحیح فرض شده است. برای حل کردن این مثال مانند مثال‌های گذشته براحتی می‌توان با ورودی دریافت شده از کاربر کار کرد با این تفاوت که باید ابتدا مطمئن شویم که ورودی عدد است و نه چیز دیگر. ضمنا برای این مثال ورودی عدد منفی را نیز از کاربر نخواهیم پذیرفت. کد این برنامه بصورت زیر است:

-module(ex5).
-export([main/0]).
main() ->
	try calc()
	catch
		error:_Error -> io:format("Please Enter only Numeric type~n");
		throw:negativeNumber -> ("Please Enter only positive number~n")
	end.
		
calc() ->
	{A,B} = readInteger(),
	if
		A < 0 orelse B < 0 -> throw(negativeNumber);
		true -> ok
	end,
	[print(A,B,Op) || Op <- ["+","-","*","/"]].
		
readInteger() ->
	{ok,[First]} = io:fread("Enter the first number: ","~d"),
	{ok,[Second]} = io:fread("Enter the second number: ","~d"),
	{First,Second}.

print(A,B,Op) ->
	Res = case Op of
			"+" -> A + B;
			"*" -> A * B;
			"-" -> A - B;
			"/" -> A div B
			end,
	io:fwrite("~w ~s ~w = ~w ~n",[A, Op, B, Res]).

بطور مشخص در کد بالا سیاست ارلنگ در مواجهه با استثناءها قابل مشاهده است. سیاستی که اصطلاحا "اجازه بده خراب شود" نام دارد. به این معنی که جلوگیری از خطا و باگ ها تقریبا غیر ممکن است و بهتر است بجای آن تلاش برای کنترل شرایط پس از خطا صرف شود. در مقابل این سیاست، برنامه نویسی تدافعی defensive programming قرار دارد که سعی دارد هر خطا را در همان محل بررسی کند. برای این منظور عبارات کنترلی خطا (try/catch ) تنها در تابع آخر قرار خواهد گرفت و سایر توابع صرفا کاری برای کنترل و پیشگیری خطا انجام نخواهد داد. البته در بسیاری از زبانهای شئ‌گرا هم مدل برنامه نویسی تدافعی کنار گذاشته شده است.

در کد بالا تابع main خطا ها را بررسی می‌کند و تنها تابع calc را صدا می‌زند. این تابع سپس تابع readInteger را صدا می‌زند که وظیفه‌اش خواندن دو مقدار عددی است. و در آخر هم تابع print صدا زده می‌شود.

  • مهدی حسینی مقدم
  • ۰
  • ۰

این مثال هم مانند قبلی ها بسیار ساده است، چهار مقدار ورودی می‌گیرد و یک عبارت چاپ می‌کند. برخلاف مثال قبل از trim استفاده نکردم. trim کارکترهای خالی مانند تب و اینتر را از ابتدا و انتهای ورودی حذف می‌کند که شاید خیلی دقیق نباشد زیرا ما تنها می‌خواهیم کارکتر خط جدید را از انتها حذف کنیم، برای همین از تابع دیگری استفاده کردم. نکته دیگر استفاده از export_all است که البته صرفا برای تست مناسب است.

-module(ex4).
-compile(export_all).

main() ->
	Noun = string:strip(io:get_line("Enter a noun:"),right,$\n),
	Verb = string:strip(io:get_line("Enter a verb:"),right,$\n),
	Adjective = string:strip(io:get_line("Enter an adjective:"),right,$\n),
	Adverb = string:strip(io:get_line("Enter an adverb: "),right,$\n),
	io:fwrite("Do you ~s your ~s ~s ~s? That's hilarious!~n",[Verb, Adjective, Noun, Adverb]).
  • مهدی حسینی مقدم
  • ۰
  • ۰

برنامه‌ئی بنویسید که دو مقدار رشته یکی برای نویسنده و یکی برای سخن آن نویسنده را از ورودی بگیرد و سپس آن را با فرمت زیر نمایش دهد. دقت کنید که کارکتر های خاص نظیر " نیز در رشته‌ی ورودی وجود خواهند داشت. برنامه باید مانند مثال زیر عمل کند:

What is the quote? These aren't the droids you're looking for.
Who said it? Obi-Wan Kenobi
Obi-Wan Kenobi says, "These aren't the droids you're looking for."


-module(ex3).
-export([prompt/0]).

prompt() ->
	Quote = string:trim(io:get_line("What is the quote? ")),
	Author = string:trim(io:get_line("Who said it? ")),
	io:fwrite("~s said \"~s\" ~n",[Author, Quote]).

من در حل این جواب از تابع get_line استفاده کردم. البته این تابع یک کارکتر خط جدید نیز به انتهای رشته اضافه می‌کند بنابراین مجبور به استفاده از تابع trim شدم که فضاهای خالی اول و آخر عبارت را حذف کند. همچنین به دلیل اینکه در متن نهایی باید " چاپ شود قبل از آن از کارکتر / استفاده کردم. 

  • مهدی حسینی مقدم
  • ۰
  • ۰

در این مثال ساده، قرار بر نوشتن برنامه‌ئی است که یک رشته از ورودی بگیرد و طول آن را چاپ کند. البته ارلنگ نوع رشته ندارد و رشته ها در ارلنگ به دو صورت باینری و لیست ذخیره می‌شوند. خروجی این برنامه بصورت باینری ذخیره می‌گردد و بنابرین نیاز به استفاده از توابع کتابخانه خاصی است.

%compute length of a string
-module(ex2).
-export([prompt/0]).

prompt() ->
	{ok,S} = io:fread("What is the string? ","~s"),
	io:fwrite("the length of ~s is ~w ~n",[S,string:length(S)]).
  • مهدی حسینی مقدم
  • ۰
  • ۰

تصمیم گرفتم مثالهای کتاب Exercises for programmer را به زبان ارلنگ انجام دهم و پس اطمینان از درستی آنها، منتشر کنم. مثال اول که بسیار ساده بود. از کاربر اسمش را سوال کنم و عبارت Hello را در ابتدای آن گذاشته و سپس در خروجی چاپ کند.

 کد بشرح زیر است:

-module(ex1).

-export([hello/0]).

hello() ->
    {ok,S} = io:fread("What is your name? ","~s"),
    io:fwrite("Hello ~s~n",[S]).
  • مهدی حسینی مقدم