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

عملیات لیست

متوسط

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

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

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

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

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

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

ضمیمه

Note

دستورالعمل‌های بالا با یک مخزن مشترک همگام‌سازی شده‌اند تا یکدستی میان همه‌ی مسیرهای زبانی تضمین شود. این ضمیمه توضیح بیشتری می‌دهد یا در صورت نیاز دستورالعمل‌ها را تغییر می‌دهد تا هم‌راستایی بهتری با اهداف مسیر Clojure داشته باشد.

در این تمرین در مسیر Clojure، فرض کنید که هم ورودی و هم خروجی بردار هستند، همان‌طور که تست‌ها نشان می‌دهند. به‌عنوان یک هدف چالشی، به این فکر کنید که چگونه رویکردی را پیاده‌سازی کنید که در مراحل میانی از لیست استفاده نمی‌کند.

مهم است که از توابع توکار موجود Clojure با کارکرد مشابه دوباره استفاده نکنید، چون این کار ارزش یادگیری مورد نظر تمرین را کاهش می‌دهد. توابع کلیدی در فضای نام clojure.core که باید از آن‌ها پرهیز کنید عبارت‌اند از into، concat، cat، lazy-cat، mapcat، flatten، filter، filterv، remove، count، map، mapv، reduce، transduce، reverse و rseq.

اهداف اختیاری

هدف اختیاری برای کسانی است که چالش بیشتری می‌خواهند و با این فرض طراحی شده که هدف اصلی را از قبل به پایان رسانده‌اید.

سعی کنید تست‌ها را با طراحی رویکردی بگذرانید که فرض می‌کند:

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

اگر تصمیم گرفتید آن را منتشر کنید، حتماً کامنتی اضافه کنید که نشان دهد این راه‌حل به هدف اختیاری استفاده از لیست‌ها می‌پردازد. به‌روزرسانی داک‌استرینگ‌ها را هم فراموش نکنید!

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Clojure Exercism

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

در Exercism ثبت‌نام کنید تا Clojure را همراه با 12 مفهوم105 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

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

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