مستندات PSScript / مرجع

مرجع زبان

هر آنچه تجزیه‌گر و ماشین مجازی می‌پذیرند: قواعد واژگانی، مقادیر، متغیرها، عملگرها، کنترل جریان و مدیریت خطای ساخت‌یافته.

کامنت‌ها

هر دو شکل کامنتِ سبک C پشتیبانی می‌شوند و توسط واژه‌گر نادیده گرفته می‌شوند:

// line comment — runs to end of line

/* block comment
   spanning multiple lines */

مقادیر ثابت

نوعنمونه‌هایادداشت‌ها
Int 0, 42, 100 عدد صحیح ۶۴ بیتیِ علامت‌دار.
Float 2.45, 149.99 عدد ممیز شناور ۶۴ بیتی؛ یک مقدار ثابت به‌محض داشتن «.» اعشاری محسوب می‌شود.
String "Hello" داخل دابل‌کوتیشن؛ نمی‌تواند چندخطی باشد.
Bool true, false  
Null null مقدار غایب / تهی.
Map {} یک مقدار ثابتِ نگاشتِ خالی؛ آن را با انتساب اندیس‌دار پر کنید.

گریزهای رشته

درون یک مقدار ثابتِ رشته، بک‌اسلش این گریزها را معرفی می‌کند:

گریزتولید می‌کند
\nخط جدید
\tتب
\\بک‌اسلش
\"دابل‌کوتیشن
\{   \}آکولادهای واقعی (کنار جای‌نگه‌دارهای {} در لاگ مفید است)

متغیرها

یک متغیر محلی را با var تعریف کنید. متغیرها دامنهٔ بلوکی در بدنهٔ main یا rollback دارند و پویا-نوع‌اند — یک نام صرفاً هر مقداری را که آخرین‌بار به آن انتساب شده نگه می‌دارد.

var token   = util$.uuid();
var total   = 149.99;
var summary = {};          // empty map

total = total + 10;        // reassignment
دستورها با ; پایان می‌یابند هر دستورِ تعریف، انتساب و فراخوانی با یک نقطه‌ویرگول پایان می‌یابد.

نگاشت‌ها و اندیس‌گذاری

نگاشت مجموعه‌ای با کلیدهای رشته‌ای است. یکی را با {} بسازید، سپس اعضا را با عملگر اندیس [ ] بخوانید و بنویسید. خواندن کلید موجود نبودن null می‌دهد. کلیدهای عددی به شکل رشته‌ای‌شان تبدیل می‌شوند.

var item = {};
item["name"]  = "Pencil";
item["price"] = 2.45;

context$.log("name = {}", item["name"]);   // Pencil
context$.log("qty  = {}", item["qty"]);     // null (absent)

اندیس‌گذاری برای دادهٔ تودرتو زنجیر می‌شود، برای نمونه خواندن پارامترهای ورودیِ تودرتو:

context$.log("A.B = {}", param$["A"]["B"]);

عملگرها

حسابی

عملگرهای + - * / روی اعداد کار می‌کنند. دو عدد صحیح یک عدد صحیح می‌دهند (برای / تقسیم صحیح)؛ اگر هر طرف اعشاری باشد نتیجه اعشاری است. تقسیم یک عدد صحیح بر 0 خطای زمان اجرا ایجاد می‌کند. حساب روی غیرعددها خطاست.

مقایسه

عملگرهای < > <= >= دو عدد را مقایسه می‌کنند و یک مقدار بولی می‌دهند. مقایسهٔ غیرعددها خطاست.

برابری

عملگرهای == و != میان انواع اسکالر کار می‌کنند. اعداد بر اساس مقدار مقایسه می‌شوند (‏1 == 1.0 برابر true است)؛ رشته‌ها، بولی‌ها و null ساختاری مقایسه می‌شوند. انواع ناهمخوان (مثلاً یک رشته و یک عدد) صرفاً نابرابرند نه خطا — همین باعث می‌شود نگهبان رایج x == null روی هر مقداری امن باشد.

if (model == null) {
    model = PSEntity(className);
    model.identifier(idn);
}

درست‌نمایی

شرط‌ها در if و for از نظر درست‌نمایی ارزیابی می‌شوند: null و false نادرست‌نما هستند؛ هر مقدار دیگری درست‌نماست (از جمله 0 و رشته‌های خالی).

کنترل جریان

if

یک شرط درون پرانتز که پس از آن یک بلوک می‌آید. بلوک هنگامی اجرا می‌شود که شرط درست‌نما باشد.

if (count > 100) {
    router$.allow("bulk_connector");
}
بدون شرط else PSScript شرط else ندارد. حالت‌های جایگزین را با یک if دوم روی شرط معکوس بیان کنید.

for

یک حلقهٔ شمارشیِ سبک C: مقداردهی اولیه، شرط، به‌روزرسانی و سپس یک بدنه.

for (var i = 0; i < 50; i = i + 1) {
    var e = PSEntity("com.paradicshift.test.GISTempData");
    e.identifier("GIS-TEMP-%s".formatted(util$.uuid()));
    data$.persist(e);
}

مدیریت خطا

کار خطاپذیر را در try بپیچید. یک خطای زمان اجرا درون بلوک try به catch می‌پرد و پیام خطا (یک رشته) را به متغیر نام‌برده مقید می‌کند. یک بلوک finally، در صورت وجود، همیشه آخر اجرا می‌شود — هنگام موفقیت، هنگام خطای گرفته‌شده، یا هنگام انتشار خطای گرفته‌نشده.

try {
    context$.log("Starting risky step.");
    data$.persist({});                 // throws: not an entity
    context$.log("skipped on error");
} catch (err) {
    context$.log("The step failed: {}", err);
    output$["status"] = "handled";
} finally {
    context$.log("Cleanup always runs.");
}
قاعده پس از یک try باید یک بلوک catch، یک بلوک finally، یا هر دو بیاید. متغیر catch متن خطا را با قالب runtime: … یا host error: … نگه می‌دارد.

متدهای رشته

رشته‌ها دو متد درون‌ساخت دارند.

.replace(from, to)

یک رونوشت برمی‌گرداند که در آن هر رخداد from با to جایگزین شده است.

var s = "Hello {a}";
context$.log("{}", s.replace("{a}", "abc"));   // Hello abc

.formatted(args…)

یک قالب‌ساز به سبک printf. هر مشخص‌گر آرگومان بعدی را به‌ترتیب مصرف می‌کند:

مشخص‌گرمعنی
%sمقدار به‌صورت رشته
%Sمقدار به‌صورت رشتهٔ بزرگ‌حرف
%dعدد صحیح (اعشاریِ مقدارِ صحیح هم پذیرفته می‌شود)
%fعدد (صحیح یا اعشاری)
%btrue / false بر اساس درست‌نمایی
%%یک علامت درصدِ واقعی
var url = "%s/icons/%s.svg".formatted(baseURL, name);
e.gis("location", "POINT(%f %f)".formatted(lon, lat));
دو راه برای درج مقدار ‏context$.log() از جای‌نگه‌دارهای موقعیتی {} استفاده می‌کند؛ ‏.formatted() از مشخص‌گرهای نوع‌دار % استفاده می‌کند. هرگاه به خودِ رشتهٔ قالب‌بندی‌شده به‌عنوان مقدار نیاز داشتید سراغ .formatted() بروید.