Do you want to pick up from where you left of?
Take me there

IEx হেল্পার

{: .excerpt }

সূচনা

এলিক্সিরে কাজ করার সময়ে IEx আপনার সবচেয়ে গুরুত্বপূর্ণ সঙ্গী। এটি একটি REPL (Read Evaluate Print Loop) তবে এর অনেক বীল্ট-ইন সুবিধা রয়েছে যা আপনার এলিক্সির একপেরিয়েন্সকে সম্রিদ্ধ করবে। IEx এর কিছু প্রয়োজনীয় বীল্ট-ইন হেল্পারের বর্ণনা এই অধ্যায়ে আমরা দিব।

অটোকমপ্লিট

শেলে কাজ করার সময়ে আমরা প্রায়েই নতুন একটি মডিউলের সম্মুখীন হতে পারি যার সম্পর্কে আমাদের ধারণা নেই অথবা কম। আমরা একটি মডিউলের নামের শেষে একটি ডট (.) এবং তারপর ট্যাব প্রেস করে লিস্ট পেতে পারি সেই মডিউলের সদস্যের (ফাংশন, ম্যাক্রো ইত্যাদি)।

iex> Map. # press Tab
delete/2             drop/2               equal?/2
fetch!/2             fetch/2              from_struct/1
get/2                get/3                get_and_update!/3
get_and_update/3     get_lazy/3           has_key?/2
keys/1               merge/2              merge/3
new/0                new/1                new/2
pop/2                pop/3                pop_lazy/3
put/3                put_new/3            put_new_lazy/3
replace!/3           replace/3            split/2
take/2               to_list/1            update!/3
update/4             values/1

.iex.exs

প্রতিবার IEx শুরু হওয়ার সময়ে .iex.exs কনফিগারেশান ফাইলটি খুঁজে নেয় কি কি লোড করতে হবে তার জন্য। যদি কারেন্ট ডিরেক্টরিতে তা না থাকে, তাহলে তা খুঁজবে ইউজারের হোম ডিরেক্টরিতে (~/.iex.exs)

কনফিগারেশান অপশন ও কোড যা এই ফাইলে ডিফাইন করা হবে তা আমাদের IEx সেশানে পাওয়া যাবে সেশান শুরু করা মাত্রই। যেমন আমরা যদি নীচের মত করে কিছু ফাংশন বর্ণনা করি .iex.exs ফাইলে, তাহলে আমরা যতবার IEx খুলব, ততবার এই ফাংশনগুলিকে সরাসরি পাব।

defmodule IExHelpers do
  def whats_this?(term) when is_nil(term), do: "Type: Nil"
  def whats_this?(term) when is_binary(term), do: "Type: Binary"
  def whats_this?(term) when is_boolean(term), do: "Type: Boolean"
  def whats_this?(term) when is_atom(term), do: "Type: Atom"
  def whats_this?(_term), do: "Type: Unknown"
end

এখন থেকে IEx সেশানে IExHelpers মডিউল আমাদের কাছে থাকবে ব্যবহারের জন্য। তাহলে IEx এর একটি সেশান খুলে দেখা যাক-

$ iex
{{ site.erlang.OTP }} [{{ site.erlang.erts }}] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir ({{ site.elixir.version }}) - press Ctrl+C to exit (type h() ENTER for help)
iex> IExHelpers.whats_this?("a string")
"Type: Binary"
iex> IExHelpers.whats_this?(%{})
"Type: Unknown"
iex> IExHelpers.whats_this?(:test)
"Type: Atom"

দেখতেই পাচ্ছি যে আমাদের আলাদাভাবে IExHelpers কে require অথবা import করা লাগেনি। সরাসরিই পেয়ে গিয়েছি।

h

h সম্ভবত সবচেয়ে গুরুতপূর্ন হেল্পারগুলোর মধ্যে একটি। এলিক্সির ডকুমেন্টেশানের জন্য ল্যাঙ্গুয়েজ প্রদত্ত সুবিধা দিয়ে থাকে যার ফলে যে কোন কোডের ডকুমেন্টেশান আমরা এই কমান্ড দিয়ে পেতে পারি।

iex> h Enum
                                      Enum

Provides a set of algorithms that enumerate over enumerables according to the
Enumerable protocol.

 iex> Enum.map([1, 2, 3], fn(x) -> x * 2 end)
 [2, 4, 6]

Some particular types, like maps, yield a specific format on enumeration. For
example, the argument is always a {key, value} tuple for maps:

 iex> map = %{a: 1, b: 2}
 iex> Enum.map(map, fn {k, v} -> {k, v * 2} end)
 [a: 2, b: 4]

Note that the functions in the Enum module are eager: they always start the
enumeration of the given enumerable. The Stream module allows lazy enumeration
of enumerables and provides infinite streams.

Since the majority of the functions in Enum enumerate the whole enumerable and
return a list as result, infinite streams need to be carefully used with such
functions, as they can potentially run forever. For example:

 Enum.each Stream.cycle([1, 2, 3]), &IO.puts(&1)

এখন এই কমান্ড ও পূর্ববর্ণীত অটোকমপ্লিট কমান্ড একত্রিত করে আমরা যে কোন মডিউলের সাথে সহজেই পরিচিত হতে পারি।

