মূল লেখায় যান

Standard library

import std.* দিয়ে যেসব প্যাকেজ ব্যবহার করা হয়, সেগুলো মিলেই স্ট্যান্ডার্ড লাইব্রেরি। এতে থাকে ফাইল, টেক্সট ফরম্যাটিং, math, collections-এর helper, encoding, networking, process, thread, time, randomness, আর নিচু-লেভেলের মেশিন অ্যাক্সেস।

একটা প্যাকেজ ইমপোর্ট করা হয় তার dotted নাম দিয়ে, আর ব্যবহার করা হয় তার শেষ নাম দিয়ে:

import std.io
import 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.collectionsList আর Map-এর উপর generic helper
std.fmtসংখ্যা আর টেক্সট ফরম্যাটিং
std.mathছোটখাটো numeric helper
std.bytesBytes-এর উপর CRC-32 আর varint helper
std.pathpath স্ট্রিং নিয়ে হিসাব, filesystem ছাড়াই
std.fsপুরো ফাইল পড়া আর লেখা
std.readerএকটা File-এর উপর buffered লাইন পড়া
std.reflectruntime type, member, annotation, checked field access আর call
std.encoding.jsonJSON parse আর build করা
std.encoding.xmlXML parse আর build করা
std.encoding.base64Base64 encode আর decode
std.encoding.binaryBytes-এর উপর fixed-width integer আর varint
std.netTCP আর UDP socket
std.processঅন্য প্রোগ্রাম চালানো, shell ছাড়াই
std.pollএকসাথে অনেক descriptor-এর জন্য অপেক্ষা করা
std.signalOS signal-কে data হিসেবে পাওয়া
std.dylibrun time-এ dynamic library খোলা
std.threadOS thread-এ closure চালানো
std.time and std.randomclock, sleep করা, আর secure random
std.targetকম্পাইল টাইমে বেছে নেওয়া target সম্পর্কে তথ্য
std.cpu and std.intrinsicCPU-কে জিজ্ঞেস করা, আর নিচু-লেভেলের intrinsic
std.asmসীমাবদ্ধ inline assembly
  • Builtins — যেসব type কম্পাইলার কোনো import ছাড়াই দিয়ে দেয়।
  • language guideOption, Result, আর ? কীভাবে কাজ করে, সেটা জানতে।