المسارات
/
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)
        })
      })
    })
  })
}

تسمح لنا تعبيرات use في Gleam بكتابة هذا الكود دون الإزاحة، مما يجعله غالبًا أسهل في القراءة.

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)
}

تعبيرات use في Gleam ميزة قوية جدًا يمكن تطبيقها على الكثير من المسائل، لكن الإفراط في استخدامها قد يجعل الكود صعب القراءة. ويُفضَّل عمومًا استخدام صيغة استدعاء الدوال العادية، وألا نلجأ إلى تعبيرات use إلا عندما تجعل الكود أسهل في القراءة.

التعليمات

كانت دافني تعمل على نظام لتشغيل تجاربها وتسجيل نتائجها. أصبح بعض الكود مطوّلًا ومكررًا نوعًا ما، لذا طلبت منك كتابة بعض تعبيرات use للمساعدة في تنظيفه.

1. عرّف دالة with_retry

قد تفشل التجارب أحيانًا بسبب خطأ عابر، لذا إذا فشلت تجربة ما، تريد دافني إعادة محاولتها لمعرفة ما إذا كانت ستنجح في المرة الثانية.

عرّف دالة with_retry التي تأخذ دالةً تُرجع نتيجة كوسيط.

إذا أرجعت الدالة قيمة Ok فينبغي أن تُرجع with_retry تلك القيمة.

وإذا أرجعت الدالة قيمة Error فينبغي أن تستدعي with_retry الدالة مرة أخرى وتُرجع نتيجة ذلك الاستدعاء.

ستستخدم دافني الدالة هكذا:

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

2. عرّف دالة record_timing

تسجّل دافني المدة التي تستغرقها كل تجربة في التشغيل عبر استدعاء دالة لتسجيل الوقت قبل كل تجربة وبعدها.

عرّف دالة record_timing التي تأخذ وسيطين:

  • دالة لتسجيل الوقت لا تأخذ أي وسائط وتُرجع Nil.
  • دالة للتجربة لا تأخذ أي وسائط وتُرجع نتيجة.

ينبغي أن تستدعي record_timing دالة تسجيل الوقت، ثم تستدعي دالة التجربة، ثم تستدعي دالة تسجيل الوقت مرة أخرى، وأخيرًا تُرجع نتيجة دالة التجربة.

ستستخدم دافني الدالة هكذا:

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 تلك القيمة.

ستستخدم دافني الدالة هكذا:

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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.