Standard library
import std.* দিয়ে যেসব প্যাকেজ ব্যবহার করা হয়, সেগুলো মিলেই স্ট্যান্ডার্ড লাইব্রেরি।
এতে থাকে ফাইল, টেক্সট ফরম্যাটিং, math, collections-এর helper, encoding, networking,
process, thread, time, randomness, আর নিচু-লেভেলের মেশিন অ্যাক্সেস।
একটা প্যাকেজ ইমপোর্ট করা হয় তার dotted নাম দিয়ে, আর ব্যবহার করা হয় তার শেষ নাম দিয়ে:
import std.ioimport std.encoding.json
fn main() { io.println("hello") let value: json.Value = json.parse("[1, 2, 3]").expect("parse")}দুই রকমের প্যাকেজ
“দুই রকমের প্যাকেজ” সেকশনলাইব্রেরিটা দুইটা স্তরে সাজানো।
- Beans-সোর্স প্যাকেজ। এগুলো Beans দিয়েই লেখা আর কম্পাইলারের সাথে
stdlib/std/<pkg>/<pkg>.b-তে আসে। এদের কোড নিজে পড়া যায়। যেমন:std.fmtআছেstdlib/std/fmt/fmt.b-তে, আর সাথেstd.collections,std.math,std.path,std.fs, আর encoding প্যাকেজগুলো। - নেটিভ মডিউল। এগুলো কম্পাইলার আর runtime-এর ভেতরেই বানানো,
stdlib/std/-তে না। এগুলোই সেই অংশ যেগুলোকে সরাসরি operating system বা CPU-র সাথে কথা বলতে হয়:std.io,std.os,std.thread,std.time,std.random,std.target,std.cpu,std.intrinsic, আরstd.asm।
কোড লেখার সময় কোন প্যাকেজ কোন স্তরে আছে, সেটা নিয়ে ভাবার দরকার নেই। এটা শুধু তখনই দরকার হয় যখন সোর্স কোড খুঁজতে হয়।
অবজেক্ট বানানোর একটাই নিয়ম
“অবজেক্ট বানানোর একটাই নিয়ম” সেকশনBeans-এ মডিউলের ভেতরে কোনো আলাদা “constructor function” নেই। যেটা কোনো অবজেক্ট
তৈরি করে, সেটা হয় সেই অবজেক্টের class-এর উপর একটা new, নয়তো সেই class-এর একটা
named static — কখনোই সাদামাটা কোনো মডিউল function না।
import std.net
fn main() { // a class instance: use new let addr: net.Address = new net.Address("localhost", 8080) // fallible construction: a named static returning Result let stream: Result<net.TcpStream> = net.TcpStream.connect("localhost", 8080)}তাই new process.Command("ls") একটা command তৈরি করে, আর File.open(path, "r")
একটা ফাইল খোলে (এটা ফেল করতে পারে, তাই এটা একটা named static যেটা Result ফেরত দেয়)।
loader-কে অন্য কোনো root-এ পাঠানো
“loader-কে অন্য কোনো root-এ পাঠানো” সেকশনকম্পাইলার নিজে থেকেই স্ট্যান্ডার্ড লাইব্রেরি খুঁজে নেয়। কোথায় খুঁজবে সেটা বদলাতে
চাইলে BEANS_STDLIB environment variable-টা আরেকটা root directory-তে সেট করুন,
তখন loader সেখান থেকেই প্যাকেজ পড়বে।
std.async$rt নিয়ে একটা কথা
“std.async$rt নিয়ে একটা কথা” সেকশনstd.async$rt নামে কম্পাইলারের একটা ভেতরের প্যাকেজ আছে, যেটা async runtime-কে চালায়।
এটা ইমপোর্ট করা যায় না। এর directory নামে একটা $ আছে, আর সেটা import path-এ
লেখা যায় না। তাই এই নামটা কোডে কখনোই লেখা সম্ভব না। এটা নিয়ে ভাবার দরকার নেই।
প্যাকেজ পেজগুলো
“প্যাকেজ পেজগুলো” সেকশন| প্যাকেজ | কী কাজ করে |
|---|---|
| std.io and std.os | প্রিন্ট করা, ইনপুট পড়া, প্রোগ্রামের arguments, environment, exit |
| std.collections | List আর Map-এর উপর generic helper |
| std.fmt | সংখ্যা আর টেক্সট ফরম্যাটিং |
| std.math | ছোটখাটো numeric helper |
| std.bytes | Bytes-এর উপর CRC-32 আর varint helper |
| std.path | path স্ট্রিং নিয়ে হিসাব, filesystem ছাড়াই |
| std.fs | পুরো ফাইল পড়া আর লেখা |
| std.reader | একটা File-এর উপর buffered লাইন পড়া |
| std.reflect | runtime type, member, annotation, checked field access আর call |
| std.encoding.json | JSON parse আর build করা |
| std.encoding.xml | XML parse আর build করা |
| std.encoding.base64 | Base64 encode আর decode |
| std.encoding.binary | Bytes-এর উপর fixed-width integer আর varint |
| std.net | TCP আর UDP socket |
| std.process | অন্য প্রোগ্রাম চালানো, shell ছাড়াই |
| std.poll | একসাথে অনেক descriptor-এর জন্য অপেক্ষা করা |
| std.signal | OS signal-কে data হিসেবে পাওয়া |
| std.dylib | run time-এ dynamic library খোলা |
| std.thread | OS thread-এ closure চালানো |
| std.time and std.random | clock, sleep করা, আর secure random |
| std.target | কম্পাইল টাইমে বেছে নেওয়া target সম্পর্কে তথ্য |
| std.cpu and std.intrinsic | CPU-কে জিজ্ঞেস করা, আর নিচু-লেভেলের intrinsic |
| std.asm | সীমাবদ্ধ inline assembly |
আরও দেখুন
“আরও দেখুন” সেকশন- Builtins — যেসব type কম্পাইলার কোনো import ছাড়াই দিয়ে দেয়।
- language guide —
Option,Result, আর?কীভাবে কাজ করে, সেটা জানতে।