ماژولها و کتابخانهها
تابعها و رکوردهایی را که دوباره به کار میبرید در یک ماژول بگذارید، با شمارهٔ نسخه در اسکریپتهای دیگر import کنید، و قاعدههای چرخه، نام و سقفها را بدانید.
وقتی یک تابع در سه اسکریپت تکرار میشود، آن را به یک ماژول ببرید. ماژول اسکریپتی است که کارش import شدن است: خودش چیزی رسم نمیکند، فقط نامهایی را export میکند. اسکریپتهای دیگر آن را import میکنند و آنچه را export کرده صدا میزنند.
نوشتن یک ماژول#
ماژول بهجای indicator "Name" با module Name شروع میشود. هر چیزی که export شده باشد قابل import است؛ بقیه خصوصی است.
// A module: a running mean kept in a record. Other scripts import it by name and version.
module Stats
edition = 1
export type Stats
n: int = 0
total: float = 0
export fn Stats.add(self: Stats, x: float)
self.n += 1
self.total += x
export fn Stats.mean(self: Stats): float = if self.n > 0 then self.total / self.n else naماژول خودش چیزی رسم نمیکند، برای همین بهتنهایی نمیتواند روی نمودار اجرا شود: موتور آن را با این پیام رد میکند: This is a library: other scripts import it; it does not draw on its own.
import کردن آن#
import Owner/Name@version as alias یک ماژول را به اسکریپت میآورد. در این انتشار فقط ماژولهای خودتان را میشود import کرد: مالک Me نوشته میشود (موتور ماژول را با نامش پیدا میکند و به مالک نگاه نمیکند)، نام همان نام ماژول است، و نسخه 1 نوشته میشود. alias راهی است که با آن به آنچه ماژول export کرده میرسید.
// Using the module: the running mean of every close so far, drawn next to the close.
indicator "Running mean"
edition = 1
display = price
import Me/Stats@1 as mu
state stats = mu.Stats(n = 0)
stats.add(close)
plot(stats.mean(), name = "Mean of every close so far", color = color.orange)
plot(close, name = "Close", color = color.gray)mu.Stats(n = 0)با نام بردن فیلدها، یک رکورد از نوع import شده میسازد.stats.add(close)وstats.mean()متدهایی را صدا میزنند که ماژول export کرده است.- ماژول برای هر import با حافظهٔ جداگانه اجرا میشود: دو اسکریپتی که آن را import میکنند حالت (state) مشترک ندارند.
import بدون شمارهٔ نسخه رد میشود:
indicator "An import with no version"
edition = 1
import Me/Stats as mu
plot(close)قاعدهها#
- نسخهها. شمارهٔ نسخه در متن import لازم است. ماژول در این انتشار نسخهٔ دومی ندارد:
@1را بنویسید. - نامها. اگر نامی را به کار ببرید که ماژول export نکرده، خطا
E3172است. فقط تابعها، رکوردها و enumهایی کهexportشدهاند دیده میشوند. - بدون چرخه. ماژول نباید خودش را import کند، چه مستقیم و چه از راه ماژولهای دیگر. خطا
E-IMPORT-CYCLEاست و پیام زنجیره را نام میبرد، مثلa -> b -> a. - ماژولی که وجود ندارد. import کردن ماژولی که ندارید خطایی میدهد که نام کتابخانه را میآورد.
سقفها#
ماژولها پیش از کامپایل محدود میشوند:
| سقف | مقدار |
|---|---|
| ماژولهایی که ماژول import میکنند، تا چه عمقی | 8 |
| importهایی که برای یک اسکریپت کامپایل میشوند، با احتساب آنهایی که داخل ماژولاند | 64 |
| کاراکترهای متن ماژول که برای یک اسکریپت کامپایل میشوند | 1,000,000 |
اسکریپتهای واقعی یک سطح و چند import دارند. اگر از یک سقف بگذرید اسکریپت با E-IMPORT-DEPTH، E-IMPORT-COUNT یا E-IMPORT-SIZE متوقف میشود و سقفی را که رد شده نام میبرد.
نگاه کنید به: تابعها، نوعها و enumها، سقفها و بودجهٔ اجرا.