মনে করুন আমরা জীবনে প্রথমবারের মত ম্যাপ Map দেখেছি। একটু এক্সপ্লোর করা যাক একে-

iex> h Map
                                      Map

A set of functions for working with maps.

Maps are key-value stores where keys can be any value and are compared using
the match operator (===). Maps can be created with the %{} special form defined
in the Kernel.SpecialForms module.

iex> Map.
delete/2             drop/2               equal?/2
fetch!/2             fetch/2              from_struct/1
get/2                get/3                get_and_update!/3
get_and_update/3     get_lazy/3           has_key?/2
keys/1               merge/2              merge/3
new/0                new/1                new/2
pop/2                pop/3                pop_lazy/3
put/3                put_new/3            put_new_lazy/3
split/2              take/2               to_list/1
update!/3            update/4             values/1

iex> h Map.merge/2
                             def merge(map1, map2)

Merges two maps into one.

All keys in map2 will be added to map1, overriding any existing one.

If you have a struct and you would like to merge a set of keys into the struct,
do not use this function, as it would merge all keys on the right side into the
struct, even if the key is not part of the struct. Instead, use
Kernel.struct/2.

Examples

 iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4})
 %{a: 3, b: 2, d: 4}

দেখাই যাচ্ছে যে আমরা শুধুমাত্র মডিউলের ফাংশন না, বরং প্রতিটি ফাংশনের ডকুমেন্টেশান (উদাহরণসহ) দেখতে পাচ্ছি h এর মাধ্যমে।

i

আমাদের সদ্য পরিচিত হওয়া h এর ব্যবহার করা যাক এবং এর মাধ্যমে i সম্পর্কে পরিচিত হওয়া যাক-

iex> h i

                                  def i(term)

Prints information about the given data type.

iex> i Map
Term
  Map
Data type
  Atom
Module bytecode
  /usr/local/Cellar/elixir/1.3.3/bin/../lib/elixir/ebin/Elixir.Map.beam
Source
  /private/tmp/elixir-20160918-33925-1ki46ng/elixir-1.3.3/lib/elixir/lib/map.ex
Version
  [9651177287794427227743899018880159024]
Compile time
  no value found
Compile options
  [:debug_info]
Description
  Use h(Map) to access its documentation.
  Call Map.module_info() to access metadata.
Raw representation
  :"Elixir.Map"
Reference modules
  Module, Atom

এখন আমাদের হাতে রয়েছে আরও কিছু তথ্য ম্যাপ সম্পর্কে, যেমন এর সোর্স কোডের লোকেশান এবং এর রেফারেন্সকৃত মডিউলসমূহ। এটি অনেক কাজে আসে যখন আমরা কাস্টম অথবা বহিরাগত ডেটা টাইপ অথবা নতুন ফাংশন নিয়ে কাজ করি তখন।

নীচে কিছু তথ্য দেয়া হল যা আমরা পেতে পারি i এর মাধ্যমে-

না জেনে কাজ করা থেকে অনেক সুবিধা পাব আমরা যদি আমরা এই হেল্পারটি থেকে আমাদের ফাংশন অথবা মডিউল ঘাটতে পারি।

r

IEx সেশান খোলা অবস্থায় আমরা যদি কোন মডিউলকে পুনঃকম্পাইল করতে চাই তাহলে এই হেল্পারের আশ্রয় নিব। ধরুন আমরা IEx আওতাধীন কোন মডিউলের কিছু কোড চেঞ্জ করেছি (ফাংশন অ্যাড করেছি) এবং এই নতুন ফাংশন রান করতে চাই ওই IEx এ। তাহলে আমরা এডিটরে চেঞ্জ ও সেভ করে অতঃপর খোলা IEx সেশানে গিয়ে লিখব-

iex> r MyProject
warning: redefining module MyProject (current version loaded from _build/dev/lib/my_project/ebin/Elixir.MyProject.beam)
  lib/my_project.ex:1

{:reloaded, MyProject, [MyProject]}

t

t হেল্পারের মাধ্যমে আমরা একটি মডিউলের টাইপ সম্পর্কে জানতে পারি।

iex> t Map
@type key() :: any()
@type value() :: any()

আমরা জানলাম যে ম্যাপ (Map) “কী“ও “ভ্যালু” টাইপকে ডিফাইন করে থাকে।

আর যদি আমরা ম্যাপ এর সোর্স কোড দেখি-

defmodule Map do
# ...
  @type key :: any
  @type value :: any
# ...

এটি একটি সহজ উদাহরণ যা দেখায় যে প্রতি ইম্লিমেন্টেশানের কী ও ভ্যালু যে কোন টাইপের হতে পারে।

উপরিউক্ত সকল বীল্ট-ইন ফিচারের মাধ্যমে আমরা সহজেই আমাদের কোড সম্পর্কে জানতে পারব এবং আরও ভালভাবে জানতে পারব যে এলিক্সির কিভাবে কাজ করে। IEx অত্যন্ত শক্তিশালী একটি টুল যার দ্বারা প্রোগ্রামাররা সক্ষম হয় অনেক কিছু সরাসরি দেখে নিতে কোন এডিটর না খুলেই। এর মাধ্যমে আমরা এলিক্সির কোডকে আরও সহজে এক্সপ্লোর করতে ও শিখতে পারি।

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!