ট্র্যাক
/
Gleam
Gleam
/
অনুশীলনী
/
এক্সপার্ট এক্সপেরিমেন্টস
এক্সপার্ট এক্সপেরিমেন্টস

এক্সপার্ট এক্সপেরিমেন্টস

লার্নিং অনুশীলনী

ভূমিকা

use এক্সপ্রেশন

Gleam-এ হায়ার অর্ডার ফাংশন লেখা ও ব্যবহার করা খুব কমন একটি বিষয়, অর্থাৎ এমন ফাংশন যা আর্গুমেন্ট হিসেবে অন্য ফাংশন গ্রহণ করে। কখনও কখনও একসাথে অনেকগুলো হায়ার অর্ডার ফাংশন ব্যবহার করলে কোড পড়া কঠিন হয়ে যেতে পারে, কারণ তখন ইনডেন্টেশনের অনেক স্তর তৈরি হয়।

উদাহরণ হিসেবে, এখানে এমন একটি ফাংশন দেওয়া হলো যা এমন কয়েকটি ফাংশন কল করে যেগুলো Result(Int, Nil) রিটার্ন করে, এবং চারটি ফাংশনই সফল হলে মানগুলো যোগ করে।

import gleam/result

pub fn main() -> Result(Int, Nil) {
  result.try(function1(), fn(a) {
    result.try(function2(), fn(b) {
      result.try(function3(), fn(c) {
        result.try(function4(), fn(d) {
          Ok(a + b + c + d)
        })
      })
    })
  })
}

Gleam-এর use এক্সপ্রেশন আমাদের এই কোডটি ইনডেন্টেশন ছাড়াই লিখতে দেয়, যা প্রায়শই কোড পড়া আরও সহজ করে তোলে।

import gleam/result

pub fn main() -> Result(Int, Nil) {
  use a <- result.try(function1())
  use b <- result.try(function2())
  use c <- result.try(function3())
  use d <- result.try(function4())
  Ok(a + b + c + d)
}

একটি use এক্সপ্রেশন ব্লকের পরের সব স্টেটমেন্ট একসাথে সংগ্রহ করে এবং সেটিকে একটি কলব্যাক ফাংশন হিসেবে ফাংশন কলে শেষ আর্গুমেন্ট হিসেবে পাঠিয়ে দেয়। use কিওয়ার্ড এবং <- চিহ্নের মাঝের ভ্যারিয়েবলগুলো হলো সেই আর্গুমেন্টগুলোর নাম, যেগুলো কলব্যাক ফাংশনে পাঠানো হবে।

// This use expression
use a <- function(1, 2)
io.println("Hello!")
a

// Is equivalent to this normal function call
function(1, 2, fn(a) {
  io.println("Hello!")
  a
})

কলব্যাক ফাংশন যেকোনো সংখ্যক আর্গুমেন্ট নিতে পারে, আবার একটিও নাও নিতে পারে।

use a, b, c, d <- call_4_function()

use <- call_0_function()

use এক্সপ্রেশন দিয়ে কল করা যায় এমন একটি ফাংশন তৈরির জন্য শেষ আর্গুমেন্ট হিসেবে একটি কলব্যাক ফাংশন নেওয়া ছাড়া আর কোনো বিশেষ শর্ত নেই।

pub fn call_twice(function: fn() -> t) -> #(t, t) {
  let first = function()
  let second = function()
  #(first, second)
}

Gleam-এর use এক্সপ্রেশন একটি অত্যন্ত শক্তিশালী ফিচার, যা অনেক সমস্যায় কাজে লাগানো যায়, কিন্তু বেশি ব্যবহার করলে কোড পড়া কঠিন হয়ে যেতে পারে। সাধারণত সাধারণ ফাংশন কল সিনট্যাক্স ব্যবহার করাই বেশি পছন্দনীয়, আর use এক্সপ্রেশনের সাহায্য নেওয়া উচিত শুধু তখনই, যখন তা কোড পড়া সহজ করে তোলে।

নির্দেশনা

Daphne তার পরীক্ষাগুলো চালানো এবং সেগুলোর ফলাফল রেকর্ড করার একটি সিস্টেম নিয়ে কাজ করছেন। কোডের কিছু অংশ বেশ ভার্বোজ ও পুনরাবৃত্ত হয়ে গেছে, তাই পরিষ্কার করার জন্য তিনি আপনাকে কিছু use এক্সপ্রেশন লিখতে বলেছেন।

