مسیرها
/
Bash
Bash
/
تمرین‌ها
/
عملیات لیست
عملیات لیست

عملیات لیست

متوسط

دستورالعمل‌ها

عملیات پایه‌ای لیست را پیاده‌سازی کنید.

در زبان‌های تابعی، عملیات لیست مانند length، map و reduce بسیار رایج‌اند. مجموعه‌ای از عملیات پایه‌ای لیست را بدون استفاده از توابع موجود پیاده‌سازی کنید.

تعداد و نام دقیق عملیاتی که باید پیاده‌سازی شوند بسته به track است تا با نام‌های موجود تداخل نکنند، اما عملیات کلی که پیاده‌سازی می‌کنید عبارت‌اند از:

  • append (با گرفتن دو لیست، همه‌ی عناصر لیست دوم را به انتهای لیست اول اضافه می‌کند)؛
  • concatenate (با گرفتن چندین لیست، همه‌ی عناصر همه‌ی لیست‌ها را در یک لیست مسطح ترکیب می‌کند)؛
  • filter (با گرفتن یک «محمول» و یک لیست، لیست همه‌ی عناصری را برمی‌گرداند که predicate(item) برایشان «درست» است)؛
  • length (با گرفتن یک لیست، تعداد کل عناصر آن را برمی‌گرداند)؛
  • map (با گرفتن یک تابع و یک لیست، لیست نتایج اعمال function(item) روی همه‌ی عناصر را برمی‌گرداند)؛
  • foldl (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت چپ در انباشتگر تا می‌کند (کاهش می‌دهد))؛
  • foldr (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت راست در انباشتگر تا می‌کند (کاهش می‌دهد))؛
  • reverse (با گرفتن یک لیست، لیستی برمی‌گرداند که همه‌ی عناصر اصلی را دارد، اما با ترتیب معکوس).

توجه کنید که ترتیبی که آرگومان‌ها به توابع تا (foldl، foldr) داده می‌شوند اهمیت دارد.

کتابخانه‌ای از توابع

این نخستین تمرینی است که می‌بینیم و در آن راه‌حلی که می‌نویسیم یک اسکریپت main نیست. ما یک کتابخانه می‌نویسیم تا درون اسکریپت‌های دیگری که توابع ما را فراخوانی می‌کنند source شود.

namerefها در Bash

این تمرین مستلزم استفاده از متغیرهای nameref است. این کار به نسخه‌ی حداقل ۴.۰ از bash نیاز دارد. اگر از bash پیش‌فرض روی MacOS استفاده می‌کنید، باید نسخه‌ی دیگری نصب کنید: به نصب Bash نگاه کنید.

namerefها راهی برای ارسال یک متغیر به یک تابع به‌صورت ارجاعی هستند. به این ترتیب، متغیر می‌تواند درون تابع تغییر کند و مقدار به‌روزشده در حوزه‌ی فراخوانی‌کننده در دسترس باشد. این هم یک مثال:

prependElements() {
    local -n __array=$1
    shift
    __array=( "$@" "${__array[@]}" )
}

my_array=( a b c )
echo "before: ${my_array[*]}"    # => before: a b c

prependElements my_array d e f
echo "after: ${my_array[*]}"     # => after: d e f a b c
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Bash Exercism

آماده‌اید عملیات لیست را شروع کنید؟

در Exercism ثبت‌نام کنید تا Bash را همراه با 97 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق عملیات لیست!

از مقدمه‌ای عملی بر بازگشت لذت ببرید، جایگزین‌های دستوری و تابعی «عملیات لیست» را بررسی کنید و به بازگشت دنباله‌ای و توابع انباره عمیق شوید.