ডোজাক এবং ক্লোজুরে এর মধ্যে পার্থক্য কী? আপনি যখন একে অপরের উপরে ব্যবহার করতে চান তখন এর কয়েকটি উদাহরণ কী?
ডোজাক এবং ক্লোজুরে এর মধ্যে পার্থক্য কী? আপনি যখন একে অপরের উপরে ব্যবহার করতে চান তখন এর কয়েকটি উদাহরণ কী?
উত্তর:
পার্থক্যটি হ'ল forঅলস ক্রমটি তৈরি করে এবং doseqপার্শ্ব-প্রতিক্রিয়া সম্পাদন করার জন্য এবং শূন্য করার জন্য শূন্য করে returns
user=> (for [x [1 2 3]] (+ x 5))
(6 7 8)
user=> (doseq [x [1 2 3]] (+ x 5))
nil
user=> (doseq [x [1 2 3]] (println x))
1
2
3
nil
আপনি যদি অন্যান্য সিকোয়েন্সের উপর ভিত্তি করে একটি নতুন সিকোয়েন্স তৈরি করতে চান তবে এর জন্য ব্যবহার করুন। আপনি যদি কিছু সিকোয়েন্সের উপাদানগুলির উপর ভিত্তি করে পার্শ্ব-প্রতিক্রিয়াগুলি (মুদ্রণ, কোনও ডাটাবেজে লিখন, পারমাণবিক ওয়ারহেড প্রবর্তন ইত্যাদি) করতে চান তবে ডোজকি ব্যবহার করুন।
অলস doseqথাকা অবস্থায় forএটি আগ্রহী নোটটিও নোট করুন । রায়নের উত্তরের উদাহরণ নিখোঁজ
(for [x [1 2 3]] (println x))
আরপিএলে, এটি সাধারণত আপনি যা চান তা করবে তবে এটি মূলত একটি কাকতালীয়: forআরপিএল প্রযোজিত অলস ক্রমটি প্রেরণ করে , যার ফলে প্রিন্টলানগুলি ঘটায়। একটি ইন্টারেক্টিভ পরিবেশে, কিছুই কখনও মুদ্রণ করা হবে না। ফলাফলগুলির সাথে তুলনা করে আপনি এটিকে ক্রিয়াতে দেখতে পাচ্ছেন
user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy
user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager
যেহেতু defফর্মটি নতুনভাবে তৈরি নতুন ভেরিটি দেয়, এবং এটির সাথে আবদ্ধ মানটি নয়, তবে আরপিএল প্রিন্ট করার মতো কিছুই নেই এবং অবাস্তবিক lazyঅলস-সিকাকে উল্লেখ করবে: এর কোনও উপাদানই মোটেই গণনা করা হয়নি। eagerউল্লেখ করা হবে nil, এবং এর সমস্ত মুদ্রণ শেষ হয়ে গেছে।