millionchart
English

ماژول‌ها و کتابخانه‌ها

تابع‌ها و رکوردهایی را که دوباره به کار می‌برید در یک ماژول بگذارید، با شمارهٔ نسخه در اسکریپت‌های دیگر import کنید، و قاعده‌های چرخه، نام و سقف‌ها را بدانید.

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

نوشتن یک ماژول#

ماژول به‌جای indicator "Name" با module Name شروع می‌شود. هر چیزی که export شده باشد قابل import است؛ بقیه خصوصی است.

Cuprel
// 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 کرده می‌رسید.

Cuprel
// 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 بدون شمارهٔ نسخه رد می‌شود:

Cuprel · خطا E2070
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‌ها، سقف‌ها و بودجهٔ اجرا.