<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمد خدادادی</title><link>https://virgool.ir/feed/@khodadadi</link><description>khodadadi.net</description><language>fa</language><pubDate>2026-11-11 05:40:27</pubDate><image><url>https://files.virgool.ir/upload/users/5757/avatar/avatar.png</url><title>محمد خدادادی</title><link>https://virgool.ir/@khodadadi</link></image><item><title>زبان برنامه نویسی ارلنگ -  لیست ها</title><link>https://virgool.ir/erlang/لیست-ها-در-ارلنگ-xvxvrtvc3qzy</link><description>لیست هااز لیست ها برای حل کردن اکثر مسائل استفاده میشه و مسلما از این ساختار داده‌ای از همه بیشتر استفاده می‌شه. لیست‌ها می‌تونن همه چیز رو توی خودش نگه داره! اعداد، اتم‌ها، تاپل ها و حتی لیست های دیگه؛ یک لیست اینجوری نوشته میشه: [Element1, Element2, ..., ElementN] و می‌تونین بیشتر از یک نوع داده را داخلش قرار بدین:1&gt; [1, 2, 3, {numbers,[4,5,6]}, 5.34, atom].&#xA;[1,2,3,{numbers,[4,5,6]},5.34,atom]ساده بود نه؟2&gt; [97, 98, 99].&#xA;&#34;abc&#34;اوه اوه! این یکی از دوست‌نداشتنی ترین چیزای ارلنگه: رشته‌ها (Strings)! رشته ها لیست‌ها هستند و علامتشون هم دقیقا شبیه همه!حالا برای چی دوستش ندارند؟ برای این:3&gt; [97,98,99,4,5,6].&#xA;[97,98,99,4,5,6]&#xA;4&gt; [233].&#xA;&#34;é&#34;ارلنگ لیستی از اعداد رو وقتی بصورت عدد چاپ می‌کنه  که فقط یکی از این اعداد را نشه مثل یک حرف نشون داد! چیزی شبیه یک رشته واقعی در ارلنگ وجود نداره! این بدون شک باعث میشه در آینده از این زبان متنفر بشین. مایوس نشید، چونکه راه دیگری هم برای ایجاد رشته ها وجود داره و بعدا بهش می‌پردازیم.زیاد نوشابه نخورینممکنه شنیده باشین ارلنگ توی دستکاری رشته ها خیلی بد عمل میکنه؛ دلیلش اینه: نوع داده‌ای String برخلاف اکثر زبان ها توی ارلنگ وجود نداره. به دلیل اینکه اول ارلنگ برای استفاده توی شرکت‌های مخابراتی درست شد. اونجا هرگز(یا به ندرت) از رشته ها استفاده میشه و برای همین احساس نکردن که خوبه رسما به زبان اضافه کنند. به هر حال اکثر کمبودهای ارلنگ در دستکاری رشته‌ها با گذر زمان مرتفع شد: الان ماشین مجازی از رشته‌های یونیکد پشتیبانی میکنه و روی هم رفته الان از همه زمان‌ها در دستکاری رشته‌ها سریع‌تر شده. همچنین میشه رشته‌ها رو به صورت داده‌های دودویی نیز ذخیره کرد. این کار باعث میشه واقعا سبک باشه و راحت‌تر با اون کار کرد. در مجموع هنوز فقدان بعضی توابع توی کتابخانه استاندارد ارلنگ هست و همچنین درحالی که پردازش رشته‌ها در ارلنگ شدنیه زبان های بهتری برای کارهایی که به عملیات بیشتری  نیازه وجود داره، مثل پرل و پایتون.برای چسباندن لیست‌ها از عملگر ++ برای  حذف عناصر از عملگر -- استفاده می‌کنیم.Shell:&#xA;5&gt; [1,2,3] ++ [4,5].&#xA;[1,2,3,4,5]&#xA;6&gt; [1,2,3,4,5] -- [1,2,3].&#xA;[4,5]&#xA;7&gt; [2,4,2] -- [2,4].&#xA;[2]&#xA;8&gt; [2,4,2] -- [2,4,2].&#xA;[]هر دو عملگر ++ و -- right-associative هستند. یعنی اگر چند تا عملیات ++ یا -- داشته باشیم این عملیات ازبه ترتیب از راست به چپ اجرا می‌شوند.  شبیه زیر:Shell:&#xA;9&gt; [1,2,3] -- [1,2] -- [3].&#xA;[3]&#xA;10&gt; [1,2,3] -- [1,2] -- [2].&#xA;[2,3]بزارید ادامه بدیم. به اولین عنصر لیست Head و به بقیه لیست Tail گفته می‌شود. برای بدست آوردن اونا از دو تابع داخلی استفاده میکنیم:Shell:&#xA;11&gt; hd ( [1,2,3,4] ).&#xA;1&#xA;12&gt; tl ( [1,2,3,4] ).&#xA;[2,3,4]توجه توجه: توابع داخلی (built-in functions - ‌‌‌BIFs) معمولا با خود ارلنگ پیاده‌سازی نشده‌اند و با زبان C یا هر زبانی که ارلنگ با اون پیاده سازی شده بوده ( مثلا پرولوگ در دهه هشتاد) تعریف شده‌اند. بعضی توابع داخلی هستند که می‌توانند با خود ارلنگ انجام بشوند ولی به خاطر سرعت بیشتر با C پیاده‌سازی شده‌اند. یک نمونه تابع (length(List هست که همان طور که حدس زده‌اید طول لیست پاس داده شده را بر‌ می‌گرداند.دستیابی یا افزودن Head خیلی سریعه: عملا در همه برنامه‌هایی که نیاز دارین با لیست‌ها کار کار کنین اول از همه روع Head عمل می‌کند. چونکه خیلی زیاد استفاده میشن راه بهتری هم برای برای جدا کردن Head از بقیه لیست وجود داده که به تطابق الگو هم کمک میکنه: [Head | Tail]. حالا چگونه Head جدید رو به لیست اضافه کنیم:13&gt; List = [2,3,4].&#xA;[2,3,4]&#xA;14&gt; NewList = [1|List].&#xA;[1,2,3,4]پردازش لیست‌ها معمولا با Head لیست شروع می‌شود. شما به یک راه سریع برای دخیره کردن بقیه لیست که بعدا روی آن عملیاتی رو انجام بدهید نیاز دارید. اگه یادتون بیاد که  تاپل ها چگونه کار می‌کردند و چگونه از تطابق الگو برای استخراج مقادیر یک نقطه استفاده می کردیم ({X,Y})، شما الان می‌توانید اولین عنصر (Head) لیست رو به همان صورت جدا کنید.15&gt; [ Head | Tail ] = NewList.&#xA;[1,2,3,4]&#xA;16&gt; Head.&#xA;1&#xA;17&gt; Tail.&#xA;[2,3,4]&#xA;18&gt; [ NewHead | NewTail ] = Tail.&#xA;[2,3,4]&#xA;19&gt; NewHead.&#xA;2عملگر | که استفاده کردیم  cons یا constructor گفته می‌شود. در واقع یک لیست با یک cons و مقادیر درست می‌شود:Shell:&#xA;20&gt; [ 1 | [ ] ].&#xA;[ 1 ]&#xA;21&gt; [ 2  |  [ 1 | [ ]  ] ].&#xA;[ 2 , 1 ]&#xA;22&gt; [ 3 | [ 2 | [ 1 | [ ] ] ] ].&#xA;[ 3 , 2 , 1 ]هر لیست می‌تواند با اسفاده از این فرمول ساخته شود:[ Term1| [ Term2 | [ ... | [TermN ] ] ] ] ...پس لیست ها می‌توانند به صورت بازگشتی به صورت یک Head که قبلا Tail بوده، که خود این میتواند به دنبالش Head های دیگری درست شود. برای درک بیشتر، تصور کنید لیست شبیه یک کرم خاکی است: شما می‌توانید اون رو از وسط برش بزنید و بعدش دو تا کرم دارید.برای درک این مفاهیم همه مثال های زیر را بخوانید‌: (راهنمایی: همه مثال ها با هم برابرند)[a, b, c, d]&#xA;[a, b, c, d | [ ]]&#xA;[a, b | [c, d]]&#xA;[a, b | [c | [d]]]&#xA;[a | [b | [c | [d]]]]&#xA;[a | [b | [c | [d | [ ] ]]]]توجه توجه: به این شکل استفاده از لیست: [2 | 1] لیست نامناسب (improper list) نامیده می‌شود. لیست های نامناسب داخال تطابق الگو به شکل [Head|Tail] کار می‌کنند ولی توی تابع‌های استاندارد ارلنگ کار نمی‌کنند (حتی ()length)؛ چونکه ارلنگ توقع یک لیست مناسب (proper list) را دارد. لیست مناسب به لیستی گفته می‌شود که آخرین سلولش یک لیست خالی باشد. وقتی یک آیتم را به شکل [2] تعریف می‌کنیم، خودکار به شکل یک لیست مناسب تبدیل می‌شود. همین‌طور [ [2] | 1] باید کار کند!</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Sun, 19 Apr 2020 15:09:39 +0430</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - تاپل (Tuple) یا چند‌تایی</title><link>https://virgool.ir/erlang/تاپل-یا-چندتایی-در-ارلنگ-huvanyk3uaog</link><description> تاپل (Tuple) یا چند‌تاییچند‌تایی روشی برای ساز‌ماندهی داده‌هاست. روشی‌است برای دسته بندی Term ها وقتی که میدونید چند تا Term وجود داره. توی ارلنگ یک Tuple یا چندتایی به شکل {Element1, Element2, ..., ElementN} نوشته میشه. مثلا شما مشخصات یک نقطه (x,y) رو توی دستگاه دکارتی دارید. میتونیم این نقطه رو به شکل یک Tuple که دو تا Term داره نشون بدیم:1&gt; X = 10, Y = 4.&#xA;4&#xA;2&gt; Point = { X , Y }.&#xA;{ 10 , 4 }توجه توجه: به یک داده از هرنوعی Term گفته می‌شود.توی این مورد یک نقطه همیشه از دو تا Term تشکیل میشه. به جای اینکه متغییرهای X و Y رو با خودمون حمل کنیم، یک متغییر Point رو حمل میکنیم.  اگه یه ‌Point به ما رسیده باشه و ما فقط X رو نیاز داشته باشیم چه کنیم؟ استخراج کردن اطلاعاتی که میخواهیم سخت نیست. اگه یادتون باشه وقتی ما مقادیر رو منتسب میکنیم در صورتی ارلنگ شاکی نمیشه که مقادیر همون‌ها باشه که قبلا بوده. بزارین ازش سوءاستفاده کنیم! ممکنه نیاز داشته باشین متغییر ها رو با ()f پاک کنین.  3&gt; Point = { 4 , 5 }.&#xA;{ 4 , 5 }&#xA;4&gt; { X , Y } = Point.&#xA;{ 4 , 5 }&#xA;5&gt; X.&#xA;4&#xA;6&gt; { X , _ } = Point.&#xA;{ 4 , 5 }اول اینکه: X و Y هیچ مقداری ندارند، پس به عنوان متغییرهای مقید نشده (Unbound variable) در نظر گرفته می‌شن. وقتی ما اونا رو توی چند‌تایی {X , Y}  و سمت چپ عملگر = قرار میدیم، عملگر = دو مقدار { 5 , 4 }  و { X , Y }  رو با هم مقایسه می‌کنه. ارلنگ به اندازه کافی هوشمند هست که دو مقدار داخل چندتایی رو توی متغییرهای X  و Y  در سمت چپ عملگر = قرار بده. بعد حالا  فقط {4,5} = {4,5} رو با هم مقایسه می‌کنه و مشخصه که مقایسه به درستی انجام می‌شه! و این یکی از شکل‌های تطبیق الگو (pattern matching) است. نکته اینکه توی عبارت ۶ از متغییر بی‌نام _ استفاده شده. این دقیقا معنی شه: بی‌خیال شو از مقداری که معمولا اینجا قرار‌ می‌گیره؛ چون ما ازش استفاده نمی‌کنیم. متغییر _ همیشه به عنوان یک متغییر Unbound در نظر گرفته میشه و  ما ازش به عنوان یه Wildcard توی تطبیق الگو استفاده می‌کنیم. توجه توجه: تطبیق الگو فقط در صورتی برای استخراج مقادیر یک چندتایی کار‌ می‌کنه که تعداد عناصر چندتایی (طول چند‌تایی) یکی باشه.7&gt; { _ , _ } = { 4 , 5 }.&#xA;{ 4 , 5 } &#xA;8&gt; { _ , _ } = { 4 , 5 , 6 }.&#xA;** exception error: no match of right hand side value {4,5,6}چندتایی ها همچنین برای وقتی که ما با یک مقدار کار می‌کنیم هم مفیده. چه‌جوری؟ اینجوری! ساده‌ترین نمونه برای دمای محیط است:9&gt; Temperature = 23.213.&#xA;23.213خب،این دما برای رفتن به استخر عالیه... صبر کنین، این دما واحدش چیه، کلوین، سلسیوس یا فارنهایت؟‍‍10&gt; PreciseTemperature = { celsius , 23.213 }.&#xA;{ celsius , 23.213 }&#xA;11&gt; { kelvin , T} = PreciseTemperature.&#xA;** exception error: no match of right hand side value { celsius , 23.213 }این باعث یک خطا میشه، ولی این دقیقا همون چیزیه که ما می‌خواستیم. توجه: این همون تطبیق الگو است.  عملگر = ، {kelvin, T} و {celsius, 23.213} رو با هم مقایسه می‌کنه؛ حتی اگر متغیر T مقید نشده (Unbound) باشه،  ارلنگ می‌بینه اتم celsius با اتم kelvin در مقایسه یکی نیست. یک استثنا (exception) پرتاب می‌شه و باعث میشه اجرای کد متوقف بشه. اینجوری بخشی از برنامه ما که انتظار داره دما با واحد کلوین باشه، قادر نباشه دما با واحد سلسیوس رو پردازش کنه. این باعث میشه به سادگی برنامه‌نویس بدونه چه چیزی مورد مقایسه قرار گرفته و همچنین توی خطایابی بهش کمک می‌کنه. یک چندتایی که عنصر اولش یک اتم باشه به اون tagged tuple میگن. هر عنصر چند تایی می‌تونه از هر نوعی باشه حتی یه چندتایی دیگه:12&gt; {point , { X , Y} }.&#xA;{ point , {4 , 5} }اگه بخواهیم چند تا نقطه رو حمل کنیم چه‌کار کنیم؟ در قسمت بعدی به اون می‌پردازیم.</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Sat, 11 May 2019 21:16:40 +0430</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - جبر بولی و عملگرهای مقایسه‌ای</title><link>https://virgool.ir/erlang/جبربولی-و-عملگرهای-مقایسه-ای-در-ارلنگ-qdqlwv8i36hx</link><description>اگه یک زبان نتونه بگه که فرق دو تا چیز با هم چیه، بزرگه یا کوچک، درسته یا غلطه یه مشکل جدی داره. ارلنگ مثل هر زبان دیگری راهی داره که اجازه میده از عملگرهای بولی برای مقایسه استفاده کنین.جبر بولی خیلی ساده‌اس:1&gt; true and false.&#xA;false&#xA;2&gt; false or true.&#xA;true&#xA;3&gt; true xor false.&#xA;true&#xA;4&gt; not false.&#xA;true&#xA;5&gt; not (true and true).&#xA;falseتوجه توجه:  عملگرهای بولی and و or همیشه آرگومان‌های هر دو طرف عملگر رو ارزیابی می‌کنن. اگه بخواین میتونین از عملگر های andalso و orelse استفاده کنین که این دو عملگر عبارت سمت راست رو اگه لازم باشه ارزیابی می‌کنن و به اونا عملگرهای اتصال‌کوتاه (short-circuit) گفته میشه.ارزیابی برابری و نابرابری  هم خیلی ساده است ولی از نماد‌هایی استفاده می‌کنه که کمی با نماد‌هایی که توی زبان‌های دیگه دیدین متفاوته:6&gt; 5 =:= 5.&#xA;true&#xA;7&gt; 1 =:= 0.&#xA;false&#xA;8&gt; 1 =/= 0.&#xA;true&#xA;9&gt; 5 =:= 5.0.&#xA;false&#xA;10&gt; 5 == 5.0.&#xA;true&#xA;11&gt; 5 /= 5.0.&#xA;falseارلنگ برای مقایسه برابری و نابرابری به جای == و =! از عملگرهای =:= و =/= استفاده میکنه. سه عبارت آخر یه تله رو نشون میده: توی عملیات ریاضی اعداد اعشاری و صحیح برای ارلنگ فرقی نمی‌کنه ولی توی مقایسه براش فرق می‌کنه. جای هیچ نگرانی نیست چونکه عملگر های == و =/  برای این موارد درست شدن.چیزه که مهمه یادتون باشه اینه که میخواین مقایسه دقیق باشه یا نه.عملگر‌های دیگه برای مقایسه اینا هستند: &gt; (کوچکتر)، &lt; (بزرگتر)، =&lt; (بزرگتر مساوری)، &gt;= (کوچکتر مساوی). آخری با زبان های دیگه همخوانی نداره و علت بسیاری از خطاهای دستوری میتونه بشه. چشمتون به این باشه!: &gt;= 12&gt; 1 &lt; 2.&#xA;true&#xA;13&gt; 1 &lt; 1.&#xA;false&#xA;14&gt; 1 &gt;= 1.&#xA;true&#xA;15&gt; 1 =&lt; 1.&#xA;trueچه اتفاقی میفته وقتی بگیم:  llama + 5 یا true == 5 ؟ بهترین راه برای دونستن اینه که امتحان کنیم و با یه پیام خطا حالمون جا بیاد!12&gt; 5 + llama.&#xA;** exception error: bad argument in an arithmetic expression&#xA;        in operator  +/2&#xA;            called as 5 + llamaچه بد!  واقعا ارلنگ دوست نداره که از نوع‌های اصلی‌ش بد استفاده بشه! اینجا شبیه ‌ساز یه پیام خطای خوشگل میده. میگه که یکی از دو آرگومانی که برای عملگر + استفاده شده رو دوست نداره! ارلنگ عصبانیتون می‌کنه وقتی که دو نوع داده متفاوت رو با هم مقایسه می‌کنین:‍‍‍‍‍‍‍‍‍‍‍‍13&gt; 5 =:= true.&#xA;falseچرا جلوی استفاده از نو‌ع‌های متفاوت رو توی بعضی عملیات میگیره و ولی توی بعضی نه؟ در حالی که ارلنگ نمیزاره  هر چیزی رو با هر جیز جمع کنین ولی اجازه میده که با هم مقایسه کنین. چونکه سازنده ارلنگ یه کم عملگرا بوده و گفته: این تصمیم میتونه خوب باشه که بشه به راحتی یه الگوریتم مرتب‌سازی عمومی درست کرد که هر واژه (Term) ای رو مرتب سازی کرد. برای اینه که زندگی‌تون رو ساده تر کنه. یک از آخرین چیزایی که وفتی دارین با جبر بولی و مقایسه‌ای کار میکنین به ذهن بسپارین اینه:14&gt; 0 == false.&#xA;false&#xA;15&gt; 1 &lt; false.&#xA;trueاگه با زبان‌های شی‌گرا کار کرده باشین باید بگین خط ۱۴ باید بشه true و خط ۱۵ باید بشه false! خب false   یعنی 0 و هر چیزی غیر اون یعنی true! به جز ارلنگ.ارلنگ چیزی به اسم true یا false بولی نداره. واژه‌های true و false اتم هستند ولی به خوبی توی زبان قرار گرفتند و شما نباید با اون مشکلی داشته باشید چونکه انتظار ندارین که false و true معانی غیر از false و true داشته باشند.توجه توجه: ترتیب هر عنصر توی مقایسه اینجوریه: number &lt; atom &lt; reference &lt; fun &lt; port &lt; pid &lt; tuple &lt; list &lt; bit string شما هنوز تمام این نوع‌ها رو نمی‌دونید ولی کم‌کم یاد می‌گیرید. فقط یادتون باشه علت اینکه شما میتونین هرچیزی رو با هر چیزی مقایسه کنین همینه!</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Sat, 20 Apr 2019 07:11:01 +0430</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - اتم‌ها</title><link>https://virgool.ir/erlang/اتم-ها-در-ارلنگ-xjo3vnijddm8</link><description> اَتُم (Atoms)‌‌ یک دلیل وجود داره که چرا نمیشه متغییر‌ها با حروف کوچک شروع بشن: اتم‌ها. اتم‌ها ثابت‌هایی هستند که مقدارشون با اسمشون یکیه. اتم cat یعنی &#34;cat&#34;. نمیتونین باهاش بازی کنین، نمیتونین تغییرش بدین و نمیتونین تیکه‌تیکه‌ش کنین. اون یه cat هست و با اون سرو‌کار دارین.درحالی که یک تک کلمه که با یک حرف کوچک شروع شده یعنی یک اتم، راه بیشتر هم برای تعریف یک اتم وجود داره:1&gt; atom.&#xA;atom&#xA;2&gt; atoms_rule.&#xA;atoms_rule&#xA;3&gt; atoms_rule@erlang.&#xA;atoms_rule@erlang&#xA;4&gt; &#39;Atoms can be cheated!&#39;.&#xA;&#39;Atoms can be cheated!&#39;&#xA;5&gt; atom = &#39;atom&#39;.&#xA;atomیک اتم اگر با حروف کوچک شروع نشه یا شامل کاراکترهایی غیراز حروف الفبا، زیر‌خط یا @ باشه باید درون یک جفت تک‌کوتیشن قراربگیرد. دستور ۵ همچنین نشون میده که  یک اتم با تک‌کوتیشن دقیقا با همون اتم بدون تک‌کوتیشن یکیه. خیلی نوشابه نخوریناتم‌ها یک راه خیلی عالی برای ارسال پیام یا نشون دادن ثابت‌ها هست. با این حال چند اشتباه هم ممکنه در استفاده از اتم ها پیش بیاد: یک اتم ارجاع به یک مورد در جدول اتم (atom table) داره که حافظه مصرف میکنه(۴ بایت در سیستم های ۳۲ بیتی و ۸ بایت در سیستم های ۶۴ بیتی). جدول اتم زباله روبی نمیشه (garbage collected) و بنابراین اتم‌ها زیاد میشن تا اینکه سیستم پر بشه یا برای استفاده از حافظه یا برای اینکه 1048577 اتم تعریف شده.این به این معنی است که اتم‌ها نباید به صورت پویا ایجاد بشن: اگه سیستم شما قراره ضریب اطمینان بالایی داشته باشه و ورودی کاربر این اجازه رو میده که کسی سیستم رو با ایجاد اتم از کار بندازه شما یک مشکل حاد دارین. اتم‌ها باید به عنوان ابزاری برای توسعه‌دهنده دیده بشه؛ باور کنین اتم ها برای همین درست شدن!توجه توجه: بعضی اتم‌ها کلمه کلیدی‌ هستند و نباید استفاده بشن مگر برای چیزی که طراح زبان خواسته: نام تابع‌ها، عملگر‌ها، دستورات و غیره. کلمه‌های کلیدی اینها هستند:  after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xorدر پست بعدی به جبر بولی و عملگرهای مقایسه‌ای خواهیم پرداخت.شب خوش</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Sat, 09 Feb 2019 20:44:27 +0330</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - متغیرها</title><link>https://virgool.ir/erlang/زبان-برنامه-نویسی-ارلنگ-متغیرها-zvvgfu42zgrw</link><description> متغیرهای تغییر ناپذیر!امکان انجام عملیات ریاضی خیلی خوبه ولی اگه نشه نتیجه رو جایی ذخیره کرد زیاد چنگی به دل نمیزنه. برای همین از متغیرها استفاده می‌کنیم. اگه مقدمه رو خونده باشین میدونین که توی برنامه‌نویسی تابع گرا متغیرها نمی‌تونن متغییر باشن. رفتار اولیه متغییرها توی این ۷ دستور نشون داده میشه ( نکته اینکه متغیرها با حروف بزرگ شروع میشن)1&gt; One.&#xA;* 1: variable &#39;One&#39; is unbound&#xA;2&gt; One = 1.&#xA;1&#xA;3&gt; Un = Uno = One = 1.&#xA;1&#xA;4&gt; Two = One + One.&#xA;2&#xA;5&gt; Two = 2.       &#xA;2&#xA;6&gt; Two = Two + 1.&#xA;** exception error: no match of right hand side value 3&#xA;7&gt; two = 2.&#xA;** exception error: no match of right hand side value 2اولین چیزی که این دستورها به ما میگن اینه که شما میتونین فقط یک بار یک مقدار رو به یک متغییر نسبت بدین؛ و شما میتونین وانمود کنین که یک مقدار رو به یک متغییر نسبت میدین اگر همون مقدار قبلا نسبت داده شده باشه. اگه مقدار جدید با مقدار قبلی فرق کنه ارلنگ شاکی میشه. این رفتار درسته ولی توضیحش یه‌کم سخته و به عملکرد عملگر = بستگی داره. عملگر = دو مقدار رو بررسی میکنه و اگه با هم فرق داشتن شاکی میشه. و اگه هم فرق نداشتن مقدار رو برمی‌گردونه.8&gt; 47 = 45 + 2.&#xA;47&#xA;9&gt; 47 = 45 + 3.&#xA;** exception error: no match of right hand side value 48اگه عبارت سمت چپ یک متغییری باشه که مقدار نگرفته هنوز، عملگر = چه رفتاری از خودش نشون میده؟ ارلنگ خودکار مقدار سمت راست رو به متغییر سمت چپ مقید (bind) میکنه و در نتیجه مقایسه سمت راست با سمت چپ درسته و متغییر مقدارش رو توی حافظه نگه میداره.رفتار عملگر = پایه چیزیه که بهش تطبیق الگو (pattern matching) میگیم که در خیلی از زبان‌های برنامه‌نویسی تابع‌گرا وجود داره. هرچند که روش ارلنگ منعطف تر و کامل تره. چیز بعدی که دستورات ۱تا۷ به ما میگن اینه که نام متغییر‌ها باید با حروف بزرگ شروع بشه. دستور ۷ چونکه two با حرف کوچک شروع شده به خطا میخوره. همچنین متغیر با زیر‌خط هم میتونه شروع بشه ولی قرارداد اینه که جایی استفاده کنین ازش که مقادیرش براتون اهمیت نداره ولی احساس می‌کنید برای خوانایی و مستند سازی برنامه نیازه که باشه.همچنین میتونین متغییر های داشته باشید که نامش فقط یه زیر‌خط هست:10&gt; _ = 14+3.&#xA;17&#xA;11&gt; _.&#xA;* 1: variable &#39;_&#39; is unboundبرخلاف متغیر های دیگه این متغیر هیج مقداری رو ذخیره نمی‌کنه. الان کلا بی‌فایده است ولی بعدا میبینین کجا بهش نیاز پیدا می‌کنیم.توجه توجه: اگه دارین توی Shell تست‌ها رو انجام میدین و یه مقدار رو اشتباهی توی یک متغییر ذخیره کردین میشه با تابع f(Variable) مقدارش رو پاک کرد. اگه هم میخواین تمام متغییر ها پاک بشن از تابع ()f استفاده کنین. این توابع فقط توی شل برای تست کارایی دارن. وقتی که داریم یه برنامه واقعی می‌نویسیم نیاز نمیشه که مقادیر رو به این صورت پاک کنیم.شب خوش</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Fri, 01 Feb 2019 20:18:30 +0330</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - اعداد</title><link>https://virgool.ir/erlang/زبان-برنامه-نویسی-ارلنگ-اعداد-eqhpfcogat48</link><description>ارلنگ زبان نسبتا کوچک و ساده‌ایه (مثل c که از ++c ساده تره). انواع داده‌های اصلی‌ش کمه و توی چند پست اکثر اونا رو پوشش میدیم. مطالعه اونا شدیدا توصیه میشه، چونکه اجزای اصلی تمام برنامه‌هایی است که بعدا می‌نویسن. اعداددر شل ارلنگ دستورات باید با نقطه و بعدش یک اینتر (Enter) تموم بشن، درغیر این صورت اجرا نمیشن. دستورات رو میتونین با کاما از هم جدا کنین، اما فقط نتیجه آخرین دستور نشون داده میشه (بقیه اجرا میشن ولی نتیجه نشون داده نمیشه). شل ارلنگ رو باز کنین و دستورات زیر رو بنویسید:1&gt; 2 + 15.&#xA;17&#xA;2&gt; 49 * 100.&#xA;4900&#xA;3&gt; 1892 - 1472.&#xA;420&#xA;4&gt; 5 / 2.&#xA;2.5&#xA;5&gt; 5 div 2.&#xA;2&#xA;6&gt; 5 rem 2.&#xA;1احتمالا متوجه شدین که برای ارلنگ اعداد اعشاری و ثابت فرقی نمیکنه: هر دو نوع توی عملیات ریاضی پشتیبانی میشه.عملگرهای ریاضی ارلنگ فقط با اعداد ثابت و اعشاری کار می‌کنند. اگه میخواین تقسیم صحیح انجام بدین از عملگر div و برای به‌دست آوردن باقیمانده هم از عملگر rem استفاده کنین.نکته اینکه مینونیم چندین عملگر رو توی یک دستور استفاده کنیم و عبارات ریاضی به ترتیب اولویت اجرا میشن. %Shell: this line for virgool editor bug!&#xA;7&gt; (50 * 100) - 4999.&#xA;1&#xA;8&gt; -(50 * 100 - 4999).&#xA;-1&#xA;9&gt; -50 * (100 - 4999).&#xA;244950برای نوشتن اعداد در مبنای غیر از ۱۰ هم از قالب Base#Value استفاده میشه که Base بازه بین ۲ و  ۳۶ رو شامل میشه.10&gt; 2#101010.&#xA;42&#xA;11&gt; 8#0677.&#xA;447&#xA;12&gt; 16#AE.&#xA;174عالیه! ارلنگ قدرتی داره مثل ماشین حساب گوشه میزتون ولی با یه شکل عجیب و غریب! واقعا هیجان‌ انگیزه! شب خوش</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Sun, 27 Jan 2019 00:26:05 +0330</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - شروع</title><link>https://virgool.ir/erlang/ارلنگ-شروع-jvbmzn3kpiya</link><description>شل (Shell)توی ارلنگ اکثر چیزا رو میشه توی شبیه ساز(emulator) تست کرد:  شبیه ساز وقتی که اسکریپت، کامپایل و لود بشه اونو اجرا میکنه. همچنین اجازه میده بعضی چیزا رو زنده‌زنده ویرایش کنین. برای اجرای شل توی لینوکس از دستور erl استفاده کنین. اگه همه چیز رو درست انجام داده باشین چیزی شبیه زیر باید ببینین:Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]&#xA;Eshell V5.7.2  (abort with ^G)تبریک میگم، شما شل ارنگ رو اجرا کردین! الان میتونیم کدها رو اجرا کنیم، اما بزارین اول ببینیم چجوری باهاش کار کنیم.دستورات شلاول از همه اگه یه چیزی تایپ کنین و ctrl+a رو بزنین اشاره‌گر میره اول خط و اگه ctrl+e رو بزنین میره آخر خط. اگه بنویسین li و Tab بزنین تکمیلش میکنه و مینویسه  lists: و اگه دوباره Tab بزنین اسم چندین تابع رو برای استفاده میاره. lists یک ماژول هست و تابع هایی پیشنهادی هم مال این ماژوله.خب حالا  نمیدونیم جه جوری از شل بریم بیرون: راهش اینه که help(). رو بزنیم و لیست دستورات شل رو ببینیم (نقطه آخرش رو فراموش نکنین چونکه برای اجرای دستور لازمه). بعضی از این دستورات رو بعدا استفاده می‌کنیم ولی الان این خط کار ما رو راه میندازه:q() -- quit - shorthand for init:stop()خب این یک راهشه(در واقع دو راه). اما این روش وقتی که شل freeze بشه جواب نمیده.اگه یادتون مونده باشه موقعی که شل رو اجرا کردیم اینو نوشته بود «aborting with ^G». خب ctrl+g رو بزنین بعدش هم h رو بزنین ببینیم چی میگه:User switch command&#xA;    --&gt; h&#xA;     c [nn]                 - connect to job&#xA;     i [nn]                  - interrupt job&#xA;     k [nn]                 - kill job&#xA;     j                         - list all jobs&#xA;     s [shell]             - start local shell&#xA;     r [node [shell]]   - start remote shell&#xA;     q                        - quit erlang&#xA;     ? | h                   - this message&#xA;   --&gt;اگه تایپ کنین i و بعدش c رو تایپ کنین(بعد از هر دستور، Enter یادتون نره) ارلنگ کد در حال اجرا رو متوقف میکنه و بعد به شل بر‌می‌گردین.اگه j رو بزنین لیست فرایندهای درحال اجرا رو نشون میده و میتونین هریک از این فرایند ها روبا i و بعدش شماره، متوقف (stop) کنین . اگه از k استفاده کنین، فرایند رو به‌جای متوقف کردن می‌کُشین(kill)! برای شروع یک فرایند جدید هم از s استفاده کنید. بریم مرحله بعد...</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Mon, 14 Jan 2019 20:14:47 +0330</pubDate></item><item><title>زبان برنامه نویسی ارلنگ - مقدمه</title><link>https://virgool.ir/erlang/ارلنگ-معرفی-f2vxhgr7jvep</link><description>ارلنگ چیست؟اولش این رو بگم که ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است. اگه تا حالا با زبان‌های دستوری کار کرده باشین عباراتی مثل ++i ممکنه براتون عادی باشه اما در برنامه نویسی تابع‌گرا مجاز نیست. در واقع تغییر دادن مقدار یک متغیر شدیدا ممنوعه!‍‍‍ ممکنه عجیب و غریب به نظر بیاد ولی اگه کلاس ریاضی رو یادتون باشه چیزی که یادگرفتین این بود:‍‍‍‍‍‍y = 2&#xA;x = y + 3&#xA;x = 2 + 3&#xA;x = 5اگه اینو اضافه کنیم:x = 5 + 1&#xA;x = x&#xA;∴ 5 = 6‍‍گیج شدین؟! برنامه‌نویس‍‍ی تابع‌گرا این را به رسمیت میشناسه. اگه ما بگیم که x برابر است با 5؛ منطقا نمتونیم مدعی باشیم برابر 6 هم هست! و همچنین اینکه یک تابع با پارامتر یکسان همیشه یه چیز برمیگردونه:x = add_two_to(3) = 5&#xA;∴ x = 5خروجی توابع با پارمترهای یکسان همیشه یکی است و تغییر نمی‌کنه که به این اصل referential transparency میگیم. این اصل چیزیه که اجازه میده add_two_to(3) رو با 5 جاگزین کنیم؛ در نتیجه 3+2  همیشه برابر با 5 است. این به این معنی است که میتونیم چندین تابع رو به هم بچسبونیم تا یک مسئله پیچیده تر رو حل کنیم بدون اینکه مشکلی پیش بیاد. منطقی و تروتمیز. اینجوری نیست؟ مشکلی هست این وسط:x = today() = 2018/10/22&#xA;-- یک روز صبر کنین --&#xA;x = today() = 2018/10/23&#xA;x = x&#xA;∴ 2018/10/22 = 2018/10/23وای نه! معادله زیبای من! ناگهان همه چیز اشتباه میشه! چجوریه میشه وقتی که خروجی تابع من هر روز فرق می‌کنه؟مشخصا مواردی وجود داره که خوبه referential transparency  نقض بشه. ارلنگ رویکرد عملگرایی با برنامه نویسی تابع‌گرا داره: پیروی کنید از اصلی ترین ویژگی ها (پرهیز کردن از تغییر دادن داده، referential transparency و غیره) اما وقتی به مسائل دنیای واقعی برخوردید این اصول رو نقض کنید .الان ارلنگ رو تعریف میکنیم: ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است، اما با تاکید بسیار زیاد روی همزمانی(concurrency) و قابلیت اطمینان بالا (high reliability). ارلنگ برای اینکه بتواند ده‌ها کار رو همزمان انجام بدهد از مدل بازیگر (actor model) بهره می‌برد و هر بازیگر یک فرایند (process) ماشین مجازی است. اگه شما یه بازیگر در جهان ارلنگ بودید، یک شخص تنهایی هستید که در یک اتاق تاریک بدون پنچره نشسته‌اید و منتظرین تا یک نامه‌ای رو از صندوق‌ پستی بگیرین. وقتی که نامه رو گرفتین، یک کار مشخصی میکنین: صورتحساب رو پرداخت میکنین وقتی که یک صورتحساب گرفتین؛ وقتی یه کارت تبربک گرفتین، یه نامه «تشکر» مینویسین و  بی‌خیال نامه هایی میشین که درکی ازش ندارین.مدل بازیگر رو میشه اینجوری تصور کرد: جهانی که هر کس  تنها توی اتاق خودش نشسته و میتونه چند تا کار مشخصی رو انجام بده. همه افراد فقط با نامه باهم ارتباط برقرار میکنن. همزمانی که ممکنه یه زندگی حصوله سر بر باشه به معنی این هم هست که شما از افراد دیگه درخواست میکنین که کارای خیلی خاصی رو براتون انجام بدن و هیچکدومشون کارشون رو اشتباه انجام نمیدن یا کاری نمیکن که پیامدی توی کار دیگران داشته باشه؛ ممکنه اونها حتی از وجود افرادی غیر از شما اطلاعی نداشته باشن.ارلنگ شما رو مجبور میکنه که بازیگرهایی (process) رو بنویسین که هیچ اطلاعاتی رو با هم به اشتراک نمی‌گزارن مگر اینکه اونها برای همدیگه پیام بفرستن که این گفتگو صریح، قابل ردیابی و بی‌خطر است.وقتی ما ارلنگ رو تعریف میکردیم در سطح زبان بودیم ولی در یک معنای وسیعتر این همه اون چیزی نیست که وجود داره؛ ارلنگ یک محیط توسعه هم هست. کد به بایت‌کد ترجمه میشود و داخل ماشین مجازی اجرا می‌شود. بنابراین ارلنگ شبیه جاوا و بچه‌هاش همه جا میتونن اجرا بشن. توزیع استاندارد ارلنگ شامل ابزار‌های توسعه ( کامپایلر، دیباگر، پروفایلر و فریمورک تست)، فریمورک OTP، یک وب سرور،پایگاه داده mnesia؛ یک سیستم ذخیره سازی کلید-مقدار که میتونه خودشو روی چندین سرور توزیع کنه؛از تراکنش های چند سطحی پشتیبانی میکنه و اجازه میده بهتون هر نوع داده‌ی ارلنگ رو ذخیره کنین.ماشین مجازی و کتابخونه ها به شما اجازه میدن که کد های سیستم در حال اجرا رو تغییر بدین بدون اینکه در اجرای برنامه وقفه ای به وجود بیاد، اجازه میدن به راحتی کدتون رو روی چند کامپیوتر توزیع کنین و خطاها رو به شکل ساده ولی قدرتمندی مدیریت کنین. جلوتر میبینم که چجوری از این ابزارها استفاده میشه ولی برای الان بزارید یک قانون کلی در ارلنگ رو بگم: «بزار سقوط کنه!» نه شبیه یک هواپیما با ده‌ها مسافر که دارن میمیرن بلکه بیشتر شبیه کسی که در ارتفاع روی یک توری مطمئن داره راه میره. درحالی که شما سعی میکنین اشتباه نکنین، نیازی هم نیست که هر نوع خطا یا شرایط خطا رو در اغلب موارد چک کنین.با توجه به توانایی ارلنگ در بازیابی خودش در خطاها، سازماندهی کد با بازیگرها و مقیاس‌پذیرکردن آن با توزیع روی چند سرور و همزمانی که همه‌اش محشره، به بخش بعدی می‌رویم...خیلی نوشابه نخورین!ارلنگ در بعضی زمینه ها خیلی خوبه و عشاق ارلنگ ممکنه چیزایی بیشتر از اون چیزی که واقعا هست بگن.اولین مورد مربوط به قابلیت مقیاس پذیری بالای ارلنگ هست که ناشی از فرایندهای سبکش هست: درسته که فرایند‌های ارلنگ خیلی سبکه و شما میتونین صدها و هزارها فرایند همزمان داشته باشین،اما به این معنی نیست که فرایندها رو ایجاد کنین فقط به خاطر اینکه میتونین داشته باشین. مثلا در یک بازی تفنگی، اینکه هرچیزی حتی گلوله ها بازیگر خودشون رو داشته باشن دیوانگیه. برای ارسال پیام از یک بازیگر به بازیگر دیگه هنوز هزینه اندکی وجود داره و اگه خیلی کارها رو بشکنین فقط کارها رو کندتر کردین!بعدا با عمق بیشتری این مباحث رو پوشش میدیم اما در ذهنتون داشته باشین که  برای حل یک مسئله کافی نیست به صورت تصادفی همزمانی رو ایجاد کنیم و کارها سریعتر انجام بشه. غمگین نشین؛ موقعیت‌هایی وجود داره که استفاده از صدها فرایند، هم ممکنه و هم مفیده؛ فقط همیشه این اتفاق نمی‌افته.همچنین گفته میشه که ارلنگ میتونه به تناسب تعداد هسته cpu به صورت خطی مقیاس پذیر باشه، اما این حرف معمولا درست نیست:  این کار امکان پذیره ولی اغلب مسائل جوری نیستند که شما بتونین فقط همه چیز رو در یک زمان اجرا کنین و مشکل حل بشه.یه چیز دیگه هم هست که تو ذهنتون داشته باشین: در حالی که ارلنگ بعضی کارها رو خوب انجام میده، میشه همون نتیجه رو با یک زبان دیگه هم گرفت، برعکسش هم درسته؛ نیاز هست که هر مسئله‌ای درست ارزیابی بشه و متناسب با اون ابزارش هم انتخاب بشه. ارلنگ در بعضی زمینه‌ها آش دهن سوزی نیست، مخصوصا برای کارهایی مثل پردازش تصویر، درایور سیستم عامل و غیره و در برخی زمینه ها هم عالیه مثل نرم‌افزاهای بزرگ سروری (مثل صف، نگاشت-کاهش)، پیاده سازی پروتکل های سطح بالاتر، پیام‌رسان و غیره. موضوعات این وسط بستگی به شما داره. الزاما خودتون رو در ارلنگ به نرم‌افزار های سروری محدود نکنین. مواردی وجود داره که افراد کارهای غیرمنتظره و شگفت‌انگیزی هم انجام دادن، مثلا ربات IANO که توسط تیم UNICT درست شده و برای هوش مصنوعی این ربات از ارلنگ استفاده شده و در مسابقات یوروبات ۲۰۰۹ مدال نقره رو هم برنده شده. مثال دیگه‌ش Wings 3D هست، یک مدل کننده سه بعدی (نه رندرکننده) که متن بازه و با ارلنگ نوشته شده و بنابراین چند سکویی هم هست.برای شروع چه چیزی نیاز دارین؟ یک ادیتور نیاز دارین و یک محیط ارلنگ. کدمنبع و نصاب ویندوزش رو میتونین از سایت رسمی ارلنگ دریافت کنین. در ویندوز کافیه دریافت کنین و اجراش کنین؛ فقط یادتون باشه مسیر نصب رو داخل PATH سیستم عامل قرار بدین تا همه جا در دسترس باشه.روی لینوکس هم به راحتی و با دستور زیر نصب کنینapt-get install erlang # debain based linux&#xA;yum install erlang # redhat based linuxروز خوش یا هم شب بخیر!</description><category>محمد خدادادی</category><author>محمد خدادادی</author><pubDate>Fri, 04 Jan 2019 15:49:40 +0330</pubDate></item></channel></rss>