millionchart
English

نحو و چیدمان

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

اسکریپت یک فایل متنی است. هر دستور در یک خط می‌آید و تورفتگی هر خط می‌گوید آن خط به کدام بلوک تعلق دارد. این صفحه دربارهٔ شکل ظاهری متن است؛ اینکه دستورها چه معنایی دارند در صفحه‌های بعدی آمده است.

هر دستور در یک خط#

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

Cuprel
// The first line of code is the header; everything after it is the body.
indicator "Layout"
    edition = 1
    display = price

let average = tech.sma(close, 20)
let above = close > average

mut tint = color.gray
if above
    tint = color.green
else
    tint = color.red

plot(close, name = "Close", color = tint)

خط خالی فقط برای خود شماست. در چیدمان استاندارد، چند خط خالی پشت‌سرهم به یک خط خالی کم می‌شود و اول بلوک یا اول فایل هیچ خط خالی‌ای نمی‌ماند.

دستور دوم در همان خط پذیرفته نمی‌شود:

Cuprel · خطا E2005
indicator "Two on a line"
    edition = 1
let a = 1; let b = 2
plot(a + b)

بلوک‌ها با تورفتگی ساخته می‌شوند#

خط‌هایی که زیر if، for، while، match یا یک تابع می‌آیند، اگر یک سطح بیشتر تورفتگی داشته باشند به آن تعلق دارند. هر سطح می‌تواند هر تعداد فاصله باشد، به شرط اینکه در کل فایل یکدست باشد؛ قالب‌بند چهار فاصله می‌گذارد. تب در تورفتگی خطاست (E1002)، پس ویرایشگر خود را روی گذاشتن فاصله به‌جای تب تنظیم کنید.

خطی که به عرضی برگردد که هیچ بلوک بازی آن عرض را ندارد، خطاست:

Cuprel · خطا E1005
indicator "Uneven blocks"
    edition = 1
if close > open
        plot(1)
    plot(2)

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

کامنت‌ها#

// کامنتی را شروع می‌کند که تا انتهای خط ادامه دارد. وقتی اسکریپت به چیدمان استاندارد بازنویسی می‌شود، کامنت هرگز حذف یا جابه‌جا نمی‌شود.

/// قبل از یک input راهنمای کوچک آن تنظیم است، یعنی متنی که پنل تنظیمات وقتی نشانگر را روی آن ببرید نشان می‌دهد:

Cuprel
indicator "Documented input"
    edition = 1

/// How many bars the average looks at
input length: int = 20, name = "Length", min = 1
plot(tech.sma(close, length))

خط‌های بلند#

وقتی خطی هنوز نمی‌تواند تمام شود، به خط بعدی ادامه پیدا می‌کند:

  • یک پرانتز یا کروشه ( و [ هنوز باز است؛ این روش معمول برای چیدن فراخوانی با آرگومان‌های زیاد است؛
  • خط به یک عملگر، یک ویرگول، =، یک . یا یکی از واژه‌های and، or و not ختم می‌شود؛
  • خط بعدی با and، or، *، /، %، یک مقایسه یا ?? شروع می‌شود و تورفتگی بیشتری دارد.
Cuprel
indicator "Long conditions"
    edition = 1
    display = price

let average = tech.sma(close, 20)
let usual_volume = tech.sma(volume, 20)
let usual_range = tech.atr(14)
let strong = close > open
    and close > average
    and volume > usual_volume
    and high - low > usual_range * 1.5
plot(if strong then close else na, name = "Strong bars")

خطی که با + یا - شروع شود دستور تازه است و ادامهٔ خط قبل حساب نمی‌شود. عملگر را آخر خط قبلی بگذارید.

نام‌ها#

نام با یک حرف یا _ شروع می‌شود و با حرف، رقم، _ و نیم‌فاصله (همان نویسهٔ نامرئی که فارسی داخل واژه‌ها به کار می‌برد) ادامه پیدا می‌کند. حرف هر الفبایی پذیرفته است، پس می‌توانید نام را به زبان خودتان بنویسید:

Cuprel
indicator "Names in Persian"
    edition = 1
    display = price

input طول: int = 20, name = "Length", min = 1
let میانگین = tech.sma(close, طول)
plot(میانگین, name = "Average")

نام به بزرگی و کوچکی حروف حساس است. Close و close دو نام جدا هستند و فقط close قیمت است.

رقم‌های فارسی و عربی، ویرگول عربی و گیومه‌های خمیده شبیه همتای ASCII خودشان‌اند، ولی همان نیستند. این‌ها هرگز بی‌صدا خوانده نمی‌شوند: هر کدام خطایی می‌دهد که نویسهٔ ASCII جایگزین را نام می‌برد و همان جایگزین را به‌صورت اصلاح پیشنهاد می‌کند.

Cuprel · خطا E1011
indicator "Persian digit"
    edition = 1
input length: int = ۲۰, name = "Length"
plot(tech.sma(close, length))

واژه‌های دارای معنا#

بعضی واژه‌ها را نمی‌شود به‌عنوان نام به کار برد:

let input fn type enum import export module if else for while break continue match return and or not true false na

واژه‌های دیگر فقط در یک جا معنای ویژه دارند و در بقیهٔ جاها نام معمولی‌اند: mut state uses session group then to until by as live in show_if check on. می‌توانید متغیری به نام session داشته باشید؛ ولی در جایی که انتظار تعریف session می‌رود، این واژه همان تعریف را می‌رساند.

نام یک سری داخلی مثل close را می‌شود برای متغیر خودتان به کار برد. آن‌وقت در همان اسکریپت close یعنی متغیر شما و قیمت دیگر در دسترس نیست؛ برای همین بررسی‌کننده اخطار می‌دهد (W-SHADOW-BUILTIN). نام یک تابع مثل plot را هم می‌شود برای متغیر دوباره به کار برد، بدون اینکه تابع از بین برود: plot(close) هنوز رسم می‌کند، اما اخطار هست چون خواننده نمی‌تواند این دو را از هم تشخیص دهد.

یک خط، یک فکر#

اگر خطی برای خواندن زیادی بلند است، به‌جای کش دادنش، بخشی از آن را با let نام بدهید. نام در زمان اجرا هیچ هزینه‌ای ندارد و تنها مستنداتی است که یک اسکریپت حتماً دارد.

نگاه کنید به: مقدارها و نوع‌ها، متغیرها، اشتباه‌های رایج.