تغییر یکی از مقدارهای یک هش-مپ در atom

clojure
clojurescript

#1

من دارم یه اپلیکیشن با کلوژراسکریپت میسازم و نیاز دارم state نگهدارم.
یه اتم دارم به این صورت:

(defonce app-state (atom {:text "Hello World" :click 0}))

و تو اپلیکیشن نیاز دارم تا یه جاهایی مقدار :click رو inc کنم.

(swap! app-state #(assoc % :click (inc (:click %))))

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


اگه اینطوریه باید بگم «سینتکس کار با دیتای mutable تو کلوژر به مسخرگی سینتکس anonymous function تو پایتونه.»


#2

کلوژر، تغییر، اتم. اصلا نمیشه این سه کلمه رو در یک جمله بکار برد


#3

متاسفانه باید توی یه پروژه به کار برده بشه :joy:


#4

خب چطور اینکارو قراره انجام بدی؟ اصلا مگر swap! چه اشکالی داره؟


#5

نمیگم اشکال داره.
میگم سینتکسش یه جوریه آدم فکر میکنه داره اون کارو اشتباه انجام میده (شبیه بقیه‌ی clojure نیست). مخصوصا وقتی که میخواد با هش-مپ یا چیزی شبیه این کار کنه.

میخواستم کدم رو ببینید که اگه اشکالی داره یا روش بهتری برای انجام این کار هست راهنماییم کنید.
حتما باید اینطوری نوشته بشه؟ حتما باید یه anonymous function بسازم و ازش یه مپ کامل خروجی بگیرم برای ویرایش یه تیکه‌ی کوچیک از اون مپ؟


#6

استفاده از anonymous function نه فقط در کلوژر، در هر زبان دیگه ای میتونه باعث کم شدن پیچیدگی و پایین اومدن ضریب خطا بشه و مزایای دیگه ای هم داره.

من فکر کنم دلیل گیج شدنم این بود که گفتید سینتکس کار با دیتای mutable و تغییر دیتا. البته فکر کنم اشتباه تایپی بوده


#7

نه. درست گفتم.
مشکل من با anonymous function نیست.
مشکلم با نحوه‌ی کار با atom هست. میخواستم بدونم درست دارم کار میکنم یا نه.
میخواستم بدونم برای این کاری که من دارم انجام میدم، کدی که نوشتم صحیح هست یا بهتر بود یه جور دیگه مینوشتم.


#8

کد صحیح بنظر میاد, اما منظور من اینه که چیزی بنام mutable دیتا وجود نداره.
شما دیتا رو با swap! تغییر ندادین, دوباره بسته بندی کردین


#9

پس Atom چیه؟
چیزی که من میدونم اینه که اتم یه دیتاتایپ هست که میشه محتویاتشو تغییر داد.

متوجه منظورتون نمیشم. تا جایی که میدونم با swap! تغییر دادم. دوباره def نزدم که!!!


#10

ریبایند فقط با def انجام نمیشه،
اما در مورد swap! حدث میزنم که در پشت ماجرا کاری مشابه rebind کردن انجام‌میده مگر اینکه کلوژر در این مورد چیز خاصی داشته باشه که من نمیدونم, باید چک کنم


#11

بنظر میاد حق با شماست,


#12

خیلی متشکرم!

نمیدونم خوشحال باشم بابت اینکه درست انجامش دادم یا ناراحت بابت اینکه روش بهتری وجود نداره :neutral_face:


#13

بنظر خوب میاد


#14

من الان گیج شدم. مشکل swap! چی هست دقیقا ؟


#15

من تا حالا به swap! درست نگاه نکردم، بنظر میاد که atom ها java object و قابل mutation هستند و swap! این کارو انجام میده، راستش مشکلی نداره و انگار clojure برای بالا بردن پرفرمنس ولی نگه داشتن integrity از explicit mutation هم استفاده کرده.
من به این مورد آگاه نبودم که هنوزم البته درست در موردش تحقیق نکردم، اگر شما توضیح بدین ساده میشه


#16

من کلوژر نمیدونم اما همیشه وقتی در زبان functional نیاز به متغیر میشه برای من نشان میده یک جای کارم مشکل داره . یا درست برنامه مدل نشده یا یک داده که باید باشه نیست …


#17

من هنوز متوجه ایراد نشدم. اتم هدفش مدیریت یه ستیت مشترک به صورت امن هست. دیتا ای که توش قرار میگیره همچنان immutable هست. swap! هم مقدار بازگذشتی فانکشن رو جایگذین مقدار قبلی می کنه.


#18

اصلا مشکلی وجود نداره.
منم اینطور فکر میکردم که بالا هم اول همون که شما گفتید رو گفته بودم اما انگار atom در اصل mutate میشه.

اگر اشتباه نکنم اینجا هم گفته که بضعی تایپ ها قابل mutate هستند
https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/swap!

البته همونطور که گفتم در اصل java object هستند.

اگر اشتباه تایپی داشتم پوزش میخوام، صبح تصحیح میکنم


#19

این رو اضافه کنم که یه سری از انواع داده توی کلوژر مستقیما از انواع داده های جاوا استفاده می کنند. اما کلوژر راهی رو برای mutate کردن اونها فراهم نمی کنه. اتم هم همینجور یه placeholder هست برای نگه داشتن state مشترک که لزوما هم نباید از این روش استفاده کرد. با استفاده از swap! یا reset! اتفاقی که می افته اینه که یه مقدار immutable جایگزین یه مقدار immutable دیگه میشه تو اون placeholder اونم به روش thread safe.


#20

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

خوب یه جاهایی لازمه واقعا!
من چطوری state نگه دارم تو pure function؟

ایرادش اینه که تغییر دیتا خیلی سخته تو این کدی که من نوشتم.
میخوام بدونم راه دیگه‌ای برای اینکار هست یا نه.
من الآن دارم با figwheel و reagent یه اپ میسازم. اولین باره که دارم با atom کار میکنم.

بر اساس منطق (swap! خروجی تابع رو میریزه تو اتم) این کدی که من نوشتم صحیح هست. ولی میخوام بدونم آیا تنها راه همینه؟ چون یه کم سخته و شبیه بقیه‌ی چیزهای کلوژری نیست.

میشه راهنمایی کنید که چطور باید ازش استفاده بشه؟