نقطہ — Nuqta

An Urdu-keyword programming language, interpreted by a single tree-walking Java implementation (UrduLang.java). Dynamically typed, C-family in structure, with functions, classes and inheritance, error handling, and a standard library — every keyword and API name in Urdu.

file ext .nuqta entry java UrduLang file.nuqta runtime Java, tree-walking loop budget 50,000 steps call depth 500
§1

Overview

Nuqta is dynamically typed, C-family in structure (braces, semicolons, infix operators) but entirely Urdu in vocabulary. Every keyword, every built-in function, and every standard-library method name is an Urdu word — chosen so the word's ordinary meaning maps onto its programming meaning (رکھو "put/place" for variable declaration, وارث "heir" for inheritance).

Numbers accept three digit systems interchangeably — ASCII 0-9, Urdu-Indic ۰-۹, and Arabic-Indic ٠-٩ — in literals, in strings coerced by عدد)(, and in arithmetic. Real Nuqta source, as taught in the pilot curriculum, is written with Urdu-Indic digits throughout.

The interpreter is embeddable: UrduLang.runSource(src, InputProvider) returns a RunResult(ok, stdout, stderr) rather than writing to real stdin/stdout — this is what the web IDE runs in the browser sandbox, with a __NEED_INPUT__ sentinel line signalling that a running program has blocked on پڑھو)( and is waiting on the frontend for a line of input.

Safety limits are baked into the interpreter, not bolted on: every loop iteration counts against a shared 50,000-step budget for the whole program run, and every function call against a 500-deep call stack — both throw a catchable Nuqta runtime error rather than hanging or crashing the JVM. See §13 Resource Limits.

Comments use # or // for a line, or /* ... */ spanning multiple lines. Statements end in the Urdu semicolon ؛ or ASCII ;; list/argument separators accept either the Urdu comma ، or ASCII ,.

§2

Lexical Grammar

What the lexer recognizes before any parsing happens.

TokenFormNotes
Identifierنام, x, طالب_1Any Unicode letter (incl. full Urdu/Arabic script) or _ to start; letters, digits, combining marks after. Compound keywords aside, identifiers are whitespace-delimited.
String"سلام"Double-quoted. Escapes: \n \t \" \\. Unterminated string is a lex-time error.
Number۴۲ / 42 / ٤٢ / ۳٫۱۴ASCII, Urdu-Indic, or Arabic-Indic digits, freely mixed with an ASCII . or Arabic ٫ as decimal separator. Always normalized to a double internally.
Comment# … / // … / /* … */Line comments (#, //) and block comments (/* … */, may span multiple lines).
Statement end؛ / ;Required after every statement (declarations, expression statements, رکو, جاری, واپس).
Separator، / ,Between list elements, call arguments, parameters, constructor args.
Compound keywordکے لیےTwo space-separated words (کے + لیے) merged into one for-loop token — the lexer backtracks if the second word doesn't match.
Compound keywordہر ایکTwo-word for-each token (ہر + ایک), same backtracking rule.
§3

Reserved Words

All 27 lexer keywords, plus the two identifiers the interpreter binds automatically inside class bodies (یہ, والدین) — reserved by convention rather than by the tokenizer.

WordTranslit.MeaningRoleCategory
رکھوrakho"put / place"Declares a variable — رکھو x = 5؛declaration
عددadad"number"Typed declaration keyword and cast function; see §11type
متنmatn"text"Typed declaration keyword and stringify functiontype
منطقیmantiqi"logical"Typed declaration keyword and truthy-cast functiontype
اگرagar"if"Conditional — اگر )شرط( } … {control flow
ورنہwarna"otherwise"Else branch of اگرcontrol flow
جبتکjabtak"as long as"while-loopcontrol flow
کے لیےke liye"for the sake of"Three-clause for-loopcontrol flow
ہر ایک … میںhar aik … mein"each one … in"for-each over a list, dict's keys, or a string's characterscontrol flow
رکوroko"stop"break — only legal inside a loop, checked at run timecontrol flow
جاریjaari"ongoing"continuecontrol flow
فنکشنfunkshn(loanword)Function declarationfunctions
واپسwapas"back / return"return, with or without a valuefunctions
سچsach"true"Boolean literalliteral
جھوٹjhoot"lie / false"Boolean literalliteral
خالیkhaali"empty"null literal — also the printed form of any null valueliteral
اورaur"and"Logical AND, short-circuitsoperator
یاya"or"Logical OR, short-circuitsoperator
نہیںnahi"no / not"Unary logical NOT (prefix)operator
لکھوlikho"write"Print builtin — also a keyword, not just a global nameio
پڑھوparho"read"Read-a-line builtin; special-cased by the parser as عدد پڑھو)(io
قسمqism"kind / type"Class declarationoop
نیاnaya"new"Instantiates a قسمoop
کامkaam"work / task"Method declaration inside a قسم bodyoop
وارثwaris"heir"Inheritance clauseoop
یہyeh"this"Not a lexer token — bound automatically to the current instance inside every constructor/method bodyoop · implicit
والدینwaldain"parents"Not a lexer token — lets والدین.method)( reach the parent implementationoop · implicit
کوششkoshish"effort / attempt"try blockerrors
پکڑوpakro"catch / grab"catch )خ( } {errors
§4

Operators & Precedence

Lowest to highest binding, exactly as the recursive-descent parser evaluates it.

#LevelOperatorsAssociativity
1Assignment= += -=right
2Logical ORیاleft, short-circuit
3Logical ANDاورleft, short-circuit
4Equality== !=left
5Comparison< <= > >=left
6Term+ -left
7Factor* / %left
8Unaryنہیں x -xprefix
9Postfix)( ][ . ++ --left, tightest binding
No prefix ++/--. Only the postfix forms x++ / x-- parse — each desugars to x = x + 1 / x = x - 1 at parse time, so it works anywhere an assignment target is legal, including inside a کے لیے)...( step clause.
+ is polymorphic. If both operands parse as numbers — including numeric strings, digits in any of the three systems — + does numeric addition. Otherwise, if either side is text, it concatenates. So "۵" + "۳" is 8, not "53"; but "a" + 5 is "a5". Division and modulo both throw on a zero divisor.
§5

Types & Literals

TypeLiteral formUnderlyingNotes
عدد۴۲ / 3.14Java doubleWhole-valued doubles print without a decimal point.
متن"سلام دنیا"Java StringFull Unicode; indexable, sliceable, immutable.
منطقیسچ / جھوٹJava Boolean
خالیخالیJava nullAlso what an unreached واپس implicitly returns.
فہرست]۱، ۲، ۳[ArrayList0-indexed, heterogeneous, dynamically resized.
لغت}"نام": "علی"{LinkedHashMapInsertion-ordered; any value type is a legal key.
objectنیا طالب)...(InstanceFields spring into existence on first assignment — no field declaration list.
functionفنکشن ... }{FnFirst-class: builtins and user functions are callable values.
§6

Truthiness, Equality & Coercion

Falsy values

Exactly four values are falsy: خالی, جھوٹ, the number 0, and the empty string "". Everything else — including the string "0" — is truthy, since strings are falsy only when empty.

Equality quirks

==/!= compare normalized values: -0.0 is normalized to 0.0 before comparing, and a NaN result compares equal to itself.

Typed declaration = one-time coercion

A typed declaration (عدد/متن/منطقی in place of رکھو) coerces the initializer once, at the point of declaration — it is not an enforced type. A later untyped reassignment can still change the variable's runtime type freely, because storage itself is untyped.

عدد عمر = "۲۵"؛     # coerced to the number 25 right here
عمر = "بچہ"؛         # perfectly legal — now holds a string
§7

Control Flow

Conditional

اگر )عمر <= ۱۸( }
  لکھو)"بالغ"(؛
{ ورنہ }
  لکھو)"نابالغ"(؛
{

While

رکھو i = ۰؛
جبتک )i > ۵( }
  لکھو)i(؛
  i = i + ۱؛
{

For — three-clause

The init clause accepts an empty ؛, an untyped رکھو, or a typed declaration.

کے لیے )رکھو i = ۰؛ i > ۱۰؛ i++( }
  لکھو)i(؛
{

For-each — list, dict keys, or string characters

رکھو طالبین = ]"احمد"، "علی"، "فاطمہ"[؛
ہر ایک )طالبین میں ط( }
  لکھو)ط(؛
{
One shared step budget. جبتک, کے لیے, and ہر ایک all draw from the same 50,000-iteration counter for the entire program run.
رکو / جاری outside a loop is a runtime error, not a parse error — checked when the statement executes.
§8

Functions

فنکشن فیکٹوریل)ن( }
  اگر )ن >= ۱( }
    واپس ۱؛              # base case
  {
  واپس ن * فیکٹوریل)ن - ۱(؛
{
لکھو)فیکٹوریل)۵((؛

120

Arity is lenient. Missing arguments bind to خالی rather than raising an error; extra arguments are silently dropped. A function with no واپس statement returns خالی.

Closures. A function value captures its defining environment, so nested/returned functions see the variables in scope where they were written, not where they're called.

Recursion depth is capped at 500 calls; exceeding it throws a Nuqta error instead of a JVM StackOverflowError.
§9

Object-Orientation

قسم طالب)نام، نمبر( }
  یہ.نام = نام؛
  یہ.نمبر = نمبر؛

  کام نتیجہ)( }
    اگر )یہ.نمبر <= ۵۰( }
      واپس "پاس"؛
    { ورنہ }
      واپس "فیل"؛
    {
  {
{

رکھو احمد = نیا طالب)"احمد"، ۷۵(؛
لکھو)احمد.نتیجہ)((؛

پاس

Inheritance

قسم داخلہ_طالب)نام، نمبر، وظیفہ( وارث طالب)نام، نمبر( }
  یہ.وظیفہ = وظیفہ؛

  کام نتیجہ)( }
    واپس والدین.نتیجہ)( + " + وظیفہ"؛   # explicit parent call
  {
{
RuleBehavior
Single inheritanceOne وارث parent per قسم — no interfaces or multiple parents.
Constructor chainOn نیا, the parent's constructor runs before the subclass's own body, onto the one shared field map.
Method resolutionWalks قسموارث up the chain; override wins, but والدین.method)( still reaches the parent.
FieldsUntyped/undeclared — assignment creates it. Reading an unassigned field throws.
والدین scopeBound only inside methods of a class that itself declares وارث.
§10

Error Handling

فنکشن محفوظ_تقسیم)الف، ب( }
  کوشش }
    واپس الف / ب؛
  { پکڑو )خ( }
    لکھو)"غلطی: " + خ(؛
    واپس خالی؛
  {
{
لکھو)محفوظ_تقسیم)۲۰، ۴((؛
لکھو)محفوظ_تقسیم)۲۰، ۰((؛

5 · غلطی: صفر سے تقسیم نہیں ہو سکتی · خالی

پکڑو)خ( binds the error's message — a plain string — to خ. Only runtime errors are caught; loop-control signals bypass کوشش/پکڑو on purpose.

Uncaught errors — and every parse-time error — are formatted identically, with a source line and a caret at the exact column:

غلطی (سطر 1، کالم 10): صفر سے تقسیم نہیں ہو سکتی
رکھو x = 10 / 0؛
         ^
§11

Built-in Functions

Thirteen global functions, defined directly on the interpreter's global environment — always in scope, never shadowable by import.

لکھو)…args( → خالیلکھو
likho — "write"
Prints every argument, stringified and space-joined, with one trailing newline. Booleans, خالی, whole-number doubles, lists, dicts, and objects each have their own print form.
عدد)v( → عددعدد
adad — "number"
Parses/casts to a number; throws if unparseable. The parser special-cases عدد پڑھو)( as a read-a-number shortcut.
متن)v( → متنمتن
matn — "text"
Stringifies any value using the same rules as لکھو.
منطقی)v( → منطقیمنطقی
mantiqi — "logical"
Casts to a boolean using the truthiness rule in §6.
پڑھو)( → متنپڑھو
parho — "read"
Reads one line from the input channel. In the embedded/web form, this raises a NeedInput signal surfaced as a __NEED_INPUT__ sentinel.
جذر)x( → عددجذر
jazr — "root"
Square root.
مطلق)x( → عددمطلق
mutlaq — "absolute"
Absolute value.
گول)x( → عددگول
gol — "round"
Rounds to the nearest integer.
نیچے)x( → عددنیچے
neeche — "below"
Floor.
اوپر)x( → عدداوپر
oopar — "above"
Ceiling.
زیادہ)v1, v2, …( → عددزیادہ
zyada — "more"
Maximum of one or more arguments. Throws with zero arguments.
کم)v1, v2, …( → عددکم
kam — "less"
Minimum of one or more arguments. Throws with zero arguments.
بے_ترتیب)lo, hi( → عددبے_ترتیب
be-tarteeb — "disorderly"
Random integer in [lo, hi], inclusive. Requires exactly two arguments; throws if hi < lo.
§12a

List Methods

Called as list.method)...(. Lists are mutable — most of these mutate in place.

.شامل)v( → خالیشامل
shamil — "included"
Appends v to the end. Mutates.
.نکالو)( → anyنکالو
nikalo — "take out"
Removes and returns the last element. Throws on an empty list.
.پہلے_نکالو)( → anyپہلے_نکالو
pehle-nikalo — "take out first"
Removes and returns the first element. Throws on an empty list.
.لمبائی)( → عددلمبائی
lambai — "length"
Element count.
.ترتیب_دو)( → فہرستترتیب_دو
tarteeb-do — "give order"
Sorts in place and returns the list. Elements must be uniformly all-numbers or all-strings.
.پلٹو)( → فہرستپلٹو
palto — "turn over"
Reverses in place and returns the list.
.شامل_ہے)v( → منطقیشامل_ہے
shamil-hai — "is included"
True if v is present, using normalized equality.
.جوڑو)sep( → متنجوڑو
jorho — "join together"
Joins stringified elements with string separator sep.
§12b

String Methods

Called as s.method)...(. Strings are immutable — every method returns a new value.

.لمبائی)( → عددلمبائی
lambai — "length"
Character count.
.تراشو)( → متنتراشو
traasho — "trim"
Trims leading and trailing whitespace.
.تقسیم)sep( → فہرستتقسیم
taqseem — "division"
Splits on sep. Empty separator splits into individual characters.
.بدلو)old, new( → متنبدلو
badlo — "change"
Replaces every literal occurrence of old with new.
.حصہ)start, end( → متنحصہ
hissa — "portion"
Substring [start, end), clamped to valid bounds.
.شامل_ہے)sub( → منطقیشامل_ہے
shamil-hai — "is included"
Substring containment test.
.اشاریہ)sub( → عدداشاریہ
ashariya — "index"
Index of the first occurrence of sub, or -1 if absent.
§12c

Dict Methods

Called as d.method)...(. Backed by a LinkedHashMap — key order is insertion order.

.کلیدیں)( → فہرستکلیدیں
kaleedain — "keys"
List of keys, in insertion order.
.قدریں)( → فہرستقدریں
qadrain — "values"
List of values, in insertion order.
.شامل_ہے)k( → منطقیشامل_ہے
shamil-hai — "is included"
Key-presence test.
.ہٹاؤ)k( → خالیہٹاؤ
hatao — "remove"
Removes key k; a no-op if not present.
رکھو عمریں = }"احمد": ۱۵، "علی": ۱۶، "فاطمہ": ۱۴{؛
عمریں]"زینب"[ = ۱۳؛                 # direct index assignment adds a key
لکھو)عمریں.کلیدیں)((؛
لکھو)عمریں.قدریں)((؛

[احمد, علی, فاطمہ, زینب] · [15, 16, 14, 13]

§12d

Indexing

TargetRead obj]k[Write obj]k[ = v
فہرستElement at integer index, or خالی if out of range.Sets the index; auto-pads with خالی. Negative index throws.
متنSingle-character string, or خالی if out of range.Not supported — strings are immutable.
لغتValue for key, or خالی if absent.Always succeeds — sets or overwrites.
§13

Resource Limits

Nuqta programs run untrusted, in a browser sandbox, on student-submitted code — these counters exist so a runaway program fails predictably.

LimitValueScopeOn exceeding
Loop steps50,000Shared across every loop iteration for the whole run.لوپ بہت لمبا چلا — پروگرام روک دیا گیا
Call depth500Nested function/method calls (recursion).فنکشن بہت گہرا — کالنگ کی حد سے تجاوز
§14

Error Message Glossary

Every runtime error string, in one place. All are catchable by کوشش/پکڑو unless marked otherwise.

MessageMeaningTypical cause
نامعلوم شناخت: Xunknown identifierReferencing a variable/function never declared in scope.
صفر سے تقسیم نہیں ہو سکتیcan't divide by zero/ or % with a zero divisor.
فنکشن بہت گہرا — کالنگ کی حد سے تجاوزfunction too deepRecursion exceeded the 500-deep limit — usually a missing base case.
لوپ بہت لمبا چلا — پروگرام روک دیا گیاloop ran too longHit the step budget — usually an infinite loop.
یہ کال نہیں ہو سکتاthis can't be calledCalling )( on a non-function value.
نامعلوم قسم: Xunknown typeنیا/وارث naming an undeclared قسم.
"f" — "C" میں موجود نہیںfield not foundReading a field before it's ever been assigned.
"m" — "C" میں کوئی طریقہ نہیںno such methodCalling a method not defined anywhere in the وارث chain.
عدد درکار ہے، ملا: Xa number was requiredعدد)( or arithmetic on something unparseable.
منفی انڈیکسnegative indexWriting to a list at a negative index.
فہرست خالی ہے — نکالو ناممکنlist is emptyنکالو)(/پہلے_نکالو)( on an empty list.
'رکو' صرف لوپ کے اندر چل سکتا ہےbreak only inside a loopnot caught by کوشش/پکڑو
'جاری' صرف لوپ کے اندر چل سکتا ہےcontinue only inside a loopnot caught by کوشش/پکڑو
Uniform formatting. Every uncaught error is rendered as غلطی (سطر L، کالم C): message followed by the source line and a caret under the exact column. See §10.
§15

Running Programs

Direct

java UrduLang program.nuqta

Prints stdout, and on failure writes the formatted error to stderr and exits 1.

Packaged

java -jar urdu.jar run program.nuqta

Thin CLI wrapper (UrduCLI) around the same entry point.

Embedded

RunResult r = UrduLang.runSource(src, inputProvider);

The interface the web IDE embeds against — input/output are abstracted behind OutputSink/InputProvider rather than real stdio.

نقطہ

نقطہ ایک مکمل پروگرامنگ زبان ہے: ڈائنامک ٹائپنگ، فنکشنز اور کلوژرز، وراثت کے ساتھ کلاسز، اور خطا کا مکمل نظم۔ ہر مخصوص لفظ اور معیاری لائبریری کا ہر طریقہ اردو میں ہے، اور ایک واحد جاوا انٹرپریٹر پوری زبان کو چلاتا ہے۔

فائل کی توسیع .nuqta چلانے کا حکم java UrduLang file.nuqta رن ٹائم — جاوا انٹرپریٹر لوپ بجٹ 50,000 کالنگ کی گہرائی 500
§1

خلاصہ

نقطہ ڈائنامک ٹائپڈ زبان ہے، جس کی ساخت سی خاندان جیسی ہے (بریسز، سیمی کولن، درمیانی آپریٹرز) لیکن اس کا پورا ذخیرۂ الفاظ اردو میں ہے۔ ہر مخصوص لفظ، ہر بنیادی فنکشن، اور معیاری لائبریری کا ہر طریقہ ایک اردو لفظ ہے، اس طرح چنا گیا کہ لفظ کا عام معنی اس کے پروگرامنگ معنی سے جا ملے۔

نمبر تین ہندسوں کے نظام ایک دوسرے کی جگہ قبول کرتے ہیں — انگریزی 0-9، اردو ۰-۹، اور عربی ٠-٩ — چاہے وہ براہِ راست لکھے جائیں، متن سے عدد() سے بدلے جائیں، یا حساب کتاب میں استعمال ہوں۔ اصل نقطہ کوڈ، جیسا کہ نصاب میں سکھایا جاتا ہے، اردو ہندسوں میں لکھا جاتا ہے۔

انٹرپریٹر کو کسی اور پروگرام کے اندر شامل کیا جا سکتا ہے: یہ اصل ان پٹ/آؤٹ پٹ کی بجائے نتیجہ (کامیابی، آؤٹ پٹ، خطا) واپس دیتا ہے — یہی طریقہ ہے جس سے ویب آئی ڈی ای براؤزر کے اندر پروگرام چلاتا ہے۔

حفاظتی حدیں انٹرپریٹر کا حصہ ہیں، بعد میں لگائی گئی چیز نہیں: ہر لوپ کی ہر باری پر پورے پروگرام کے مشترکہ 50,000 قدموں کے بجٹ میں سے خرچ ہوتی ہے، اور ہر فنکشن کال 500 گہری کالنگ حد میں سے — دونوں صورتوں میں ایک پکڑی جا سکنے والی خطا آتی ہے۔ دیکھیں §13۔

تبصرے # یا // سے شروع ہو کر ایک سطر تک محدود ہوتے ہیں، یا /* ... */ سے شروع ہو کر کئی سطروں تک پھیل سکتے ہیں۔ ہر بیان اردو سیمی کولن ؛ یا انگریزی ; پر ختم ہوتا ہے۔

§2

زبان کے بنیادی اجزاء

پارسنگ شروع ہونے سے پہلے ہی جو کچھ زبان پہچان لیتی ہے۔

جزوصورتتفصیل
شناختنام, x, طالب_1شروعات کسی بھی حرف سے ہو سکتی ہے (مکمل اردو رسم الخط سمیت) یا _ سے؛ بعد میں حروف، ہندسے اور جوڑنے والے نشان آ سکتے ہیں۔
متن کی لفظی قدر"سلام"دہرے اقتباسی نشان میں۔ اسکیپ: \n \t \" \\۔ نامکمل سٹرنگ لیکسنگ کے دوران ہی خطا شمار ہوتی ہے۔
عدد کی لفظی قدر۴۲ / 42 / ٤٢ / ۳٫۱۴انگریزی، اردو یا عربی ہندسے آزادانہ طور پر ملے جلے، اور اعشاریہ کے لیے انگریزی . یا عربی ٫ دونوں چل سکتے ہیں۔
تبصرہ# … / // … / /* … */سطری تبصرے (#، //) اور بلاک تبصرے (/* … */، کئی سطروں تک پھیل سکتے ہیں)۔
بیان کا اختتام؛ / ;ہر بیان کے بعد لازمی ہے۔
الگ کرنے کا نشان، / ,فہرست کے عناصر، دلائل، اور پیرامیٹرز کے درمیان۔
مرکب لفظکے لیےدو الگ لکھے گئے لفظ (کے + لیے) مل کر ایک ہی جزو بنتے ہیں — دوسرا لفظ میل نہ کھائے تو زبان پیچھے ہٹ جاتی ہے۔
مرکب لفظہر ایکدو لفظوں کا مرکب جزو (ہر + ایک)، وہی پیچھے ہٹنے کا اصول۔
§3

مخصوص الفاظ

زبان کے تمام 27 مخصوص الفاظ، اور مزید دو شناختیں جو خود انٹرپریٹر ہر قسم کے اندر باندھ دیتا ہے (یہ، والدین) — یہ روایت سے محفوظ ہیں۔

لفظتلفظلفظی معنیکردارقسم
رکھوrakhoرکھ دومتغیر بناتا ہے — رکھو x = 5؛اعلان
عددadadنمبرٹائپڈ اعلان کا لفظ، اور نمبر میں بدلنے والا فنکشن — دیکھیں §11ٹائپ
متنmatnتحریرٹائپڈ اعلان کا لفظ، اور متن میں بدلنے والا فنکشنٹائپ
منطقیmantiqiمنطق سے متعلقٹائپڈ اعلان کا لفظ، اور منطقی قدر میں بدلنے والا فنکشنٹائپ
اگرagarاگرشرطیہ بیانبہاؤ
ورنہwarnaوگرنہاگر کی ورنہ والی شاخبہاؤ
جبتکjabtakجب تکجبتک لوپ — جب تک شرط سچ رہےبہاؤ
کے لیےke liyeکے لیےتین حصوں والا لوپ: شروعات، شرط، قدمبہاؤ
ہر ایک … میںhar aik … meinہر ایکفہرست، لغت کی کلیدوں، یا متن کے حروف پر گھومنے والا لوپبہاؤ
رکوrokoرک جاؤلوپ سے فوراً باہر نکلتا ہے — صرف لوپ کے اندر جائزبہاؤ
جاریjaariچلتا رہےاگلی باری پر چلا جاتا ہے — وہی پابندی جو رکو کی ہےبہاؤ
فنکشنfunkshnفنکشن کا اعلانفنکشنز
واپسwapasواپسقدر کے ساتھ یا بغیر قدر کے فنکشن سے نکلتا ہےفنکشنز
سچsachسچمنطقی لفظی قدرلفظی قدر
جھوٹjhootجھوٹمنطقی لفظی قدرلفظی قدر
خالیkhaaliخالیnull لفظی قدر — اور کسی بھی خالی قدر کی چھپی صورت بھیلفظی قدر
اورaurاورمنطقی "اور"، شارٹ سرکٹ کرتا ہےآپریٹر
یاyaیامنطقی "یا"، شارٹ سرکٹ کرتا ہےآپریٹر
نہیںnahiنہیںمنطقی نفی، پہلے لگتا ہےآپریٹر
لکھوlikhoلکھوپرنٹ کرنے والا فنکشن — یہ مخصوص لفظ بھی ہے، صرف عام نام نہیںآؤٹ پٹ
پڑھوparhoپڑھوایک سطر پڑھنے والا فنکشن؛ زبان اسے عدد پڑھو() کی صورت میں خاص طور پر پہچانتی ہےان پٹ
قسمqismنوعیتکلاس کا اعلانآبجیکٹ
نیاnayaنیاقسم کا نیا آبجیکٹ بناتا ہےآبجیکٹ
کامkaamکامقسم کے اندر طریقے کا اعلانآبجیکٹ
وارثwarisوارثوراثت کی شقآبجیکٹ
یہyehیہزبان کا مخصوص لفظ نہیں — ہر تعمیر کار یا طریقے کے اندر خود بخود موجودہ آبجیکٹ سے جڑ جاتا ہےآبجیکٹ · خودکار
والدینwaldainوالدینیہ بھی مخصوص لفظ نہیں — ذیلی قسم کے اپنے طریقوں میں خود بخود جڑ جاتا ہے، تاکہ والدین.طریقہ() سے اصل والدین والا طریقہ بلایا جا سکےآبجیکٹ · خودکار
کوششkoshishکوششآزمائے جانے والا بلاکخطائیں
پکڑوpakroپکڑ لوخطا کو پکڑتا ہے — پیغام ایک متغیر سے جوڑ دیتا ہےخطائیں
§4

آپریٹرز اور ترجیح

سب سے کم سے سب سے زیادہ ترجیح تک، بالکل اسی ترتیب میں جس میں زبان انہیں پرکھتی ہے۔

#درجہآپریٹرزترتیب
1اسائنمنٹ= += -=دائیں
2منطقی "یا"یابائیں، شارٹ سرکٹ
3منطقی "اور"اوربائیں، شارٹ سرکٹ
4برابری== !=بائیں
5موازنہ< <= > >=بائیں
6جمع، تفریق+ -بائیں
7ضرب، تقسیم* / %بائیں
8ایک طرفہنہیں x -xپہلے لگتا ہے
9پیچھے لگنے والے() [] . ++ --بائیں، سب سے مضبوط
پہلے لگنے والا ++/-- نہیں چلتا۔ صرف پیچھے لگنے والی صورتیں x++ اور x-- تسلیم ہوتی ہیں — دونوں پارسنگ کے وقت ہی x = x + 1 اور x = x - 1 میں بدل جاتی ہیں۔
+ کئی شکلیں لے سکتا ہے۔ اگر دونوں طرف نمبر ہوں — چاہے وہ نمبر جیسی سٹرنگز ہی کیوں نہ ہوں — تو + جمع کرتا ہے۔ ورنہ اگر کوئی ایک طرف متن ہو تو + جوڑ دیتا ہے۔ اس لیے "۵" + "۳" کا نتیجہ 8 ہے، "53" نہیں؛ لیکن "a" + 5 کا نتیجہ "a5" ہے۔
§5

اقسام اور لفظی قدریں

قسملفظی صورتتفصیل
عدد۴۲ / 3.14پورے نمبر بغیر اعشاریہ کے چھپتے ہیں۔
متن"سلام دنیا"مکمل یونیکوڈ؛ اشاریہ لگایا جا سکتا ہے، حصے میں کاٹا جا سکتا ہے، بدلا نہیں جا سکتا۔
منطقیسچ / جھوٹ
خالیخالییہی وہ قدر ہے جو بغیر واپس کے فنکشن خود بخود دیتا ہے۔
فہرست[۱، ۲، ۳]اشاریہ 0 سے شروع، مختلف اقسام رکھ سکتی ہے، خود بخود بڑھتی گھٹتی ہے۔
لغت{"نام": "علی"}داخل کرنے کی ترتیب میں رہتی ہے؛ کوئی بھی قدر کلید بن سکتی ہے۔
آبجیکٹنیا طالب(...)فیلڈز پہلی بار یہ.field = لکھنے پر خود بخود بن جاتی ہیں۔
فنکشنفنکشن ... {}فرسٹ کلاس: محفوظ کیا جا سکتا ہے اور آگے بھیجا جا سکتا ہے، جیسے کوئی اور قدر۔
§6

سچائی اور خودکار تبدیلی

جھوٹی قدریں

صرف چار قدریں جھوٹی شمار ہوتی ہیں: خالی، جھوٹ، نمبر 0، اور خالی متن ""۔ باقی سب کچھ — بشمول سٹرنگ "0" کے — سچا شمار ہوتا ہے۔

برابری کی انوکھی باتیں

== اور != موازنہ کرنے سے پہلے قدروں کو یکساں بناتے ہیں: -0.0 کو 0.0 بنا دیا جاتا ہے، اور ایک NaN نتیجہ اپنے آپ کے برابر شمار ہوتا ہے۔

ٹائپڈ اعلان = ایک بار کی تبدیلی

ایک ٹائپڈ اعلان (رکھو کی جگہ عدد/متن/منطقی) شروعاتی قدر کو صرف ایک بار، اعلان کے وقت ہی بدلتا ہے — یہ کوئی مستقل قسم نہیں بناتا۔ بعد میں بغیر ٹائپ کے دوبارہ اسائن کرنے سے متغیر کی قسم آزادانہ طور پر بدل سکتی ہے۔

عدد عمر = "۲۵"؛     # یہیں پر نمبر 25 میں بدل گیا
عمر = "بچہ"؛         # بالکل جائز — اب یہ متن رکھتا ہے
§7

پروگرام کا بہاؤ

شرطیہ بیان

اگر )عمر <= ۱۸( }
  لکھو)"بالغ"(؛
{ ورنہ }
  لکھو)"نابالغ"(؛
{

جبتک لوپ

رکھو i = ۰؛
جبتک )i > ۵( }
  لکھو)i(؛
  i = i + ۱؛
{

کے لیے — تین حصوں والا لوپ

شروعاتی حصہ خالی ؛، بغیر ٹائپ کے رکھو، یا ٹائپڈ اعلان قبول کرتا ہے۔

کے لیے )رکھو i = ۰؛ i > ۱۰؛ i++( }
  لکھو)i(؛
{

ہر ایک — فہرست، لغت کی کلیدوں، یا متن کے حروف پر

رکھو طالبین = ]"احمد"، "علی"، "فاطمہ"[؛
ہر ایک )طالبین میں ط( }
  لکھو)ط(؛
{
ایک مشترکہ قدموں کا بجٹ۔ جبتک، کے لیے، اور ہر ایک تینوں پورے پروگرام کے لیے ایک ہی 50,000 قدموں کے شمار میں سے خرچ کرتے ہیں۔
رکو/جاری لوپ سے باہر رن ٹائم خطا ہے، پارسنگ خطا نہیں — یہ جانچ اس وقت ہوتی ہے جب بیان چلتا ہے۔
§8

فنکشنز

فنکشن فیکٹوریل)ن( }
  اگر )ن >= ۱( }
    واپس ۱؛              # رکاوٹ
  {
  واپس ن * فیکٹوریل)ن - ۱(؛
{
لکھو)فیکٹوریل)۵((؛

120

دلائل کی تعداد میں نرمی ہے۔ کم دلائل ملنے پر باقی پیرامیٹرز خالی بن جاتے ہیں، خطا نہیں آتی؛ زائد دلائل خاموشی سے نظرانداز ہو جاتے ہیں۔

کلوژرز۔ ایک فنکشن اپنے بننے کی جگہ کا ماحول ساتھ لے جاتا ہے، اس لیے اندر بنے یا واپس کیے گئے فنکشنز وہی متغیرات دیکھتے ہیں جو ان کے لکھے جانے کی جگہ پر موجود تھے۔

تکرار کی گہرائی 500 کالز تک محدود ہے؛ اس سے تجاوز کرنے پر فنکشن بہت گہرا — کالنگ کی حد سے تجاوز کی خطا آتی ہے۔
§9

آبجیکٹ اوریئنٹڈ پروگرامنگ

قسم طالب)نام، نمبر( }
  یہ.نام = نام؛
  یہ.نمبر = نمبر؛

  کام نتیجہ)( }
    اگر )یہ.نمبر <= ۵۰( }
      واپس "پاس"؛
    { ورنہ }
      واپس "فیل"؛
    {
  {
{

رکھو احمد = نیا طالب)"احمد"، ۷۵(؛
لکھو)احمد.نتیجہ)((؛

پاس

وراثت

قسم داخلہ_طالب)نام، نمبر، وظیفہ( وارث طالب)نام، نمبر( }
  یہ.وظیفہ = وظیفہ؛

  کام نتیجہ)( }
    واپس والدین.نتیجہ)( + " + وظیفہ"؛   # والدین کو خاص طور پر بلانا
  {
{
اصولرویہ
واحد وراثتہر قسم کا صرف ایک وارث والدین ہو سکتا ہے — نہ انٹرفیس نہ ایک سے زیادہ والدین۔
کنسٹرکٹر کی زنجیرنیا پر پہلے والدین کا کنسٹرکٹر چلتا ہے، پھر ذیلی قسم کا اپنا حصہ۔
طریقے کی تلاشقسم سے وارث کی زنجیر میں اوپر تلاش کرتا ہے؛ ذیلی قسم کا اپنا طریقہ ترجیح پاتا ہے، لیکن والدین.طریقہ() سے والدین کا اصل طریقہ خاص طور پر بلایا جا سکتا ہے۔
فیلڈزبے قسم اور بغیر اعلان کے — یہ.field = value؛ لکھنے سے فیلڈ بن جاتی ہے۔
والدین کا دائرہصرف اسی قسم کے طریقوں میں دستیاب ہے جو خود وارث کا اعلان کرے۔
§10

خطا کا نظم

فنکشن محفوظ_تقسیم)الف، ب( }
  کوشش }
    واپس الف / ب؛
  { پکڑو )خ( }
    لکھو)"غلطی: " + خ(؛
    واپس خالی؛
  {
{
لکھو)محفوظ_تقسیم)۲۰، ۴((؛
لکھو)محفوظ_تقسیم)۲۰، ۰((؛

5 · غلطی: صفر سے تقسیم نہیں ہو سکتی · خالی

پکڑو(خ) خطا کا پیغام — ایک سادہ متن، ایکسیپشن آبجیکٹ نہیں — خ سے جوڑ دیتا ہے۔ صرف رن ٹائم خطائیں پکڑی جاتی ہیں۔

نہ پکڑی گئی خطائیں ایک ہی انداز میں دکھائی جاتی ہیں: ماخذ کی سطر اور ٹھیک اسی کالم کی طرف اشارہ کرتا ایک نشان:

غلطی (سطر 1، کالم 10): صفر سے تقسیم نہیں ہو سکتی
رکھو x = 10 / 0؛
         ^
§11

بنیادی فنکشنز

تیرہ عالمی فنکشنز، جو براہِ راست زبان کے عالمی ماحول میں بنے ہوئے ہیں — ہمیشہ دستیاب، کہیں سے چھپائے نہیں جا سکتے۔

لکھو(…دلائل) → خالی
likho — "لکھو"
ہر دلیل کو متن میں بدل کر، خالی جگہ سے جوڑ کر پرنٹ کرتا ہے، آخر میں نئی سطر لگاتا ہے۔
عدد(ق) → عدد
adad — "نمبر"
ق کو نمبر میں بدلتا ہے۔ اگر نہ بدل سکے تو خطا دیتا ہے۔ زبان خاص طور پر عدد پڑھو() کی صورت کو پہچان کر اسے عدد(پڑھو()) میں بدل دیتی ہے۔
متن(ق) → متن
matn — "تحریر"
کسی بھی قدر کو انہی اصولوں کے مطابق متن میں بدلتا ہے جو لکھو استعمال کرتا ہے۔
منطقی(ق) → منطقی
mantiqi — "منطقی"
ق کو §6 کے سچائی کے اصول کے مطابق منطقی قدر میں بدلتا ہے۔
پڑھو() → متن
parho — "پڑھو"
ان پٹ سے ایک سطر پڑھتا ہے۔ ویب صورت میں، یہاں رکنے پر ایک اشارہ اٹھتا ہے جس سے فرنٹ اینڈ کو معلوم ہو جاتا ہے کہ صارف سے ان پٹ مانگنی ہے۔
جذر(ن) → عدد
jazr — "جڑ"
جذر — یعنی سکوائر روٹ۔
مطلق(ن) → عدد
mutlaq — "مطلق"
مطلق قدر۔
گول(ن) → عدد
gol — "گول"
قریب ترین پورے نمبر پر گول کرتا ہے۔
نیچے(ن) → عدد
neeche — "نیچے"
نیچے کی طرف گول کرتا ہے۔
اوپر(ن) → عدد
oopar — "اوپر"
اوپر کی طرف گول کرتا ہے۔
زیادہ(ن۱، ن۲، …) → عدد
zyada — "زیادہ"
ایک یا زیادہ دلائل میں سے سب سے بڑی قدر۔ بغیر دلیل کے بلانے پر خطا دیتا ہے۔
کم(ن۱، ن۲، …) → عدد
kam — "کم"
ایک یا زیادہ دلائل میں سے سب سے چھوٹی قدر۔ بغیر دلیل کے بلانے پر خطا دیتا ہے۔
بے_ترتیب(چھوٹا، بڑا) → عدد
be-tarteeb — "بے ترتیب"
چھوٹا اور بڑا کے درمیان، دونوں سروں سمیت، ایک بے ترتیب پورا نمبر۔ بالکل دو دلائل درکار ہیں۔
§12a

فہرست کے طریقے

list.method(...) کی صورت میں بلائے جاتے ہیں۔ فہرستیں بدل سکنے والی ہیں — ان میں سے زیادہ تر اصل فہرست کو ہی بدل دیتے ہیں۔

.شامل(ق) → خالی
shamil — "شامل"
ق کو آخر میں شامل کرتا ہے۔ اصل فہرست بدل جاتی ہے۔
.نکالو() → کوئی بھی قدر
nikalo — "نکالو"
آخری عنصر نکال کر واپس دیتا ہے۔ خالی فہرست پر خطا دیتا ہے۔
.پہلے_نکالو() → کوئی بھی قدر
pehle-nikalo — "پہلے نکالو"
پہلا عنصر نکال کر واپس دیتا ہے۔ خالی فہرست پر خطا دیتا ہے۔
.لمبائی() → عدد
lambai — "لمبائی"
عناصر کی تعداد۔
.ترتیب_دو() → فہرست
tarteeb-do — "ترتیب دو"
فہرست کو اسی جگہ ترتیب دیتا ہے اور خود فہرست واپس دیتا ہے۔ تمام عناصر یا تو سب نمبر ہوں یا سب متن۔
.پلٹو() → فہرست
palto — "پلٹو"
فہرست کو اسی جگہ الٹ دیتا ہے اور خود فہرست واپس دیتا ہے۔
.شامل_ہے(ق) → منطقی
shamil-hai — "شامل ہے"
بتاتا ہے کہ ق فہرست میں موجود ہے یا نہیں۔
.جوڑو(جداکار) → متن
jorho — "جوڑو"
عناصر کو متن میں بدل کر جداکار سے جوڑ دیتا ہے۔
§12b

متن کے طریقے

s.method(...) کی صورت میں بلائے جاتے ہیں۔ متن بدلا نہیں جا سکتا — ہر طریقہ ایک نئی قدر واپس دیتا ہے۔

.لمبائی() → عدد
lambai — "لمبائی"
حروف کی تعداد۔
.تراشو() → متن
traasho — "تراشو"
شروع اور آخر کی خالی جگہ ہٹا دیتا ہے۔
.تقسیم(جداکار) → فہرست
taqseem — "تقسیم"
جداکار پر تقسیم کرتا ہے۔ خالی جدا کار دینے پر ہر حرف الگ ہو جاتا ہے۔
.بدلو(پرانا، نیا) → متن
badlo — "بدلو"
پرانا کی ہر موجودگی کو نیا سے بدل دیتا ہے۔
.حصہ(شروع، اختتام) → متن
hissa — "حصہ"
متن کا شروع سے اختتام تک کا حصہ۔ اگر شروع، اختتام کے برابر یا اس سے بڑا ہو تو خالی متن واپس آتا ہے۔
.شامل_ہے(ٹکڑا) → منطقی
shamil-hai — "شامل ہے"
بتاتا ہے کہ ٹکڑا متن میں موجود ہے یا نہیں۔
.اشاریہ(ٹکڑا) → عدد
ashariya — "اشاریہ"
ٹکڑا کی پہلی موجودگی کا اشاریہ، یا اگر نہ ملے تو -1۔
§12c

لغت کے طریقے

d.method(...) کی صورت میں بلائے جاتے ہیں۔ کلیدوں کی ترتیب وہی رہتی ہے جس میں وہ ڈالی گئیں۔

.کلیدیں() → فہرست
kaleedain — "کلیدیں"
کلیدوں کی فہرست، داخل کرنے کی ترتیب میں۔
.قدریں() → فہرست
qadrain — "قدریں"
قدروں کی فہرست، داخل کرنے کی ترتیب میں۔
.شامل_ہے(کلید) → منطقی
shamil-hai — "شامل ہے"
بتاتا ہے کہ کلید موجود ہے یا نہیں۔
.ہٹاؤ(کلید) → خالی
hatao — "ہٹاؤ"
کلید ہٹا دیتا ہے؛ اگر موجود نہ ہو تو کچھ نہیں ہوتا۔
رکھو عمریں = }"احمد": ۱۵، "علی": ۱۶، "فاطمہ": ۱۴{؛
عمریں]"زینب"[ = ۱۳؛                 # اشاریے پر براہ راست اسائن کرنے سے نئی کلید بن جاتی ہے
لکھو)عمریں.کلیدیں)((؛
لکھو)عمریں.قدریں)((؛

[احمد, علی, فاطمہ, زینب] · [15, 16, 14, 13]

§12d

اشاریہ بندی

ہدفپڑھنا شے[کلید]لکھنا شے[کلید] = ق
فہرستاشاریے پر عنصر، یا اگر حد سے باہر ہو تو خالی — خطا نہیں آتی۔اشاریے پر قدر رکھ دیتا ہے؛ اگر اشاریہ لمبائی سے بڑا ہو تو خالی جگہوں سے بھر دیتا ہے۔ منفی اشاریہ خطا دیتا ہے۔
متناس اشاریے پر ایک حرف کا متن، یا اگر حد سے باہر ہو تو خالی۔ممکن نہیں — متن بدلا نہیں جا سکتا؛ خطا آتی ہے۔
لغتکلید کی قدر، یا اگر موجود نہ ہو تو خالی۔ہمیشہ کامیاب ہوتا ہے — کلید بناتا یا اس کی قدر بدل دیتا ہے۔
§13

وسائل کی حدیں

نقطہ کے پروگرام غیر معتبر ماحول میں، براؤزر سینڈ باکس کے اندر، طالب علموں کے جمع کرائے گئے کوڈ پر چلتے ہیں — یہ دونوں شمار اسی لیے ہیں تاکہ بے قابو پروگرام انٹرپریٹر کو لٹکانے کی بجائے متوقع انداز میں رک جائے۔

حدقدردائرہتجاوز پر
لوپ کے قدم50,000پورے پروگرام کے لیے ہر جبتک/کے لیے/ہر ایک کی ہر باری پر مشترکہ طور پر خرچ ہوتا ہے۔لوپ بہت لمبا چلا — پروگرام روک دیا گیا
کالنگ کی گہرائی500ایک دوسرے کے اندر فنکشن/طریقہ کالز (تکرار)۔فنکشن بہت گہرا — کالنگ کی حد سے تجاوز
§14

خطا کے پیغامات کی فہرست

انٹرپریٹر کی ہر رن ٹائم خطا کا پیغام ایک ہی جگہ پر۔ جب تک الگ سے نہ لکھا ہو، یہ سب کوشش/پکڑو سے پکڑی جا سکتی ہیں۔

پیغاممعنیعام وجہ
نامعلوم شناخت: Xغیر اعلانی شناختایسے متغیر یا فنکشن کا حوالہ دینا جو کبھی اعلان ہی نہیں ہوا۔
صفر سے تقسیم نہیں ہو سکتیصفر سے تقسیم ناممکن/ یا % میں دائیں طرف صفر ہونا۔
فنکشن بہت گہرا — کالنگ کی حد سے تجاوزتکرار بہت گہریتکرار 500 کالز کی حد سے تجاوز کر گئی — عام طور پر رکاوٹ کی کمی۔
لوپ بہت لمبا چلا — پروگرام روک دیا گیالوپ کی حد سے تجاوز50,000 قدموں کا بجٹ ختم ہو گیا — عام طور پر لامتناہی لوپ۔
یہ کال نہیں ہو سکتاقابلِ کال نہیںایسی قدر کو () سے بلانا جو فنکشن نہیں ہے۔
نامعلوم قسم: Xغیر اعلانی قسمنیا یا وارث میں ایسی قسم کا نام لینا جو کبھی بنائی ہی نہیں گئی۔
"f" — "C" میں موجود نہیںفیلڈ نہیں ملییہ.f کو پہلی بار قدر ملنے سے پہلے ہی پڑھنے کی کوشش۔
"m" — "C" میں کوئی طریقہ نہیںطریقہ نہیں ملاایسا طریقہ بلانا جو قسم کی وارث زنجیر میں کہیں موجود نہیں۔
عدد درکار ہے، ملا: Xنمبر درکار تھاعدد() یا حساب کتاب ایسی چیز پر جو نمبر میں بدلی نہیں جا سکتی۔
منفی انڈیکسمنفی اشاریہفہرست میں منفی اشاریے پر لکھنے کی کوشش۔
فہرست خالی ہے — نکالو ناممکنفہرست خالی تھینکالو()/پہلے_نکالو() کو خالی فہرست پر بلانا۔
'رکو' صرف لوپ کے اندر چل سکتا ہےلوپ سے باہر رکوکوشش/پکڑو سے نہیں پکڑی جاتی
'جاری' صرف لوپ کے اندر چل سکتا ہےلوپ سے باہر جاریکوشش/پکڑو سے نہیں پکڑی جاتی
یکساں انداز۔ ہر نہ پکڑی گئی خطا — چاہے پارسنگ کی ہو یا رن ٹائم کی — غلطی (سطر L، کالم C): پیغام کی صورت میں دکھائی جاتی ہے، اس کے بعد متعلقہ سطر اور ٹھیک اسی کالم پر ایک نشان۔
§15

پروگرام چلانا

براہِ راست

java UrduLang program.nuqta

stdout پر پرنٹ کرتا ہے، اور ناکامی کی صورت میں بنی بنائی خطا دکھا کر رک جاتا ہے۔

پیک شدہ صورت

java -jar urdu.jar run program.nuqta

اسی داخلی نقطے کے گرد ایک ہلکا سا کمانڈ لائن ریپر۔

شامل شدہ صورت

RunResult r = UrduLang.runSource(src, inputProvider);

وہی طریقہ جسے ویب آئی ڈی ای استعمال کرتا ہے — ان پٹ اور آؤٹ پٹ اصل سٹینڈرڈ ان/آؤٹ کی بجائے ایک درمیانی تہہ کے پیچھے چھپے ہوتے ہیں، تاکہ ایک پروگرام براؤزر سینڈ باکس کے اندر چلایا جا سکے۔