১শুরু করা
শব্দ একটি সাধারণ-উদ্দেশ্যের প্রোগ্রামিং ভাষা, যার কীওয়ার্ড, বিল্ট-ইন কাজ, ত্রুটি বার্তা ও সংখ্যা সবই বাংলায়। সোর্স ফাইলের এক্সটেনশন .shobdo, এনকোডিং UTF-8।
লেখো("নমস্কার, বিশ্ব!")
নমস্কার, বিশ্ব!
তিনভাবে চালানো যায়
🌐 শব্দ স্টুডিও
ব্রাউজারে এডিটর খুলে ▶ চালাও চাপুন। কিছু ইনস্টল করতে হয় না। স্টুডিও খুলুন⌨️ ইন্টারপ্রেটার
Node.js দিয়ে:node dist/src/cli.js run ফাইল.shobdo⚙️ নেটিভ কম্পাইলার
আসল মেশিন কোড:build/shobdoc ফাইল.shobdo -o প্রোগ্রাম তারপর ./প্রোগ্রামসোর্স থেকে বানানো
cd shobdo
npm install && npm run build # ইন্টারপ্রেটার বানানো
node dist/src/cli.js run examples/hello.shobdo
npm run bootstrap # নেটিভ কম্পাইলার বানানো → build/shobdoc
build/shobdoc examples/hello.shobdo -o hello && ./hello
২কমান্ড লাইন (CLI)
সব কমান্ড shobdo/ ফোল্ডার থেকে চালাতে হয়।
| কমান্ড | কী করে |
|---|---|
node dist/src/cli.js run <ফাইল> | ইন্টারপ্রেটারে প্রোগ্রাম চালায়। ফাইলের পরের শব্দগুলো প্রোগ্রাম আর্গুমেন্ট() দিয়ে পায় (-- দিয়ে শুরু হওয়াগুলো বাদে)। |
… run <ফাইল> --latin-digits | ফলাফলে বাংলা অঙ্কের বদলে 0–9 দেখায়। |
node dist/src/cli.js repl | ইন্টারঅ্যাক্টিভ মোড, প্রম্পট শব্দ>। প্রতিটি লাইন সঙ্গে সঙ্গে চলে। |
build/shobdoc <ফাইল> -o <আউটপুট> | নেটিভ কম্পাইল: স্বাক্ষরিত arm64 Mach-O এক্সিকিউটেবল বানায়। |
npm run build | TypeScript ইন্টারপ্রেটার কম্পাইল করে dist/-এ। |
npm test | ইন্টারপ্রেটারের ইউনিট টেস্ট। |
npm run bootstrap | তিন ধাপে কম্পাইলার নিজেকে নিজে বানায়; তিনটি বাইনারি হুবহু এক না হলে ব্যর্থ হয়। |
npm run test:conform | কনফরম্যান্স স্যুট: একই কেস ইন্টারপ্রেটার ও নেটিভ দুটোতেই। |
npm run test:native | tests/native/-এর প্রোগ্রাম ইন্টারপ্রেটার বনাম নেটিভ বাইনারিতে মেলানো। |
npm run ide / npm run test:ide | শব্দ স্টুডিও বানানো / পরীক্ষা করা। |
npm run app:macos | macOS অ্যাপ Shobdo Studio.app বানানো (Xcode command-line tools লাগে)। |
node tools/doccheck.js ../shobdo-docs.html --native build/shobdoc | এই পাতার সব উদাহরণ চালিয়ে প্রত্যাশিত ফলাফলের সঙ্গে মেলায়। |
প্রস্থান কোড: সফল হলে 0, অধরা ত্রুটি হলে 1, আর বের_হও(ন) দিলে ন।
৩মৌলিক নিয়ম
- ব্লক সবসময়
{ }দিয়ে। ইনডেন্টেশনের কোনো অর্থ নেই। - স্টেটমেন্ট আলাদা হয় নতুন লাইনে, অথবা একই লাইনে
;দিয়ে। - মন্তব্য:
// এক লাইনএবং/* বহু লাইন */। - অঙ্ক: বাংলা
০–৯ও লাতিন0–9দুটোই চলে, এমনকি মিশিয়েও। পড়ার সুবিধার জন্য_দেওয়া যায়:১_০০০_০০০। ষোড়শিক:0xFF। - নাম বাংলা বা লাতিন অক্ষর আর
_দিয়ে শুরু হয়; পরে অঙ্কও থাকতে পারে। যুক্তাক্ষরের জন্য ZWJ/ZWNJ চলে। সোর্স NFC-তে স্বাভাবিক করা হয়, তাই একই শব্দের ভিন্ন ইউনিকোড রূপ একই নাম। - শর্ত অবশ্যই
সত্যবামিথ্যাহতে হবে। সংখ্যা বা লেখাকে শর্ত হিসেবে দিলে ত্রুটি হয়। - মান বসানো একটি স্টেটমেন্ট, রাশি নয়। তাই
যদি ক = ১লেখা যায় না।
// এটি মন্তব্য
/* এটিও
মন্তব্য */
ধরি ক = ১০; ধরি খ = 5
লেখো(ক + খ, ১_০০০ + 0x10)
১৫ ১০১৬
৪চলক ও ধ্রুবক
ধরি দিয়ে চলক (variable), ধ্রুব দিয়ে ধ্রুবক। ধ্রুবকে শুরুতেই মান দিতে হয় এবং পরে বদলানো যায় না। মান ছাড়া ধরি দিলে মান হয় শূন্য। একই স্কোপে একই নাম দুবার ঘোষণা করা যায় না, তবে ভেতরের ব্লকে নতুন করে করা যায়। লেখার ভেতরে {রাশি} লিখলে তার মান বসে যায়।
ধরি নাম = "রিনা"
ধরি বয়স = ২৫
ধ্রুব দেশ = "বাংলাদেশ"
বয়স += ১
লেখো("{নাম}-এর বয়স {বয়স}, দেশ {দেশ}")
ধরি খালি
লেখো(খালি, "দুই গুণ: {বয়স * ২}")
রিনা-এর বয়স ২৬, দেশ বাংলাদেশ শূন্য দুই গুণ: ৫২
যৌগিক মান বসানো: += -= *= /= %= **=। লক্ষ্য হতে পারে নাম, সদস্য (ব.x) বা সূচক (ত[০])।
ধ্রুব পাই = ৩
পাই = ৪
ত্রুটি (case.shobdo) লাইন 2: ‘পাই’ ধ্রুব, এর মান বদলানো যায় না
৫মানের ধরন
ধরন (ধরন() যা ফেরত দেয়) | উদাহরণ | বিবরণ |
|---|---|---|
সংখ্যা | ৪২, ৩.৫, 0xFF | পূর্ণসংখ্যা ও দশমিক |
লেখা | "নমস্কার", 'একক' | ইউনিকোড লেখা; দৈর্ঘ্য গোনা হয় কোড-পয়েন্টে |
সত্যমিথ্যা | সত্য, মিথ্যা | বুলিয়ান |
শূন্য | শূন্য | কোনো মান নেই (null) |
তালিকা | [১, ২, ৩] | ক্রমিক তালিকা (list) |
মানচিত্র | {নাম: "আম"} | চাবি→মান (map); ঢোকানোর ক্রম বজায় থাকে |
কাজ | x => x * ২ | ফাংশন, পদ্ধতি, বিল্ট-ইন, শ্রেণি |
| শ্রেণির নাম | বিন্দু(১, ২) | বস্তুর ধরন তার শ্রেণির নাম |
লেখো(ধরন(৪২), ধরন(৩.৫), ধরন("ক"), ধরন(সত্য), ধরন(শূন্য))
লেখো(ধরন([১]), ধরন({ক: ১}), ধরন(লেখো))
সংখ্যা সংখ্যা লেখা সত্যমিথ্যা শূন্য তালিকা মানচিত্র কাজ
৬সংখ্যা ও অপারেটর
লেখো(১০ + ৩, ১০ - ৩, ১০ * ৩, ১০ / ৪, ১০ % ৩, ২ ** ১০)
লেখো(ভাগফল(১০, ৩), ০xFF, ১_০০০_০০০, -৭)
লেখো(৬ & ৩, ৬ | ৩, ৬ ^ ৩, ১ << ৪, ২৫৬ >> ২)
১৩ ৭ ৩০ ২.৫ ১ ১০২৪ ৩ ২৫৫ ১০০০০০০ -৭ ২ ৭ ৫ ১৬ ৬৪
/ দশমিক ফল দেয় (১০ / ৪ = ২.৫)। পূর্ণসংখ্যার ভাগফলের জন্য ভাগফল(ক, খ) ব্যবহার করুন। // মন্তব্য, ভাগ নয়।অপারেটরের অগ্রাধিকার (নিচ থেকে উপরে বাড়ে)
| স্তর | অপারেটর | অর্থ |
|---|---|---|
| ১ | ক ? খ : গ | শর্তসাপেক্ষ রাশি (ternary) |
| ২ | ?? | বাঁ দিক শূন্য হলে ডান দিক |
| ৩ | অথবা | যৌক্তিক OR (শর্ট-সার্কিট) |
| ৪ | এবং | যৌক্তিক AND (শর্ট-সার্কিট) |
| ৫ | == != | সমান / অসমান (তালিকা উপাদান ধরে তুলনা হয়) |
| ৬ | < > <= >= ভিতরে | তুলনা (সংখ্যা-সংখ্যা বা লেখা-লেখা); সদস্যপদ |
| ৭ | .. ..= | পরিসর: ১..৪ = [১, ২, ৩]; ১..=৪ শেষটিসহ |
| ৮–১১ | |, ^, &, << >> | বিট অপারেশন (শুধু পূর্ণসংখ্যা) |
| ১২ | + - | যোগ, বিয়োগ; + লেখা ও তালিকা জোড়ে |
| ১৩ | * / % | গুণ, ভাগ, ভাগশেষ; লেখা * সংখ্যা পুনরাবৃত্তি |
| একক | না - | যৌক্তিক NOT, ঋণাত্মক |
| ঘাত | ** | ঘাত (ডান-সংযোজী) |
| সর্বোচ্চ | ক(…) ক[…] ক.খ ক?.খ | কল, সূচক, সদস্য, নিরাপদ সদস্য |
৭লেখা (স্ট্রিং)
লেখা "…" বা '…' দিয়ে। এস্কেপ: \n নতুন লাইন, \t ট্যাব, \" উদ্ধৃতি, \\ ব্যাকস্ল্যাশ, \{ আসল বন্ধনী। {রাশি} মান বসায়। সূচক শ[০] একটি কোড-পয়েন্ট দেয়।
ধরি শ = "শব্দভাণ্ডার"
লেখো(দৈর্ঘ্য(শ), শ.দৈর্ঘ্য, শ[০], শ.টুকরো(০, ৩))
লেখো("ক,খ,গ".ভাগ(","), " ফাঁকা ".ছাঁটো(), "abc".বড়(), "ABC".ছোট())
লেখো("কলকাতা".বদলাও("কা", "খা"), "আমার".শুরু("আ"), "আম".ধারণ("ম"), "abc".খোঁজো("c"))
লেখো("হা" * ৩, "এক" + "দুই", "বন্ধনী: \{না\}", "ক" < "খ")
লেখো("প্রথম লাইন\nদ্বিতীয় লাইন")
১১ ১১ শ শব্
["ক", "খ", "গ"] ফাঁকা ABC abc
কলখাতা সত্য সত্য ২
হাহাহা একদুই বন্ধনী: {না} সত্য
প্রথম লাইন
দ্বিতীয় লাইন| পদ্ধতি | ফেরত দেয় |
|---|---|
শ.দৈর্ঘ্য | কোড-পয়েন্টের সংখ্যা (বৈশিষ্ট্য, কল নয়) |
শ.বড়() / শ.ছোট() | বড়/ছোট হাতের অক্ষর (এখন শুধু ASCII) |
শ.ছাঁটো() | দুই পাশের ফাঁকা জায়গা বাদ |
শ.ভাগ(বিভাজক) | লেখার তালিকা |
শ.টুকরো(শুরু, শেষ?) | অংশ লেখা (শেষ বাদে) |
শ.খোঁজো(x) | প্রথম অবস্থান, না থাকলে -১ |
শ.শুরু(x) / শ.ধারণ(x) | x দিয়ে শুরু কিনা / x আছে কিনা |
শ.বদলাও(ক, খ) | সব ক-এর জায়গায় খ |
৮তালিকা
ধরি ত = [৩, ১, ২]
ত.যোগ(৫)
লেখো(ত, দৈর্ঘ্য(ত), ত[০], ত.সাজাও(), ত.উল্টাও())
লেখো(ত.মানচিত্র(x => x * ২), ত.ছাঁকো(x => x > ১), ত.কমাও((ক, খ) => ক + খ, ০))
লেখো(ত.জোড়ো("-"), ত.টুকরো(১, ৩), ত.বের(), ত, [১] + [২, ৩], ২ ভিতরে ত)
ত[০] = ৯
লেখো(ত, ত == [৯, ১, ২])
[৩, ১, ২, ৫] ৪ ৩ [১, ২, ৩, ৫] [৫, ২, ১, ৩] [৬, ২, ৪, ১০] [৩, ২, ৫] ১১ ৩-১-২-৫ [১, ২] ৫ [৩, ১, ২] [১, ২, ৩] সত্য [৯, ১, ২] সত্য
| পদ্ধতি | কী করে |
|---|---|
ত.দৈর্ঘ্য | উপাদানের সংখ্যা (বৈশিষ্ট্য) |
ত.যোগ(x) | শেষে x যোগ করে (তালিকা বদলায়) |
ত.বের() | শেষ উপাদান সরিয়ে ফেরত দেয়; খালি হলে শূন্য |
ত.মানচিত্র(কাজ) | প্রতিটিতে কাজ চালিয়ে নতুন তালিকা; কাজ পায় (উপাদান, সূচক) |
ত.ছাঁকো(কাজ) | যেগুলোতে কাজ সত্য দেয় |
ত.কমাও(কাজ, শুরু) | এক মানে নামিয়ে আনে (reduce) |
ত.জোড়ো(বিভাজক?) | লেখায় জোড়ে |
ত.টুকরো(শুরু, শেষ?) | অংশের নতুন তালিকা |
ত.উল্টাও() / ত.সাজাও() | উল্টো / সাজানো নতুন তালিকা (মূলটি বদলায় না) |
সীমার বাইরের সূচক ত্রুটি দেয়: সূচক সীমার বাইরে: ৫ (দৈর্ঘ্য ২)।
৯মানচিত্র
{চাবি: মান}। নাম-আকারের চাবি লেখা হয়ে যায়; অন্য চাবির জন্য রাশি দিন ({১: "এক"})। ম.চাবি ও ম["চাবি"] একই; নেই এমন চাবি শূন্য দেয়। প্রতিটি লুপ চাবিগুলোর উপর ঘোরে।
ধরি ফল = {নাম: "আম", দাম: ৫০}
ফল.রং = "হলুদ"
ফল["ওজন"] = ২
লেখো(ফল.নাম, ফল["দাম"], দৈর্ঘ্য(ফল))
লেখো(ফল.চাবি(), ফল.আছে("রং"), ফল.অজানা)
ফল.মুছো("ওজন")
লেখো(ফল)
প্রতিটি চ এর মধ্যে ফল { লেখো(চ, "→", ফল[চ]) }
আম ৫০ ৪
["নাম", "দাম", "রং", "ওজন"] সত্য শূন্য
{"নাম": "আম", "দাম": ৫০, "রং": "হলুদ"}
নাম → আম
দাম → ৫০
রং → হলুদ| পদ্ধতি | কী করে |
|---|---|
ম.দৈর্ঘ্য | জোড়ার সংখ্যা (বৈশিষ্ট্য) |
ম.চাবি() / ম.মান() | সব চাবি / সব মানের তালিকা |
ম.আছে(চাবি) | চাবি আছে কিনা |
ম.মুছো(চাবি) | জোড়া মুছে ফেলে |
দৈর্ঘ্য, চাবি, মান, আছে, মুছো নামের চাবি ডট দিয়ে পড়া যায় না, কারণ ওগুলো পদ্ধতির নাম। এমন চাবির জন্য ম["মান"] লিখুন।১০শর্ত ও লুপ
ধরি ন = ৭
যদি ন % ২ == ০ { লেখো("জোড়") } নাহলে যদি ন > ৫ { লেখো("বড় বিজোড়") } নাহলে { লেখো("ছোট বিজোড়") }
প্রতিটি i এর মধ্যে ১..৪ { লেখো(i) }
প্রতিটি i এর মধ্যে ১..=৩ { লেখো(i * i) }
প্রতিটি অ এর মধ্যে "কখ" { লেখো(অ) }
ধরি গ = ০
যতক্ষণ সত্য { গ += ১; যদি গ == ২ { এগোও }; যদি গ > ৪ { থামো }; লেখো("গ = {গ}") }
লেখো(ন > ৫ ? "বড়" : "ছোট", শূন্য ?? "বিকল্প", সত্য এবং না মিথ্যা, মিথ্যা অথবা সত্য)
বড় বিজোড় ১ ২ ৩ ১ ৪ ৯ ক খ গ = ১ গ = ৩ গ = ৪ বড় বিকল্প সত্য সত্য
প্রতিটি নাম এর মধ্যে X-এ X হতে পারে তালিকা, পরিসর, লেখা (প্রতিটি অক্ষর) বা মানচিত্র (প্রতিটি চাবি)।
১১কাজ (ফাংশন)
কাজ নাম(প্যারামিটার) { … }। প্যারামিটারে ডিফল্ট মান দেওয়া যায়। ফেরত মান ফেরত দেয়; না দিলে ফল শূন্য। একই ব্লকের কাজগুলো ঘোষণার আগেই ডাকা যায়। নামহীন কাজ তিন রকমে লেখা যায়: x => …, (ক, খ) => { … } ও কাজ(ক) { … }। কাজ বাইরের চলক ধরে রাখে (closure)।
কাজ যোগ(ক, খ = ১০) { ফেরত ক + খ }
লেখো(যোগ(২, ৩), যোগ(৫))
কাজ ফ্যাক্টোরিয়াল(ন) { যদি ন <= ১ { ফেরত ১ }; ফেরত ন * ফ্যাক্টোরিয়াল(ন - ১) }
লেখো(ফ্যাক্টোরিয়াল(১০))
ধরি বর্গ = x => x * x
ধরি গুণ = (ক, খ) => ক * খ
ধরি পরের = কাজ(ক) { ফেরত ক + ১ }
লেখো(বর্গ(৯), গুণ(৬, ৭), পরের(১))
কাজ গণক_বানাও() { ধরি গ = ০; ফেরত () => { গ += ১; ফেরত গ } }
ধরি গণক = গণক_বানাও()
গণক(); গণক()
লেখো(গণক(), যোগ)
৫ ১৫ ৩৬২৮৮০০ ৮১ ৪২ ২ ৩ <কাজ যোগ>
কাজ যোগ(ক, খ) { ফেরত ক + খ }
লেখো(যোগ(১))
ত্রুটি (case.shobdo) লাইন 2: ‘যোগ’ ২টি আর্গুমেন্ট চায়, দেওয়া হয়েছে ১টি
১২শ্রেণি ও বস্তু
শ্রেণি নাম { … }। গঠক (constructor) তৈরি(…), পদ্ধতি কাজ নাম(…)। ভেতরে বস্তুকে বলা হয় এটি। উত্তরাধিকার: শ্রেণি সন্তান উর্ধ্ব পিতা; পিতার গঠক উর্ধ্ব(…), পিতার পদ্ধতি উর্ধ্ব.নাম()। গোপন কাজ শুধু সেই শ্রেণির ভেতর থেকে ডাকা যায়। বস্তু বানাতে শ্রেণিকে কাজের মতো ডাকুন, নতুন লাগে না।
শ্রেণি প্রাণী {
তৈরি(নাম) { এটি.নাম = নাম }
কাজ বলো() { ফেরত "{এটি.নাম} ডাকে" }
}
শ্রেণি কুকুর উর্ধ্ব প্রাণী {
তৈরি(নাম, জাত) { উর্ধ্ব(নাম); এটি.জাত = জাত }
কাজ বলো() { ফেরত উর্ধ্ব.বলো() + ": ঘেউ!" }
গোপন কাজ গোপন_কথা() { ফেরত "হাড়" }
কাজ পছন্দ() { ফেরত এটি.গোপন_কথা() }
}
ধরি ট = কুকুর("টমি", "দেশি")
লেখো(ট.বলো(), ট.জাত, ট.পছন্দ())
লেখো(ধরন(ট), ট, কুকুর)
চেষ্টা { ট.গোপন_কথা() } ধরো ত্রু { লেখো(ত্রু) }
টমি ডাকে: ঘেউ! দেশি হাড় কুকুর <কুকুর বস্তু> <শ্রেণি কুকুর> ‘গোপন_কথা’ গোপন, বাইরে থেকে ব্যবহার করা যায় না
পদ্ধতি ডট দিয়ে বের করলে বস্তুর সঙ্গে বাঁধা থাকে: ধরি ফ = ট.বলো; পরে ফ()। পদ্ধতি এটি ফেরত দিলে শৃঙ্খল বানানো যায়: গ.বাড়াও().বাড়াও()।
১৩ত্রুটি সামলানো
ছোড়ো মান যেকোনো মান ছোড়ে (লেখা, মানচিত্র…)। চেষ্টা { … } ধরো নাম { … } তা ধরে। রানটাইম ত্রুটিও ধরা যায়; তখন নাম-এ থাকে বাংলা ত্রুটি বার্তা।
চেষ্টা { ছোড়ো "বিপদ!" } ধরো e { লেখো("ধরা পড়ল:", e) }
চেষ্টা { ছোড়ো {কোড: ৪০৪, বার্তা: "পাওয়া যায়নি"} } ধরো e { লেখো(e.কোড, e.বার্তা) }
চেষ্টা { লেখো([১, ২][৫]) } ধরো e { লেখো(e) }
চেষ্টা { লেখো(১০ / ০) } ধরো e { লেখো(e) }
চেষ্টা { যদি ১ { লেখো("না") } } ধরো e { লেখো(e) }
ধরা পড়ল: বিপদ! ৪০৪ পাওয়া যায়নি সূচক সীমার বাইরে: ৫ (দৈর্ঘ্য ২) শূন্য দিয়ে ভাগ করা যায় না শর্ত অবশ্যই সত্য বা মিথ্যা হতে হবে, পাওয়া গেছে সংখ্যা
১৪ইনপুট, ফাইল ও মডিউল
ধরি নাম = পড়ো("আপনার নাম? ")
লেখো("স্বাগতম, {নাম}!")
আপনার নাম? স্বাগতম, রহিম!
ফাইল_লেখো("নোট.txt", "প্রথম লাইন")
লেখো(ফাইল_পড়ো("নোট.txt"), দৈর্ঘ্য(ফাইল_পড়ো("নোট.txt")))
প্রথম লাইন ১০
মডিউল: আনো
আনো "পথ.shobdo" অন্য ফাইলের সব ঘোষণা বর্তমান প্রোগ্রামে আনে। পথ ধরা হয় বর্তমান ফাইলের ফোল্ডার থেকে। একই ফাইল দুবার আনলে একবারই চলে। ফাইল_অন্তর্ভুক্ত("পথ") ফাইলের লেখা লোড বা কম্পাইলের সময়েই লেখা-ধ্রুবক হিসেবে বসিয়ে দেয়।
// গণিত_সাহায্য.shobdo
কাজ বর্গ(ন) { ফেরত ন * ন }
// মূল.shobdo
আনো "গণিত_সাহায্য.shobdo"
লেখো(বর্গ(৯)) // ৮১
ধ্রুব টেমপ্লেট = ফাইল_অন্তর্ভুক্ত("টেমপ্লেট.txt")
১৫বিল্ট-ইন রেফারেন্স
| কাজ | বিবরণ | উদাহরণ → ফল |
|---|---|---|
লেখো(…) | মানগুলো ফাঁকা দিয়ে জুড়ে নতুন লাইনসহ ছাপে | লেখো("ক", ১) → ক ১ |
ত্রুটি_লেখো(…) | একই, কিন্তু stderr-এ | |
পড়ো(প্রম্পট?) | এক লাইন ইনপুট লেখা হিসেবে | |
দৈর্ঘ্য(x) | লেখা/তালিকা/মানচিত্রের দৈর্ঘ্য | দৈর্ঘ্য("আম") → ২ |
ধরন(x) | ধরনের নাম | ধরন([]) → তালিকা |
লেখা(x) | যেকোনো মান লেখায় | লেখা(৪২) + "!" → ৪২! |
সংখ্যা(x) | লেখা থেকে সংখ্যা (বাংলা অঙ্কও); না পারলে শূন্য | সংখ্যা("৪২") → ৪২ |
ভাগফল(ক, খ) | পূর্ণসংখ্যার ভাগফল (শূন্যের দিকে) | ভাগফল(৭, ২) → ৩ |
কোড(অক্ষর) / অক্ষর(সংখ্যা) | ইউনিকোড কোড-পয়েন্ট ↔ অক্ষর | কোড("ক") → ২৪৫৩ |
ফাইল_পড়ো(পথ) / ফাইল_লেখো(পথ, লেখা) | UTF-8 ফাইল পড়া / লেখা | |
বাইট_লেখো(পথ, বাইট, চালানো_যাবে?) | ০–২৫৫ বাইটের তালিকা ফাইলে লেখে; তৃতীয়টি সত্য হলে এক্সিকিউটেবল (কম্পাইলার এটি দিয়েই বাইনারি লেখে) | |
শা২৫৬(বাইট) | SHA-256 হ্যাশ, ৩২ বাইটের তালিকা | |
ফাইল_অন্তর্ভুক্ত("পথ") | লোড/কম্পাইলের সময় ফাইল লেখা-ধ্রুবক হিসেবে বসায় | |
আর্গুমেন্ট() | কমান্ড লাইনের আর্গুমেন্টের তালিকা | |
বের_হও(কোড?) | প্রোগ্রাম শেষ করে, প্রস্থান কোডসহ |
গণিত মডিউল
গণিত.বর্গমূল, পরম, ভূমি, ছাদ, গোল, সর্বোচ্চ(…), সর্বনিম্ন(…), ঘাত(ক, খ), এলোমেলো() (০ থেকে ১-এর মধ্যে) এবং ধ্রুবক গণিত.পাই।
লেখো(লেখা(৪২) + "!", সংখ্যা("৪২") + ১, সংখ্যা("abc"), কোড("ক"), অক্ষর(২৪৫৩))
লেখো(গণিত.বর্গমূল(১৪৪), গণিত.পরম(-৫), গণিত.সর্বোচ্চ(৩, ৯, ১), গণিত.সর্বনিম্ন(৩, ৯, ১), গণিত.ঘাত(২, ৮))
লেখো(গণিত.ভূমি(৭.৮), গণিত.ছাদ(৭.২), গণিত.গোল(৭.৫), ভাগফল(-৭, ২))
৪২! ৪৩ শূন্য ২৪৫৩ ক ১২ ৫ ৯ ১ ২৫৬ ৭ ৮ ৮ -৩
১৬কীওয়ার্ড তালিকা
কীওয়ার্ড নাম হিসেবে ব্যবহার করা যায় না। সংরক্ষিত শব্দগুলো ভবিষ্যতের জন্য রাখা; এখন এগুলোর কোনো কাজ নেই।
| কীওয়ার্ড | লাতিন | অর্থ | অবস্থা |
|---|---|---|---|
ধরি / ধ্রুব | dhori / dhruba | চলক / ধ্রুবক ঘোষণা | চালু |
যদি / নাহলে | jodi / nahole | শর্ত | চালু |
যতক্ষণ | jotokkhon | while লুপ | চালু |
প্রতিটি … এর মধ্যে | protiti … er moddhe | for-each লুপ | চালু |
থামো / এগোও | thamo / egao | break / continue | চালু |
কাজ / ফেরত | kaj / ferot | ফাংশন / return | চালু |
শ্রেণি / তৈরি / এটি | shreni / toiri / eti | class / constructor / this | চালু |
উর্ধ্ব / গোপন | urdhwo / gopon | পিতা-শ্রেণি (super) / private | চালু |
চেষ্টা / ধরো / ছোড়ো | chesta / dhoro / chhoro | try / catch / throw | চালু |
সত্য / মিথ্যা / শূন্য | shotto / mittha / shunno | true / false / null | চালু |
এবং / অথবা / না | ebong / othoba / na | and / or / not | চালু |
ভিতরে | bhitore | সদস্যপদ (in) | চালু |
আনো | ano | ফাইল আনা (import) | চালু |
অপেক্ষা | — | await-এর জন্য রাখা; এখন কিছু করে না | সংরক্ষিত |
গঠন, মেলাও, থেকে, দাও, অসমকালীন, পুনঃলেখ, স্থির, আচরণ, বাস্তবায়ন | gothon, —, theke, dao, —, punolekh, sthir, achoron, bastobayon | ভবিষ্যতের struct, match, async, override, static, interface ইত্যাদি | সংরক্ষিত |
১৭লাতিন বানান (রোমান হরফে লেখা)
বাংলা কীবোর্ড না থাকলে কীওয়ার্ড লাতিন বানানে লেখা যায়। লেক্সার এগুলো বাংলা শব্দে বদলে নেয়, তাই দুই রকম লেখা হুবহু এক প্রোগ্রাম। lekho ও poro যথাক্রমে লেখো ও পড়ো।
dhori x = 5
jodi x > 3 { lekho("boro") } nahole { lekho("chhoto") }
protiti i er moddhe 1..=2 { lekho(i) }
boro ১ ২
১৮ত্রুটি বার্তার গঠন
সব ত্রুটি বাংলায়, stderr-এ, আর প্রস্থান কোড ১। ইন্টারপ্রেটার, নেটিভ বাইনারি ও স্টুডিও একই গঠন ব্যবহার করে। লাইন ও কলাম নম্বর লাতিন অঙ্কে থাকে।
| ধরন | গঠন |
|---|---|
| সিনট্যাক্স | ত্রুটি (ফাইল) লাইন N, কলাম C: বার্তা + সোর্স লাইন ও ^ চিহ্ন |
| রানটাইম | ত্রুটি (ফাইল) লাইন N: বার্তা |
| অধরা ছোড়া | অধরা ত্রুটি লাইন N: মান |
| খুব গভীর পুনরাবৃত্তি | ত্রুটি (ফাইল): পুনরাবৃত্তি খুব গভীর (স্ট্যাক শেষ) (ইন্টারপ্রেটারে) |
লেখো((১ + ২)
ত্রুটি (case.shobdo) লাইন 2, কলাম 1: ‘)’ আশা করা হয়েছিল, কিন্তু পাওয়া গেছে ফাইলের শেষ 2 | | ^
ধরি গণনা = ১
লেখো(গননা)
ত্রুটি (case.shobdo) লাইন 2: ‘গননা’ নামে কিছু পাওয়া যায়নি। আপনি কি ‘গণনা’ বোঝাতে চেয়েছেন?
ছোড়ো "কিছু ভুল হয়েছে"
অধরা ত্রুটি লাইন 1: কিছু ভুল হয়েছে
১৯নেটিভ কম্পাইলার (শব্দক)
shobdoc নিজেই শব্দ ভাষায় লেখা (self/*.shobdo)। এটি সোর্স থেকে সরাসরি arm64 মেশিন কোড বানিয়ে নিজের Mach-O রাইটার ও নিজের কোড-সিগনেচার দিয়ে বাইনারি লেখে। কোনো অ্যাসেম্বলার, লিংকার, C কম্পাইলার বা codesign লাগে না। প্রোগ্রাম শুধু সিস্টেম কল দিয়ে কার্নেলের সঙ্গে কথা বলে।
| বুটস্ট্র্যাপ ধাপ | কে কম্পাইল করে | ফল |
|---|---|---|
| ০ | TypeScript ইন্টারপ্রেটার কম্পাইলারের সোর্স চালায় | build/shobdoc1 |
| ১ | shobdoc1 (নেটিভ) | build/shobdoc2 |
| ২ | shobdoc2 (নেটিভ) | build/shobdoc3, যা ২-এর সঙ্গে বাইট-বাই-বাইট মেলে |
build/shobdoc self/main.shobdo -o shobdoc # কম্পাইলার নিজেকে আবার বানায়
build/shobdoc প্রোগ্রাম.shobdo -o প্রোগ্রাম
./প্রোগ্রাম
এই পাতার যে উদাহরণে ✓ নেটিভ চিহ্ন আছে, সেটি নেটিভ বাইনারিতেও একই ফল দেয়। শুধু ইন্টারপ্রেটার চিহ্নিতগুলোতে দশমিক আছে, যা নেটিভ কম্পাইলার এখনো সমর্থন করে না।
২০শব্দ স্টুডিও (এডিটর + কম্পাইলার)
একটি পাতায় এডিটর, ইন্টারপ্রেটার ও নিজস্ব কম্পাইলার। সার্ভার বা ইন্টারনেট লাগে না। এখানে খুলুন।
- বাংলা সিনট্যাক্স হাইলাইট, লাইন নম্বর, স্বয়ংক্রিয় ইনডেন্ট
- একাধিক ফাইল ও
আনো; ফাইল ব্রাউজারের স্টোরেজে সংরক্ষিত - ▶ চালাও (ইন্টারপ্রেটার), ⚙ কম্পাইল (arm64 macOS বাইনারি ডাউনলোড), ■ থামাও
- stdin ও আর্গুমেন্ট দেওয়ার ঘর, বাংলা/লাতিন অঙ্ক বদল, ত্রুটির লাইনে ক্লিক করে যাওয়া
| সংস্করণ | খোলা | চালানো | নেটিভ কম্পাইল | বাইনারি চালানো |
|---|---|---|---|---|
| ওয়েব | shobdo-ide.html | হ্যাঁ | হ্যাঁ (ডাউনলোড) | না |
| macOS | Shobdo Studio.app | হ্যাঁ | হ্যাঁ | হ্যাঁ, অ্যাপের ভেতরে |
| Windows | Shobdo-Studio.cmd | হ্যাঁ | হ্যাঁ (arm64 macOS বাইনারি) | না; Windows-এ এখনো পরীক্ষা হয়নি |
২১বর্তমান সীমাবদ্ধতা
- নেটিভ কম্পাইলার শুধু Apple silicon (arm64) macOS-এ চলে; Windows ও Linux কোড-জেনারেটর এখনো নেই।
- নেটিভে শুধু পূর্ণসংখ্যা (৬৩ বিট, সীমা ছাড়ালে ত্রুটি); দশমিক এখনো নেই। ইন্টারপ্রেটার double ব্যবহার করে, যা ২৫৩ পর্যন্ত নিখুঁত।
- নেটিভে এখনো garbage collector নেই।
- রানটাইম ত্রুটিতে শুধু লাইন থাকে, কলাম নয়।
বড়()/ছোট()এখন শুধু ASCII অক্ষরে কাজ করে।অপেক্ষাও অন্যান্য সংরক্ষিত কীওয়ার্ড এখনো কিছু করে না।- খালি
{}রাশি হিসেবে মানচিত্র হয়, ব্লক নয়। - শব্দ ওয়েব ফ্রেমওয়ার্ক, মোবাইল ও ML লাইব্রেরি এখনো পরিকল্পনা পর্যায়ে।