std.time and std.random
API সারমর্ম (Beans source থেকে npm run coverage দিয়ে বানানো): 9টা package function।
এই দুটো native module time আর randomness সামলায়। দুটোই compiler আর runtime-এর ভেতরে বানানো, তাই এদের function-গুলো checker-এ typed থাকে positional parameter সহ, যাদের কোনো নাম নেই।
std.time
“std.time” সেকশনimport std.timeদুই ধরনের clock আছে। monotonic clock শুধু সামনেই এগোয়; কিছু করতে কতক্ষণ লাগল সেটা মাপতে এটা ব্যবহার করা হয়। wall clock হলো আসল ক্যালেন্ডারের সময়; system clock adjust হলে এটা পেছনে বা সামনে লাফ দিতে পারে।
monotonic_nanos() -> intmonotonic_millis() -> intwall_nanos() -> intwall_millis() -> intsleep_nanos(int)sleep_millis(int)monotonic_nanosআরmonotonic_millismonotonic clock পড়ে। শুধু পার্থক্যটাই অর্থপূর্ণ; একটা রিডিং নিছক একটা আন্দাজি শুরু থেকে গোনা একটা সংখ্যা।wall_nanos1970 (Unix epoch) থেকে ন্যানোসেকেন্ড ফেরত দেয়, আরwall_millis1970 থেকে মিলিসেকেন্ড। wall clock লাফ দিতে পারে, তাই duration মাপতে এটা ব্যবহার করা যাবে না।sleep_nanosআরsleep_millisচাওয়া সময়টুকু অন্তত ততক্ষণ sleep করে, আর একটা signal মাঝখানে বাধা দিলে sleep নিজে থেকেই আবার চেষ্টা করে।
import std.ioimport std.time
fn main() { let start: int = time.monotonic_nanos() time.sleep_millis(10) let elapsed: int = time.monotonic_nanos() - start io.println("waited {elapsed} ns")}std.random
“std.random” সেকশনimport std.randomstd.random শুধু operating system থেকেই cryptographically secure random data দেয়। কোনো pseudo-random fallback নেই। source হলো macOS-এ arc4random_buf আর Linux-এ getrandom।
bytes(int) -> Result<Bytes>u64() -> Result<int>below(int) -> Result<int>bytes(n)nটা random বাইট ফেরত দেয়।u64()একটা random 64-bit value ফেরত দেয়।below(limit)[0, limit)-এর মধ্যে একটা uniform value ফেরত দেয়। এটা রেমাইন্ডার নিয়ে নয়, rejection sampling দিয়ে uniform, তাই এতে কোনো modulo bias নেই।
খারাপ input (negative count, বা শূন্য-বা-কম bound) invalid kind-এর error হয়ে ফেরে।
import std.ioimport std.random
fn main() { let roll: int = random.below(6).expect("random") + 1 io.println("you rolled {roll}")}