آموزش کلوژر 7 - لیست


#1

سلام تو این پست راجع به لیست ها صحبت می کنیم .

لیست

لیست ها پیاده سازی ساختار داده Linked List هستش
ساختار یک Linked List به شکلی هست که میبینید .

download

در واقع هر عضو Linked List شامل دو بخش هست بخش اول مقدار اون عضو و بخش دوم آدرس عضو بعدی اون Linked List هست .
پس لیست ها در واقع پیاده سازی این ساختار در کلوژر هست حالا به کد زیر نگاه کنید .

'(first-element second-element third-element forth-element)

توی این کد ما یک لیست در کلوژر مشخص کردیم . اینکه " ’ " چه کاری میکنه رو بعدا میبینیم اما فعلا میبینیم که برای تعریف یک لیست در کلوژر اعضای اون لیست رو در بین دو تا پرانتز قرار میدیم .
اما چطور میشه این لیست رو ویرایش کرد ؟
اضافه کردن دیتا
همونطور که قبلا گفتیم در کلوژر دیتا ها immutable هستن یعنی قابل تغییر نیستند و تنها راه تغییر یک لیست در واقع ایجاد یک لیست جدید هست ولی نگران نشید این کار در کلوژر به شکل خیلی بهینه ای اتفاق میفته که اگر فرصتی بود بعدا میبینیم اما الان بیاین و یه خرده لیست رو ویرایش کنیم .

(def my-list '("Sameer" "Toomaj"))
(cons "Amirreza" my-list)

در کد بالا ما اول یک لیست تعریف کردیم به به اسم my-list بایند کردیم .
در خط دوم ما از فانکشن cons استفاده کردیم که از فانکشن های استاندارد کلوژر هست استفاده کردیم . عملکرد این فانکشن به این صورت هست که در آرگیومنت اول یک دیتا و در آرگیومنت دوم یک لیست میگیره و اون دیتا رو به اول لیست اضافه میکنه .
حذف دیتا
حالا بیایم یک دیتا رو از لیست حذف کنیم .

(pop my-list)
("Toomaj") <==

خب اینجا با استفاده از فانکشن pop ما اولین عضو لیست رو حذف کردیم یا به عبارت بهتر یک لیست جدید تولید کردیم که خبری از عضو اولی که “Sameer” بود توش نیست .
دلیل اینکه عملیات های ما در List ها چه اضافه کردن و چه حذف کردن در ابتدای لیست اتفاق میفتند به دلیل اینه که زمانی این عملیات ها در ابتدای لیست بصورت (O(1 هست ولی در صورتی که جایی غیر از ابتدای لیست این اتفاق بیفته این زمان به (O(n تبدیل میشه که خیلی محل بحث ما نیست ولی به طور خلاصه بدونید که بهینه ترین حالت ممکن برای اضافه یا کم کردن عضو به یک لیست در ابتدای اون لیست هست .

peek

فانشکن peek اولین عضو لیست رو برای ما برمیگردونه یعنی :

(peek my-list) 
==> ("Sameer")

خب در کد بالا هم به طور مشخص فانشکن peek برای ما اولین عضو لیست که “Sameer” بود رو برگردوند .

rest
آخرین فانکشنی که در مورد لیست ها بررسی میکنیم فانکشن rest هست

(def my-list ("Toomaj" "Sameer" "Amirreza" "Pouya"))
(rest my-list) 
==> ("Sameer" "Amirreza" "Pouya")

عملکرد فانشکن rest به این صورت هست که بعد از عضو اول تمام اعضا رو برمیگردونه به عبارت دیگه از عضو دوم به بعد رو برای ما برمیگردونه .

فکر میکنم برای یک آشنایی اولیه با لیست ها کافی باشه فانشکن های خیلی بیشتری وجود دارن اما در حد آشنایی اولیه فکر میکنم کافی باشه .


#2

از اونجایی که دوست دارم با کمترین ابزار ممکن کار کنم، تو نوشتن تابع ها فقط از لیست استفاده کردم. این کارایی کدم رو پایین میاره؟ باید حتما از یه دیتا تایپ دیگه مثل آرایه استفاده کنم؟ راهی نیست بشه فقط از لیست استفاده کنم؟


#3

ببینید استفاده از ابزار کم خوبه وقتی توجیح داشته باشه وقتی نیاز به دیتا استراکتچر دیگه هست باید استفاده کرد در ضمن وکتور ها جز دیتا تایپ های استاندارد کلوژر هستند . البته باید دید که نیاز و کار فانشکن های شما چی هست ولی خودتون رو بی دلیل محدود نکنید به طور مثال اگر میخواید یک صف ( queue ) بسازید استفاده از لیست منطقی نیست ولی استفاده از وکتور خیلی منطقیه . بستگی به استفاده شما و نیازتون داره .