1. with_retry ফাংশনটি ডিফাইন করুন

মাঝে মাঝে একবারের ভুলে পরীক্ষা ব্যর্থ হতে পারে, তাই কোনো পরীক্ষা ব্যর্থ হলে Daphne সেটি আবার চেষ্টা করে দেখতে চান, দ্বিতীয়বার কাজ করে কি না।

with_retry ফাংশনটি ডিফাইন করুন, যেটি আর্গুমেন্ট হিসেবে এমন একটি ফাংশন নেয় যা একটি ফলাফল রিটার্ন করে।

ফাংশনটি যদি একটি Ok মান রিটার্ন করে, তাহলে with_retry সেই মানটি রিটার্ন করবে।

ফাংশনটি যদি একটি Error মান রিটার্ন করে, তাহলে with_retry ফাংশনটিকে আবার কল করবে এবং সেই কলের ফলাফল রিটার্ন করবে।

Daphne ফাংশনটি এভাবে ব্যবহার করবেন:

pub fn main() {
  use <- with_retry
  // Perform the experiment here
}

2. record_timing ফাংশনটি ডিফাইন করুন

Daphne প্রতিটি পরীক্ষার আগে ও পরে একটি টাইম লগিং ফাংশন কল করে প্রতিটি পরীক্ষা চালাতে কত সময় লাগে তা রেকর্ড করেন।

record_timing ফাংশনটি ডিফাইন করুন, যেটি দুটি আর্গুমেন্ট নেয়:

  • একটি টাইম লগিং ফাংশন, যেটি কোনো আর্গুমেন্ট নেয় না এবং Nil রিটার্ন করে।
  • একটি পরীক্ষা ফাংশন, যেটি কোনো আর্গুমেন্ট নেয় না এবং একটি ফলাফল রিটার্ন করে।

record_timing প্রথমে টাইম লগিং ফাংশনটি কল করবে, তারপর পরীক্ষা ফাংশনটি কল করবে, তারপর আবার টাইম লগিং ফাংশনটি কল করবে এবং সবশেষে পরীক্ষা ফাংশনের ফলাফল রিটার্ন করবে।

Daphne ফাংশনটি এভাবে ব্যবহার করবেন:

pub fn main() {
  use <- record_timing(time_logger)
  // Perform the experiment here
}

3. run_experiment ফাংশনটি ডিফাইন করুন

একটি পরীক্ষা তিনটি ধাপে গঠিত। সেটআপ, অ্যাকশন আর রেকর্ডিং। তিনটি ধাপই ফলাফল রিটার্ন করে, এবং প্রতিটি ধাপ চালানোর জন্য আগের ধাপের সফল ফলাফল দরকার।

run_experiment ফাংশনটি ডিফাইন করুন, যেটি চারটি আর্গুমেন্ট নেয়:

  • পরীক্ষার নাম, একটি String হিসেবে।
  • একটি সেটআপ ফাংশন, যেটি কোনো আর্গুমেন্ট নেয় না এবং একটি ফলাফল রিটার্ন করে।
  • একটি অ্যাকশন ফাংশন, যেটি আর্গুমেন্ট হিসেবে সেটআপ ফাংশনের Ok মানটি নেয় এবং একটি ফলাফল রিটার্ন করে।
  • একটি রেকর্ডিং ফাংশন, যেটি আর্গুমেন্ট হিসেবে সেটআপ ও অ্যাকশন ফাংশনের Ok মান নেয় এবং একটি ফলাফল রিটার্ন করে।

তিনটি ফাংশনই যদি সফল হয়, তাহলে run_experiment Ok(#(experiment_name, recording_data)) রিটার্ন করবে।

ফাংশনগুলোর যেকোনোটি যদি একটি Error মান রিটার্ন করে, তাহলে run_experiment সেই মানটি রিটার্ন করবে।

Daphne ফাংশনটি এভাবে ব্যবহার করবেন:

pub fn main() {
  use setup_data, action_data <- run_experiment("Test 1", setup, action)
  // Record the results here
}
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Gleam Exercism

এক্সপার্ট এক্সপেরিমেন্টস শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Gleam ট্র্যাকের 33টি কনসেপ্ট122টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।