دنیای جدید جاوا اسکریپت - Reason ML

چند ماه بود که میخواستم این مطلب رو بنویسم . اما زمان بیشتری گذاشتم تا بتونم بیشتر با این موضوع دوست بشم و بدونم دقیقا باید چجوری باهاش کار کنم .

ماجرا اینه که ، همیشه دنیای برنامه نویسی میره به سمت ساده شدن . البته با رفع دغدغه ها و نیاز های جدید .

این موضوع داخل جاوا اسکریپت مستثنا نیست . نه تنها متسثنا نیست ، بلکه میشه گفت جاوا ایکریپت بزرگترین دنیای برنامه نویسی در حال تغییر هست ( نگفتم بزرگترین دنیای برنامه نویسی هست ) . یعنی تغییر و تحولات این stack اونقدر زیاده که در یک 24 ساعت ، تحولات عجیبی دیده میشه .

موضوع ما هم یکی از همین تغییرات هست .

شرکت facebook از ابتدای کار ، شروع به تولید علم کرد تا به امروز . از HHVM تا React reason و React.js که بیشتر شهرت داره .
تقریبا حدد یک سال میشه که ReasonMl به بازار برنامه نویسی راه پیدا کرده . اما خیلی با صدای کم و به دور از حاشیه . خیلی اتفاقی داخل ریپوزیتوری های فیس بوک دیدمش و بعد متوجه شدم یکی از بهترین کارهای فیس بوک بوده .
اول ببینیم داستان از کجا شروع میشه .

سادگی در کد نویسی

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

type tree = Leaf of int | Node of tree * tree

let rec exists_leaf test tree =
  match tree with
  | Leaf v -> test v
  | Node (left, right) ->
      exists_leaf test left
      || exists_leaf test right

let has_even_leaf tree =
  exists_leaf (fun n -> n mod 2 = 0) tree

کد بالا شاید از یک جهاتی راحت باشه . مثل اینکه درک راحتی از سینتکس برنامه به ما میده و زبان خیلی ساده ای داره .
اما ایراد بزرگش اینه که ما نمیدونیم اصلا این زبان داره در مورد چی صحبت میکنه . چون بعضی سینتکس ها تا به حال دیده نشده . اما مطمئن باشید خیلی کار رو راحت میکنه . جلوتر میبینیم .

کد بالا مربوط به زبان OCaml . Ocaml یک زبان با استفاده صنعتی برای نوشتن کد های پیچیده اما با سینتکس بسیار راحتتر هست که از استایل شی گرایی هم پشتیبانی میکنه . گاهی اوقات یک اشتباه در کد نویسی هزینه های خیلی بالایی ممکنه به بار بیاره و رفع اون باگ هم زمانبر میشه . با استفاده از OCaml شما میتونین خیلی دقیقتر و با خطای کمتر کد بزنین .
در مورد OCaml زیاد نمیگم . قصدم اینه که به Reason ML برسیم .

دقیقا Reason ML چیست؟

Reason Ml یک زبان جدید نیست . بلکه یک سینتکس جدید هست که از OCaml قدرت گرفته .

در واقع با تلفیق جاوا اسکریپت و OCaml یک سینتکس بر پایه جاوا اسکریپت ایجاد شد که خروجی اون در نهایت یک فایل js خواهد بود . اما در محیط فایل های re . برای مثال ما یک فایل به اسم Hello.re ایجاد میکنیم و بعد از کامپایل شدن به Hello.bs.js تبدیل میشه که قابل درک برای موتور node.js هست .

In that regard, Reason can almost be considered as a solidly statically typed, faster and simpler cousin of JavaScript, minus the historical crufts, plus the features of ES2030 you can use today, and with access to both the JS and the OCaml ecosystem!

برای اینکه فایل های re به جاوا اسکریپت تبدیل بشن از کتابخانه ای به اسم BuckleScript استفاده شده (میشه گفت یک کارایی شبیه به گالپ یا وب پک داره . اما برای Reason ML).

چرا از Reason ML استفاده کنم؟

  • محیط برنامه نویسی جذاب
  • کد جاوا اسکریپت در بهینه ترین حالت با پرفورمنس بالا
  • استفاده از برتری های OCaml در کد نویسی و سرعت بالای نوشتن
  • امکانات و اکوسیستم قدرتمند

کمی کد بزنیم

بعد از همه این موارد بهتره مثل همیشه یک Hello World بنویسیم و نصب و راه اندازی رو با هم کار کنیم .

اول از همه نصب کردن رو به شکل زیر انجام میدیم .

yarn global add bs-platform

بعد از نصب کردن bs-platform به صورت گلوبال ، خیلی راحت میتونیم همه جا برای ایجاد یک پروژه از این لایبرری استفاده کنیم .

با کد زیر میتونیم یک پروژه ایجاد کنیم .

bsb -init my-new-project -theme basic-reason

حالا با دستور زیر پروژه را اجرا میکنیم .

cd my-new-project
yarn build # or npm run build, for npm
node src/Demo.bs.js

خروجی چیزی شبیه به کد زیر خواهد بود :

86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

اما کمی بیشتر کدهای داخل Demo.re رو ببینیم :

let fizzbuzz = i =>
  switch (i mod 3, i mod 5) {
  | (0, 0) => "FizzBuzz"
  | (0, _) => "Fizz"
  | (_, 0) => "Buzz"
  | _ => string_of_int(i)
  };

for (i in 1 to 100) {
  Js.log(fizzbuzz(i));
};

در کد بالا که داخل پوشه src هست ، یک متغیر به اسم fizzBuzz داریم که با یک switch case ، متغیر i رو به 5 و 3 تقسیم میکند و mod آن ها را میگیرد . حالا اگر مد 3 ، 0 و 5 هم 0 باشدfizzBuzz . اگر 0 و هرچی باشد Fizz و اگر هرچی و 0 باشد Buzz و در هر حالت دیگه ، i رو چاپ میکنه . حالا برای اینکه این متغیر درست کار کنه باید داخل حلقه قرار بگیره که در آخر این اتفاق افتاد .

حالا بریم کد جاوا اسکریپت نظیر این کد رو ببینیم :

'use strict';


function fizzbuzz(i) {
  var match = i % 3;
  var match$1 = i % 5;
  if (match !== 0) {
    if (match$1 !== 0) {
      return String(i);
    } else {
      return "Buzz";
    }
  } else if (match$1 !== 0) {
    return "Fizz";
  } else {
    return "FizzBuzz";
  }
}

for(var i = 1; i <= 100; ++i){
  console.log(fizzbuzz(i));
}

exports.fizzbuzz = fizzbuzz;

خوب میبینیم که کد نویسی در محیط Reason ML چقدر جذابتر و بهتره .

در اینده در مورد این سینتکس بیشتر صحبت میکنیم . امیدوارم روزی برسه که به سمت این سینتکس بریم و همه چیز رو سادهتر و حرفه ایتر کنیم .

راستی برای react.js دولوپر ها هم یک خبر خوب دارم .

Reason ml برای ری اکت به اسم Reason React یک کتابخانه زده . که استانداردهای خیلی جالبی رو پیاده کرده و دیگه درگیر life cycle ری اکت نمیشید . طرز تفکر روی ری اکت تغییر زیادی خواهد کرد . متاسفانه کامپوننت های کمی برای ریزن ری اکت وجود دارند که باعث شده هنوز به این سمت نریم . اما تا یک سال اینده شاهد این تحولات خواهیم بود .