ইনপুট ও আউটপুট সামলানোর ফাংশনগুলো IO মডিউল থেকে পাওয়া যায়।
IO.puts/2 স্ট্যান্ডার্ড আউটপুটে একটি স্ট্রিং লেখে, তারপর একটি নতুন লাইন যোগ করে। :ok রিটার্ন করে।IO.write/2 নতুন লাইন না যোগ করে স্ট্যান্ডার্ড আউটপুটে একটি স্ট্রিং লেখে। :ok রিটার্ন করে।IO.gets/2 স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন পড়ে।IO.inspect/2 যেকোনো কিছু স্ট্যান্ডার্ড আউটপুটে লেখে, আর :label-এর মতো দরকারি অপশনও নেয়। যে মানটি দেওয়া হয়, সেটি অপরিবর্তিত অবস্থায় রিটার্ন করে। ডিবাগ করার জন্য দারুণ কাজে লাগে।String.Chars প্রোটোকলযদি IO.puts/2 ফাংশনটিতে এমন কোনো মান দিতে চান যা এটি প্রিন্ট করতে পারে না, তবে আপনি একটি Protocol.UndefinedError এরর দেখতে পাবেন।
IO.puts({:ok, 7})
# ** (Protocol.UndefinedError) protocol String.Chars not implemented for {:ok, 7} of type Tuple
এমন হলে বদলে IO.inspect/2 ব্যবহার করতে চাইতে পারেন।
IO.inspect/2
ডিবাগিংয়ের জন্য IO.inspect/2 একেবারে আদর্শ, কারণ এটি যে আর্গুমেন্ট পায় তা অপরিবর্তিত রিটার্ন করে, যেকোনো কিছু প্রিন্ট করতে পারে, আর :label অপশনও দেয়।
"HELLO\n"
|> String.trim()
|> IO.inspect(label: "step 1")
|> String.downcase()
|> IO.inspect(label: "step 2")
# > step 1: "HELLO"
# > step 2: "hello"
# => "hello"
এই সব ফাংশনের প্রথম আর্গুমেন্টটি একটি IO ডিভাইস, যার ডিফল্ট মান :stdio (স্ট্যান্ডার্ড ইনপুট/আউটপুট)। স্ট্যান্ডার্ড এরর ডিভাইসে লিখতে চাইলে বদলে :stderr ব্যবহার করুন। একটি IO ডিভাইস একটি প্রসেসও হতে পারে, যেমন File.open/2 কল করে তৈরি করা একটি প্রসেস, যা দিয়ে একটি ফাইলে লেখা যাবে।