ডোজাক এবং ক্লোজুরে এর মধ্যে পার্থক্য কী? আপনি যখন একে অপরের উপরে ব্যবহার করতে চান তখন এর কয়েকটি উদাহরণ কী?
ডোজাক এবং ক্লোজুরে এর মধ্যে পার্থক্য কী? আপনি যখন একে অপরের উপরে ব্যবহার করতে চান তখন এর কয়েকটি উদাহরণ কী?
উত্তর:
পার্থক্যটি হ'ল 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
, এবং এর সমস্ত মুদ্রণ শেষ হয়ে গেছে।