ক্লোজারে (Clojure) ডেটা ব্যবস্থাপনার জন্য শক্তিশালী কালেকশন টাইপস এবং সিকোয়েন্স ফাংশন রয়েছে। কালেকশন এবং সিকোয়েন্স ব্যবহার করে ডেটা সহজে ম্যানিপুলেট করা যায়। ক্লোজারে চারটি প্রধান কালেকশন টাইপ রয়েছে: লিস্ট, ভেক্টর, ম্যাপ, এবং সেট।
লিস্ট একটি সংযুক্ত ডেটা কাঠামো যা প্যারেনথেসিস ( )
দিয়ে লেখা হয় এবং সাধারণত quote
দিয়ে শুরু হয় যাতে এটি ফাংশন কল হিসেবে কার্যকর না হয়। লিস্ট ক্লোজারে লাজি (lazy) হয়, অর্থাৎ এটি কেবলমাত্র প্রয়োজন অনুযায়ী মান তৈরি করে।
'(1 2 3) ; আউটপুট: (1 2 3)
লিস্ট অপারেশন:
first
: প্রথম মান প্রদান করে।
(first '(1 2 3)) ; আউটপুট: 1
rest
: প্রথম মান বাদে বাকিগুলোর সিকোয়েন্স প্রদান করে।
(rest '(1 2 3)) ; আউটপুট: (2 3)
cons
: একটি মান যুক্ত করে।
(cons 0 '(1 2 3)) ; আউটপুট: (0 1 2 3)
ভেক্টর একটি অর্ডারড কালেকশন, যা দ্রুত এক্সেসের জন্য ব্যবহৃত হয় এবং [ ]
ব্র্যাকেটের মধ্যে লেখা হয়। এটি ইমিউটেবল হলেও, ভেক্টর অ্যাক্সেস এবং আপডেটের জন্য কার্যকর।
[1 2 3] ; আউটপুট: [1 2 3]
ভেক্টর অপারেশন:
get
: নির্দিষ্ট ইনডেক্সের মান প্রদান করে।
(get [10 20 30] 1) ; আউটপুট: 20
conj
: নতুন মান যুক্ত করে।
(conj [1 2 3] 4) ; আউটপুট: [1 2 3 4]
ম্যাপ কী-ভ্যালু পেয়ারের ডেটা কাঠামো, যা { }
ব্র্যাকেটের মধ্যে লেখা হয়। ম্যাপ ব্যবহার করে দ্রুত মান অনুসন্ধান এবং ম্যানিপুলেট করা যায়।
{:name "Alice" :age 25} ; আউটপুট: {:name "Alice", :age 25}
ম্যাপ অপারেশন:
get
: নির্দিষ্ট কী-এর মান প্রদান করে।
(get {:name "Alice" :age 25} :name) ; আউটপুট: "Alice"
assoc
: নতুন কী-ভ্যালু পেয়ার যুক্ত বা আপডেট করে।
(assoc {:name "Alice"} :age 25) ; আউটপুট: {:name "Alice", :age 25}
dissoc
: নির্দিষ্ট কী মুছে ফেলে।
(dissoc {:name "Alice" :age 25} :age) ; আউটপুট: {:name "Alice"}
সেট এমন একটি কালেকশন যা অনন্য মান সংরক্ষণ করে। সেট {# }
চিহ্ন দিয়ে লেখা হয়। ক্লোজারে সাধারণত hash-set
ব্যবহার করা হয়।
#{1 2 3} ; আউটপুট: #{1 2 3}
সেট অপারেশন:
conj
: নতুন মান যুক্ত করে।
(conj #{1 2} 3) ; আউটপুট: #{1 2 3}
disj
: নির্দিষ্ট মান মুছে ফেলে।
(disj #{1 2 3} 2) ; আউটপুট: #{1 3}
সিকোয়েন্সেস ক্লোজারে একটি মৌলিক ডেটা টাইপ, যা বিভিন্ন কালেকশনকে একরকম ইন্টারফেসে নিয়ে আসে। ক্লোজারে সিকোয়েন্স তৈরি করতে seq
ফাংশন ব্যবহার করা হয়।
(seq [1 2 3]) ; আউটপুট: (1 2 3)
সিকোয়েন্স অপারেশন:
first
: প্রথম মান প্রদান করে।
(first [1 2 3]) ; আউটপুট: 1
rest
: প্রথম মান বাদে বাকিগুলো প্রদান করে।
(rest [1 2 3]) ; আউটপুট: (2 3)
map
, reduce
, filter
: সিকোয়েন্সেস ম্যানিপুলেশনের জন্য উচ্চ-স্তরের ফাংশন।উদাহরণ:
(map #(* % %) [1 2 3]) ; আউটপুট: (1 4 9)
ক্লোজারে সিকোয়েন্সেস lazy
হতে পারে, অর্থাৎ প্রয়োজন না হওয়া পর্যন্ত এটি তৈরি হবে না। এটি বড় ডেটাসেট নিয়ে কাজ করার ক্ষেত্রে কার্যকরী।
(take 5 (range)) ; আউটপুট: (0 1 2 3 4)
এখানে range
একটি লাজি সিকোয়েন্স তৈরি করে যা ০ থেকে শুরু করে অসীম সংখ্যার ধারাবাহিক সিকোয়েন্স।
map: প্রতিটি আইটেমে একটি ফাংশন প্রয়োগ করে।
(map inc [1 2 3]) ; আউটপুট: (2 3 4)
reduce: একটি একক ফলাফল রিডিউস করে।
(reduce + [1 2 3]) ; আউটপুট: 6
filter: নির্দিষ্ট শর্তে আইটেম ফিল্টার করে।
(filter odd? [1 2 3 4]) ; আউটপুট: (1 3)
ক্লোজারে লিস্ট, ভেক্টর, ম্যাপ, এবং সেট প্রধান কালেকশন টাইপস এবং এগুলো ইমিউটেবল। সিকোয়েন্স ইন্টারফেস ব্যবহার করে ক্লোজার ডেটা প্রসেসিং সহজ করে। Lazy সিকোয়েন্স বড় ডেটাসেটের উপর কার্যকরী প্রমাণিত হয়, এবং উচ্চ-স্তরের ফাংশনগুলো কোডকে আরও সংক্ষিপ্ত ও কার্যকর করে তোলে।
ক্লোজার একটি ফাংশনাল প্রোগ্রামিং ভাষা, এবং এটি ইমিউটেবল ডেটা কাঠামো ব্যবহারকে জোর দেয়। ইমিউটেবল কালেকশন এমন একটি ডেটা কাঠামো যেখানে ডেটা একবার সেট হলে তা পরিবর্তন করা যায় না। প্রতিবার পরিবর্তনের পরিবর্তে একটি নতুন ডেটা কাঠামো তৈরি করা হয়, যেখানে আগের ডেটার পরিবর্তন প্রতিফলিত হয় না। এই ধারণাটি ক্লোজারে কার্যক্ষমতা এবং নিরাপত্তা নিশ্চিত করে এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য একে একটি শক্তিশালী ভাষায় পরিণত করে।
ইমিউটেবল কালেকশন ব্যবহারের পেছনে কিছু গুরুত্বপূর্ণ কারণ রয়েছে, বিশেষ করে ফাংশনাল প্রোগ্রামিং এবং মাল্টি-থ্রেডিং এনভায়রনমেন্টে:
ক্লোজারে প্রধান চারটি ইমিউটেবল কালেকশন রয়েছে: List, Vector, Set, এবং Map। প্রতিটি কালেকশনই ইমিউটেবল এবং প্রতিটি ব্যবহারের জন্য উপযুক্ত।
লিস্ট একটি সংযুক্ত এবং ইমিউটেবল ডেটা কাঠামো, যা একটি নির্দিষ্ট ক্রমে ডেটা সংরক্ষণ করে। নতুন মান যোগ করা হলে একটি নতুন লিস্ট তৈরি হয়, কিন্তু পূর্বের লিস্টটি অপরিবর্তিত থাকে।
(def my-list '(1 2 3))
(def new-list (cons 0 my-list))
; আউটপুট:
; my-list: (1 2 3)
; new-list: (0 1 2 3)
ভেক্টর একটি ইমিউটেবল এবং ইন্ডেক্সড ডেটা কাঠামো, যা দ্রুত অ্যাক্সেস এবং সংশোধনের জন্য উপযুক্ত। এটি সাধারণত তালিকা ডেটা সঞ্চিত রাখতে ব্যবহৃত হয়।
(def my-vector [1 2 3])
(def new-vector (conj my-vector 4))
; আউটপুট:
; my-vector: [1 2 3]
; new-vector: [1 2 3 4]
সেট একটি ইমিউটেবল কালেকশন যা অনন্য মান সংরক্ষণ করে। নতুন মান যোগ করলে এটি একটি নতুন সেট তৈরি করে, যেখানে পূর্বের সেট পরিবর্তন হয় না।
(def my-set #{1 2 3})
(def new-set (conj my-set 4))
; আউটপুট:
; my-set: #{1 2 3}
; new-set: #{1 2 3 4}
ম্যাপ একটি কী-ভ্যালু পেয়ার ভিত্তিক ইমিউটেবল ডেটা কাঠামো, যা অ্যাসোসিয়েটিভ ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়। নতুন কী-ভ্যালু জোড়া যোগ করলে এটি একটি নতুন ম্যাপ তৈরি করে।
(def my-map {:name "Alice" :age 30})
(def new-map (assoc my-map :city "New York"))
; আউটপুট:
; my-map: {:name "Alice", :age 30}
; new-map: {:name "Alice", :age 30, :city "New York"}
ক্লোজারের ইমিউটেবল কালেকশনগুলি কিছু অপারেশন সহজে সম্পাদন করতে সাহায্য করে:
কালেকশন | বৈশিষ্ট্য | উদাহরণ |
---|---|---|
List | সংযুক্ত, ক্রমিত ডেটা স্ট্রাকচার | (1 2 3) এবং নতুন (0 1 2 3) |
Vector | ইন্ডেক্সড, দ্রুত অ্যাক্সেসযোগ্য | [1 2 3] এবং নতুন [1 2 3 4] |
Set | অনন্য মান সংরক্ষিত | #{1 2 3} এবং নতুন #{1 2 3 4} |
Map | কী-ভ্যালু পেয়ার ভিত্তিক | {:name "Alice", :age 30} এবং নতুন {:name "Alice", :age 30, :city "New York"} |
ক্লোজারের ইমিউটেবল কালেকশনগুলো ফাংশনাল প্রোগ্রামিংয়ের জন্য উপযুক্ত এবং নিরাপদ ডেটা হ্যান্ডলিং নিশ্চিত করে, যা বিশেষ করে কনকারেন্ট প্রোগ্রামিংয়ে কার্যকর।
ক্লোজার (Clojure) একটি ফাংশনাল প্রোগ্রামিং ভাষা, যা বিভিন্ন ধরনের ডেটা কাঠামো সরবরাহ করে যেমন List
, Vector
, Set
, এবং Map
। প্রতিটি ডেটা কাঠামো নির্দিষ্ট পরিস্থিতিতে ব্যবহৃত হয় এবং তাদের নিজস্ব সুবিধা রয়েছে। নিচে প্রতিটি ডেটা কাঠামো এবং তাদের ব্যবহার সম্পর্কিত বিস্তারিত আলোচনা করা হলো।
List
একটি সংযুক্ত ডেটা কাঠামো যা এলিমেন্টগুলোকে একটি নির্দিষ্ট ক্রমে সংরক্ষণ করে। এটি সাধারণত সিকোয়েন্স ডেটা হিসেবে ব্যবহৃত হয় এবং সাধারণত ফাংশনাল প্রোগ্রামিংয়ে রিকার্সন বা ফাংশনাল অ্যাক্টিভেশন চেইন করার জন্য ব্যবহার করা হয়।
(def my-list '(1 2 3 4 5))
; লিস্ট থেকে প্রথম আইটেম পেতে
(first my-list) ; আউটপুট: 1
; লিস্ট থেকে বাকি আইটেম পেতে
(rest my-list) ; আউটপুট: (2 3 4 5)
; নতুন আইটেম যোগ করতে
(cons 0 my-list) ; আউটপুট: (0 1 2 3 4 5)
Vector
একটি ইমিউটেবল, ইন্ডেক্সড ডেটা কাঠামো যা দ্রুত অ্যাক্সেসের জন্য উপযোগী। এটি ইন্ডেক্সের মাধ্যমে দ্রুত ডেটা অ্যাক্সেস এবং সংশোধনের সুবিধা দেয়। Vector
সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে দ্রুত অ্যাক্সেসের প্রয়োজন।
(def my-vector [1 2 3 4 5])
; ভেক্টর থেকে দ্বিতীয় আইটেম পেতে
(nth my-vector 1) ; আউটপুট: 2
; ভেক্টরের শেষে একটি আইটেম যোগ করতে
(conj my-vector 6) ; আউটপুট: [1 2 3 4 5 6]
; ভেক্টরের দৈর্ঘ্য পেতে
(count my-vector) ; আউটপুট: 5
Set
একটি ডেটা কাঠামো যা শুধুমাত্র অনন্য (unique) মান সংরক্ষণ করে, অর্থাৎ, এতে ডুপ্লিকেট আইটেম থাকতে পারে না। এটি সাধারণত ডেটার মেম্বারশিপ যাচাই এবং ইউনিক মান নিশ্চিত করার জন্য ব্যবহৃত হয়।
(def my-set #{1 2 3 4 5})
; সেটে একটি মান আছে কিনা চেক করা
(contains? my-set 3) ; আউটপুট: true
; নতুন আইটেম যোগ করতে
(conj my-set 6) ; আউটপুট: #{1 2 3 4 5 6}
; একটি আইটেম বাদ দিতে
(disj my-set 2) ; আউটপুট: #{1 3 4 5}
Map
একটি কী-ভ্যালু পেয়ার ডেটা কাঠামো, যেখানে প্রতিটি কী (key) একটি মান (value) নির্দেশ করে। এটি সাধারণত অ্যাসোসিয়েটিভ ডেটা মডেল এবং দ্রুত অনুসন্ধান করার জন্য ব্যবহৃত হয়।
Map
সাধারণত ডেটার অ্যাসোসিয়েটিভ ভ্যালু স্টোরেজে ব্যবহৃত হয়, যেমন ব্যবহারকারীর তথ্য সংরক্ষণ করা (ইমেইল-কী, নাম-ভ্যালু পেয়ার)।Map
খুব দ্রুত নির্দিষ্ট কী এর মান খুঁজে বের করতে সাহায্য করে।(def my-map {:name "Alice" :age 30 :city "New York"})
; একটি কী এর মান পেতে
(:name my-map) ; আউটপুট: "Alice"
; নতুন কী-ভ্যালু পেয়ার যোগ করতে
(assoc my-map :country "USA") ; আউটপুট: {:name "Alice", :age 30, :city "New York", :country "USA"}
; একটি কী-ভ্যালু পেয়ার বাদ দিতে
(dissoc my-map :city) ; আউটপুট: {:name "Alice", :age 30}
ডেটা কাঠামো | বৈশিষ্ট্য | ব্যবহার |
---|---|---|
List | সংযুক্ত, অর্ডারড ডেটা | রিকার্সন, ফাংশনাল প্রোগ্রামিং |
Vector | ইমিউটেবল, ইন্ডেক্সড ডেটা | দ্রুত অ্যাক্সেস, সংশোধন |
Set | অনন্য মান | ডুপ্লিকেট অপসারণ, মেম্বারশিপ যাচাই |
Map | কী-ভ্যালু পেয়ার, অ্যাসোসিয়েটিভ ডেটা | দ্রুত অনুসন্ধান, অ্যাসোসিয়েটিভ ডেটা |
এই ডেটা কাঠামোগুলো ক্লোজার প্রোগ্রামিংয়ে ডেটা ম্যানিপুলেশন, সংরক্ষণ এবং অ্যাক্সেস করার জন্য অত্যন্ত কার্যকরী এবং ফাংশনাল প্রোগ্রামিংয়ের জন্য উপযুক্ত।
Clojure তে সিকোয়েন্স (sequences) একটি গুরুত্বপূর্ণ কনসেপ্ট, এবং এটি এক ধরনের ফাংশনাল ডেটা স্ট্রাকচার হিসেবে কাজ করে। সিকোয়েন্স API হল একটি সেট ফাংশন যা বিভিন্ন ধরনের ডেটা কাঠামোকে সিকোয়েন্সে রূপান্তর করতে সাহায্য করে, যেমন: লিস্ট, ভেক্টর, সেট, ম্যাপ ইত্যাদি। এই API ব্যবহার করে ডেটা ম্যানিপুলেশন, ট্রান্সফরমেশন এবং ফিল্টার করা খুবই সহজ হয়। এর মধ্যে গুরুত্বপূর্ণ একটি বৈশিষ্ট্য হল Lazy Sequences যা মেমোরি দক্ষ এবং অবজেক্টিভ প্রোগ্রামিংয়ে খুবই কার্যকরী।
Clojure এর সিকোয়েন্স API এমন একটি সুবিধাজনক ফিচার যা বিভিন্ন প্রকারের সংগ্রহকে সিকোয়েন্সের মধ্যে রূপান্তর করতে এবং সেই সিকোয়েন্সের উপাদানগুলোর ওপর বিভিন্ন কার্যকলাপ করতে সাহায্য করে। এই API বেশ কিছু বিল্ট-ইন ফাংশন সরবরাহ করে, যেমন map
, filter
, reduce
, first
, rest
, cons
, ইত্যাদি।
first
: সিকোয়েন্সের প্রথম উপাদান ফেরত দেয়।
(first [1 2 3 4]) ; আউটপুট: 1
rest
: সিকোয়েন্সের প্রথম উপাদান ছাড়া বাকি উপাদানগুলো ফেরত দেয়।
(rest [1 2 3 4]) ; আউটপুট: (2 3 4)
cons
: একটি নতুন উপাদান যুক্ত করে সিকোয়েন্সের শুরুতে।
(cons 0 [1 2 3]) ; আউটপুট: (0 1 2 3)
map
: একটি ফাংশন প্রয়োগ করে সিকোয়েন্সের প্রতিটি উপাদান পরিবর্তন করে।
(map inc [1 2 3 4]) ; আউটপুট: (2 3 4 5)
filter
: একটি শর্ত অনুযায়ী সিকোয়েন্সের উপাদান ফিল্টার করে।
(filter even? [1 2 3 4 5 6]) ; আউটপুট: (2 4 6)
reduce
: সিকোয়েন্সের উপাদানগুলোর ওপর একটি একক অপারেশন প্রয়োগ করে একটি একক মান তৈরি করে।
(reduce + [1 2 3 4]) ; আউটপুট: 10
take
: সিকোয়েন্সের প্রথম n
উপাদান বের করে।
(take 3 [1 2 3 4 5]) ; আউটপুট: (1 2 3)
drop
: সিকোয়েন্সের প্রথম n
উপাদান বাদ দেয়।
(drop 2 [1 2 3 4 5]) ; আউটপুট: (3 4 5)
Lazy sequences হল এমন সিকোয়েন্স যা শুধু তখনই মূল্যায়ন (evaluation) হয় যখন তাদের উপাদানগুলো প্রয়োজন পড়ে। সাধারণভাবে, Clojure-এ সিকোয়েন্সগুলোর উপর কোনো অপারেশন সম্পাদন করলে পুরো সিকোয়েন্স তৈরি হয়ে যায়, তবে লেজি সিকোয়েন্সের ক্ষেত্রে শুধুমাত্র প্রয়োজনীয় উপাদানগুলোর উপর অপারেশন চালানো হয় এবং শুধুমাত্র তাদের হিসেবেই মূল্যায়ন করা হয়। এতে মেমোরি সাশ্রয় হয় এবং বড় সিকোয়েন্সের ক্ষেত্রে এটি কার্যকরী।
range
: লেজি সিকোয়েন্স তৈরি করতে range
ফাংশন ব্যবহার করা হয়। এটি একটি ইনফিনিট সিকোয়েন্স তৈরি করে, কিন্তু আপনি যদি শুধুমাত্র কিছু উপাদান প্রয়োজন করেন, তবে Clojure শুধুমাত্র সেগুলো মূল্যায়ন করবে।
(take 5 (range)) ; আউটপুট: (0 1 2 3 4)
lazy-seq
: lazy-seq
ফাংশন ব্যবহার করে আপনি একটি কাস্টম লেজি সিকোয়েন্স তৈরি করতে পারেন।
(defn fib [a b]
(lazy-seq (cons a (fib b (+ a b)))))
(take 10 (fib 0 1)) ; আউটপুট: (0 1 1 2 3 5 8 13 21 34)
এখানে, fib
একটি লেজি সিকোয়েন্স তৈরি করে যা ফিবোনাচ্চি সিরিজের পরবর্তী সংখ্যা উৎপন্ন করে। lazy-seq
নিশ্চিত করে যে পরবর্তী সংখ্যাটি শুধু তখনই তৈরি হবে যখন তা প্রয়োজন হবে।
range
), যেটি নির্দিষ্ট সংখ্যক উপাদান বের করার সময় পর্যন্ত মেমোরি ব্যবহার করে না।(defn even-squares [n]
(lazy-seq (if (zero? n)
nil
(cons (* n n) (even-squares (- n 2))))))
(take 5 (even-squares 10)) ; আউটপুট: (100 64 36 16 4)
এখানে, even-squares
একটি লেজি সিকোয়েন্স তৈরি করছে যেখানে প্রথম ৫টি সোজা সংখ্যার বর্গ (100, 64, 36, 16, 4) বের করা হয়েছে।
map
, filter
, reduce
) করতে ব্যবহৃত হয়, যা ফাংশনাল প্রোগ্রামিংয়ের মূল অংশ।range
অথবা কাস্টম লেজি সিকোয়েন্স lazy-seq
ব্যবহার করে।Clojure-এ সিকোয়েন্স এবং লেজি সিকোয়েন্সের মাধ্যমে ডেটা ম্যানিপুলেশন কার্যকরী এবং মেমোরি সাশ্রয়ীভাবে করা যায়।
conj
, assoc
, dissoc
Clojure provides several powerful functions to manipulate collections such as lists, vectors, maps, and sets. Three of the most commonly used functions for modifying collections are conj
, assoc
, and dissoc
. These functions are all designed to work in an immutable way, meaning they don't modify the original collection but instead return a new modified collection.
Let's go over each function with examples:
conj
(Add to collection)The conj
function is used to add elements to a collection. The behavior of conj
depends on the type of collection it is applied to:
conj
with Lists, Vectors, and Sets; Using conj with a List
(def my-list '(2 3 4))
(def new-list (conj my-list 1))
; my-list is unchanged, new-list is (1 2 3 4)
(println new-list)
; Using conj with a Vector
(def my-vector [1 2 3])
(def new-vector (conj my-vector 4))
; my-vector is unchanged, new-vector is [1 2 3 4]
(println new-vector)
; Using conj with a Set
(def my-set #{2 3})
(def new-set (conj my-set 1))
; my-set is unchanged, new-set is #{1 2 3}
(println new-set)
1
is added at the front.4
is added at the end.1
is added to the set if it’s not already present.assoc
(Add or update key-value pairs in a map)The assoc
function is used to add or update key-value pairs in a map. If the key already exists, it updates the value associated with that key. If the key does not exist, it adds the key-value pair to the map.
assoc
with Maps; Using assoc to add or update key-value pairs in a Map
(def my-map {:name "Alice" :age 30})
(def new-map (assoc my-map :age 31 :city "New York"))
; my-map is unchanged, new-map is {:name "Alice", :age 31, :city "New York"}
(println new-map)
:age
key is updated with the new value 31
.:city
key-value pair is added to the map.dissoc
(Remove key-value pairs from a map)The dissoc
function removes one or more key-value pairs from a map. It returns a new map with the specified keys removed.
dissoc
with Maps; Using dissoc to remove key-value pairs from a Map
(def my-map {:name "Alice" :age 30 :city "New York"})
(def new-map (dissoc my-map :age :city))
; my-map is unchanged, new-map is {:name "Alice"}
(println new-map)
:age
and :city
are removed from the map.conj
, assoc
, and dissoc
Function | Description | Example Usage |
---|---|---|
conj | Adds an element to a collection (front for lists, end for vectors, and to the set) | (conj [1 2] 3) → [1 2 3] , (conj #{1 2} 3) → #{1 2 3} |
assoc | Adds or updates key-value pairs in a map | (assoc {:a 1} :b 2) → {:a 1 :b 2} |
dissoc | Removes one or more key-value pairs from a map | (dissoc {:a 1 :b 2} :b) → {:a 1} |
conj
modifies the collection by adding elements at the correct position based on the type (beginning for lists, end for vectors).assoc
is specifically used to add or modify key-value pairs in a map.dissoc
removes key-value pairs from a map.These functions return a new collection and do not mutate the original collection, which is a core principle of functional programming and immutability in Clojure.
common.read_more